Android-廣播總結
阿新 • • 發佈:2018-12-18
1.傳送廣播:
其實發送廣播屬於隱式意圖
1.1.系統發出的廣播(有序廣播/無序廣播)
1.2自己發出的廣播(有序廣播/無序廣播)
2.訂閱廣播:
2.1.AndroidManifest.xml形式訂閱接收者
2.2.Java程式碼訂閱廣播(onCreate方法中訂閱接收者(能夠發現廣播接收者是唯一可以new的元件),onDestroy方法裡解除訂閱,如果不解除訂閱會引發洩露異常)
3.廣播的生命週期方法:就一個方法
onReceive(Context context, Intent intent)
廣播接收者元件,什麼時候被啟用,當執行 onReceive(Context context, Intent intent) 的時候被啟用
廣播接收者元件,什麼時候被回收,當執行完 onReceive(Context context, Intent intent) 後,系統會自動回收
4.廣播接收者,耗時操作
onReceive(Context context, Intent intent) 方法不能執行耗時操作
因為廣播接收者是和Activity一樣在主執行緒執行(Activity是五秒未響應就ANR異常,而廣播接收者十秒未響應就ARN異常)
如果一定要在廣播接收者裡執行耗時操作,怎麼辦?
答:不能開啟子執行緒,因為在執行完生命週期方法(onReceive(Context context, Intent intent) )後,系統會自動回收廣播接收者,所以不能開子執行緒
可以去開啟一個服務-->服務再去開啟主執行緒執行耗時操作 content.startService();
5.廣播接收者,去跳轉Activity
AndroidManifest.xml 訂閱 接收者
<!-- 訂閱(Xml形式訂閱接收者) 訂閱接收者:專門去跳轉Activity--> <receiver android:name=".br.StartActivityBroadcastReceiver"> <intent-filter> <action android:name="my_customo.start_action_action" /> <data android:scheme="startActivityScheme" /> </intent-filter> </receiver>
接收者:
package liudeli.croadcast1.br; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import liudeli.croadcast1.MainActivity; /** * 此接收者,專門用來跳轉Activity */ public class StartActivityBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { startActivity(context); } /** * 啟動另外一個Activity */ private void startActivity(Context context) { Intent intent = new Intent(context, MainActivity.class); /** * 注意:⚠️ 在非Activity的地方 去啟動Activity,必須加入以下標記 * intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); */ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } }
傳送廣播:
/** * 傳送廣播給 ---> 接收者 */ public void startActivity(View view) { /** * 訂閱的資訊: * <intent-filter> * * <action android:name="my_customo.start_action_action" /> * * <data android:scheme="startActivityScheme" /> * * </intent-filter> */ /** * 傳送廣播原則,接收者怎麼去訂閱的,我就怎麼去傳送廣播 */ Intent intent = new Intent(); intent.setAction("my_customo.start_action_action"); intent.setData(Uri.parse("startActivityScheme:我要啟用另外一個Activity")); sendBroadcast(intent); }
效果: