Android-广播总结
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); }