BroadcastReceiver:廣播接收者,接收發送過來的廣播,本質是全局監聽器。廣播作爲Android一種通信方式,用途十分廣泛。例如:開機啓動後會接收到啓動服務的廣播,電量變化時會接收電量低及時保存的廣播提示,網絡變化會接收及時提示和保存的提示,檢測SD狀態廣播等等。
BroadcastReceiver的生命週期:
實現BroadcastReceiver的實例非常簡單,繼承BroadcastReceiver會調用onReceive(),所有的操作直接在onReceive()中運行。執行完之後,BroadcastReceiver直接銷燬。該方法直接運行在UI線程中,大概只有10s左右,所以不可做耗時操作。
如何註冊:
首先自定義一個BroadcastReceiver對象,繼承BroadcastReceiver
public class MyReceiver extends BroadcastReceiver {
private static final String Tag = "Myreceive";
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Log.i(Tag,"Myreceive:"+ msg);
}
}
註冊:
1.靜態註冊:在AndroidManifest.xml中實現
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="MY_BROADCAST"/><!-- 隱式發送,用來匹配Intent-->
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
補充(隱式跳轉):
1.一個Intent可以有多個category目錄,但至少會有一個默認的;
2.只有Intent的所有category都匹配上了,Activity才能接受這個Intent。
所以爲什麼要加category 這個默認方式了。
MianActivity代碼:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt_send = (Button) findViewById(R.id.bt_send);
bt_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("android.intent.action.MY_BROADCAST");//在配置文件中的action目錄做的配置
intent.putExtra("msg","hello World"); sendBroadcast(intent);
}
}
);
}
添加了一個發送按鈕,用來發送廣播
結果:
2.動態註冊
MyReceiver myReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.intent.action.MY_BROADCAST");
registerReceiver(myReceiver,intentFilter);//動態註冊
結果:
動態註冊在程序關閉時是收不到廣播的,但是靜態可以。
根據廣播的發送方式可以分爲:
1.Normal Broadcast普通廣播
2.System Broadcast系統廣播
3.Ordered Broadcast有序廣播
4.Local BroadcastApp內部廣播
5.Sticky Broadcast粘性廣播(5.0不在推薦)
1.普通廣播:
建立了三個自定義廣播類
MyReceiver
public class MyReceiver extends BroadcastReceiver {
private static final String Tag = "Myreceive";
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Log.i(Tag, "Myreceive:" + msg);
}
}
FirstReceiver
public class FirstReceiver extends BroadcastReceiver {
private static final String Tag = "FirstReceiver";
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Log.i(Tag, "FirstReceiver:" + msg);
}
}
SecondReceiver
public class SecondReceiver extends BroadcastReceiver {
private static final String Tag = "SecondReceiver";
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Log.i(Tag, "SecondReceiver:" + msg);
}
}
MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt_send = (Button) findViewById(R.id.bt_send);
bt_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("android.intent.action.MY_BROADCAST");
intent.putExtra("msg","hello World");
sendBroadcast(intent);
}
}
);
}
}
在配置文件中添加相應的配置
結果:
04-06 08:01:34.308 30288-30288/com.appress.gerber.broadcastreceiver I/Myreceive: **Myreceive:hello World**
04-06 08:01:34.308 30288-30288/com.appress.gerber.broadcastreceiver I/FirstReceiver: **FirstReceiver:hello World**
04-06 08:01:34.308 30288-30288/com.appress.gerber.broadcastreceiver I/SecondReceiver: **SecondReceiver:hello World**
都接收到了消息。
有序廣播:
使用sendOrderedBroadcast()方法,優先級-1000到1000
在配置文件中配置優先級
<receiver android:name=".MyReceiver">
<intent-filter android:priority="10"><!--優先級10-->
<action android:name="android.intent.action.MY_BROADCAST"/><!-- 隱式發送,用來匹配Intent-->
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
<receiver android:name=".FirstReceiver">
<intent-filter android:priority="80"><!--優先級80-->
<action android:name="android.intent.action.MY_BROADCAST"/><!-- 隱式發送,用來匹配Intent-->
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
<receiver android:name=".SecondReceiver">
<intent-filter android:priority="-20"><!--優先級-20-->
<action android:name="android.intent.action.MY_BROADCAST"/><!-- 隱式發送,用來匹配Intent-->
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
MainActivity:沒有做設置權限,直接null,如果設置權限只能接收相同權限的廣播。
sendOrderedBroadcast(intent,null);
結果:優先級FirstReceiver,Myreceive,SecondReceiver
04-06 08:18:36.716 14590-14590/com.appress.gerber.broadcastreceiver I/FirstReceiver: **FirstReceiver:hello World**
04-06 08:18:36.716 14590-14590/com.appress.gerber.broadcastreceiver I/Myreceive: **Myreceive:hello World**
04-06 08:18:36.716 14590-14590/com.appress.gerber.broadcastreceiver I/SecondReceiver: **SecondReceiver:hello World**
Local Broadcast:App內部廣播,說明廣播可以跨進程之間通信。(自己不怎麼了解)
System Broadcast:Android系統內置了多個系統廣播,只要涉及到基本操作的基本上都帶有廣播