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");
}
}
}
這樣就可以接收屏幕關閉打開的廣播了。