Android广播基础理解
广播可以分为系统广播和自定义广播,系统广播就是手机系统根据自身状态信息发出相应的广播,比如电池电量不足10%、手机完成开机、手机所在地理位置发生了变化(从安徽跑到了江苏)等,这些情况下系统都会发出一条广播,应用程序可以选择接收或者不接收。
一.广播的动态和静态注册
1.动态注册
即不在AndroidManifest.xml文件中声明广播接收者,而是在需要接收某广播的Activity的生命周期方法中进行广播接收者的注册和解除注册:
public class OneActivity extends AppCompatActivity { private IntentFilter filter; private NetWorkChangeReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_one); filter = new IntentFilter(); filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); receiver = new NetWorkChangeReceiver(); registerReceiver(receiver, filter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); } class NetWorkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //接收到网络状态变化的广播时在此执行操作 } } }
动态注册的广播是一定要取消注册的,上面代码中接收的是网络状态变化的广播,此时当OneActivity已经被创建并且没有被销毁(即还存在于Activity堆栈中,不一定是栈顶),一旦网络状态变化就会执行onReceive方法中的操作。动态注册和静态注册不同的一点是只有当应用程序启动之后才会接收广播,而且onReceive方法中不允许有大量的数据和耗时操作,否则会报错
上述的紫色和绿色代码可以分别写到onResume和onPause方法中,这种情况下OneActivity必须在activity堆栈的栈顶时才可以接收网络状态变化的广播,并且OneActivity一旦不在栈顶接收者就会被销毁
2.静态注册
就是在AndroidManifest.xml文件下声明广播接收者,静态注册广播接收者可以使应用程序在未启动的情况下就能接收广播:
<receiver android:name=".NetWorkChangeReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver>
二.自定义广播的无序和有序
1.无序广播
即同一个广播的所有接收者会同时接收发出的广播,广播的发出:
btn123.setOnClickListener(v -> { Intent intent = new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE"); sendBroadcast(intent); });
2.有序广播
即不同接收者之间有优先级顺序,高优先级的接收者可以截断广播使低优先级无法接收广播,在高优先级的接收者onReceive方法中加上abortBroadcast()方法就可以截断广播。对于优先级的设置是在AndroidManifest.xml中添加属性:
<receiver android:name=".NetWorkChangeReceiver" android:enabled="true" android:exported="true"> <intent-filter android:priority="100"> 这个值可以是-1000~1000 <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver>
上面是静态注册的优先级设置,动态注册时如下:
IntentFilter filter = new IntentFilter();
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);//这个值就是1000,也可以直接用-1000到1000的整数作为参数
发出广播:
btn123.setOnClickListener(v -> { Intent intent = new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE"); sendOrderedBroadcast(intent, null); });
三.本地广播
上面说的广播都是全局广播,即所有的应用程序下的接收者都可以进行接收,这样就会存在一定的安全性问题。本地广播就是只能在本应用程序中进行传递,其他的app无法访问该广播,并且本地广播接收器只能接收本应用程序的广播。还有重要的一点是本地广播无法通过静态注册的方式来接收,因为静态注册就是为了让程序在未启动的情况下就可以接收到广播,而本地广播是在本应用程序中进行接收,此时的本应用程序是已经启动的,所以本地广播接收器只能用动态注册
具体的代码可以参考:https://blog.csdn.net/u010126792/article/details/82417190