Android廣播receiver

Android廣播receiver

    安卓四大組件之一接受者receiver是安卓必不可少的組成部分。

廣播接收者BroadcastReceiver的運用

系統廣播

    創建一個自己的CallBroadcastReceiver繼承BroadcastReceiver,然後在onReceive(Context context,Intent intent)方法中去接收廣播。

    

	public void onReceive(Context context, Intent intent) {
		abortBroadcast();//中斷廣播
		String action = intent.getAction();
		if( "android.intent.action.NEW_OUTGOING_CALL".equals(action) ){
			String resultData = getResultData();
			if( "123".equals(resultData) ){
				setResultData("456");
			}
			System.out.println(resultData);
			Toast.makeText(context, "call", Toast.LENGTH_SHORT).show();
		}else if("android.intent.action.PACKAGE_INSTALL".equals(action)){
			System.out.println("PACKAGE_INSTALL");
			Toast.makeText(context, "PACKAGE_INSTALL", Toast.LENGTH_SHORT).show();
		}else if("android.intent.action.PACKAGE_ADDED".equals(action)){
			System.out.println("PACKAGE_ADDED");
			Toast.makeText(context, "PACKAGE_ADDED", Toast.LENGTH_SHORT).show();
			
			Intent intent2 = new Intent();
			intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			intent2.setClass(context,MainActivity.class);
			context.startActivity(intent2);
		}else if("android.intent.action.PACKAGE_REMOVED".equals(action)){
			System.out.println("PACKAGE_REMOVED");
			Toast.makeText(context, "PACKAGE_REMOVE", Toast.LENGTH_SHORT).show();
		}
	}

獲取廣播事件action,然後判斷廣播事件,執行廣播事件之後的相應代碼。

打電話事件之後獲取電話號碼,輸出號碼名字,如果號碼是123,就打給456。

然後再測試安裝與卸載app的廣播事件,安裝的action是android.intent.action.PACKAGE_ADDED,不是android.intent.action.PACKAGE_INSTALL,安裝廣播之後也執行跳轉命令Intent2。

    

但僅僅寫完上述代碼是不夠的,還要在註冊清單上面添加:

        <receiver android:name="com.example.broadcastmytest.broadcast.CallBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_INSTALL"/>
                <action android:name="android.intent.action.PACKAGE_ADDED"/>
                <action android:name="android.intent.action.PACKAGE_REMOVED"/>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
                
                <data android:scheme="package"/>
            </intent-filter>
        </receiver>

把包改成
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcastmytest"
    android:versionCode="1"
    android:versionName="1.0" >
    

這樣之後纔可以運行成功。

    


自己寫廣播自己接收

    

無序廣播

    

	public void wuxu(View v){
		showUserMsg("wuxu");
		Intent intent = new Intent();
		intent.putExtra("key1", "我是無序廣播");
		intent.setAction("com.example.broadcast.SendUnOder1");
		sendBroadcast(intent);
	}
    

自己寫一個類去接收自己發出的廣播

public class SendUnOrderBroadcast extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String StringExtra = intent.getStringExtra("key1");
		System.out.println("StringExtra"+StringExtra);
	}
	
}

在清單文件裏面去添加一個receiver

<span style="white-space:pre">	</span><receiver android:name="com.example.broadcast.send.SendUnOrderBroadcast">
            <intent-filter>
                <action android:name="com.example.broadcast.SendUnOder1"/>
            </intent-filter>
        </receiver>


    

有序廣播

寫三個廣播接收類,1 2 3表示權限

public class SendUnOrder1Broadcast extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String stringExtra = intent.getStringExtra("key2");
		System.out.println("111"+stringExtra);
	}

}
<pre name="code" class="java">public class SendUnOrder2Broadcast extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String stringExtra = intent.getStringExtra("key2");
		System.out.println("222"+stringExtra);
	}

}

public class SendUnOrder3Broadcast extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String stringExtra = intent.getStringExtra("key2");
		System.out.println("333"+stringExtra);		
	}

}




發送廣播

	public void youxu(View v){
		showUserMsg("youxu");
		Intent intent = new Intent();
		intent.putExtra("key2", "我是有序廣播");
		intent.setAction("com.example.broadcast.SendUnOder2");
		sendOrderedBroadcast(intent, null, null, null, 1, null, null);
	}

清單文件內設置權限級別

        <receiver android:name="com.example.broadcast.send.oder.SendUnOrder1Broadcast">
            <intent-filter android:priority="1000">
                <action android:name="com.example.broadcast.SendUnOder2"/>
            </intent-filter>
        </receiver>
        <receiver android:name="com.example.broadcast.send.oder.SendUnOrder2Broadcast">
            <intent-filter android:priority="500">
                <action android:name="com.example.broadcast.SendUnOder2"/>
            </intent-filter>
        </receiver>
        <receiver android:name="com.example.broadcast.send.oder.SendUnOrder3Broadcast">
            <intent-filter android:priority="100">
                <action android:name="com.example.broadcast.SendUnOder2"/>
            </intent-filter>
        </receiver>

可以在廣播接收類內部中斷廣播

abortBroadcast();



這樣就可以自己發廣播自己接收了。


代碼動態配置廣播

    

代碼動態配置廣播不需要在清單中配置recevier,直接在代碼中創建一個registBroadcast和IntentFilter,然後往IntentFilter裏面去添加action,最後代碼註冊一個Receiver。


在Activity的onCreate裏面寫

		registBroadcast = new RegistBroadcast();
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction("android.intent.action.SCREEN_OFF");
		intentFilter.addAction("android.intent.action.SCREEN_ON");
		registerReceiver(registBroadcast,intentFilter);


public class RegistBroadcast extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		if( "android.intent.action.SCREEN_OFF".equals(action) ){
			System.out.println("SCREEN_OFF");
		}else{
			System.out.println("SCREEN_ON");
		}
	}
	
}


    這樣就可以接收屏幕關閉打開的廣播了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章