赞
踩
作为安卓中的四大组件广播的作用也是非常大的,听名字我们或许就知道他的功能啦!接下来就回顾、总结下这个重要的组件。
BroadcastReceiver是一个全局的监听器,它可以监听安卓系统、其他App、自己App发出的广播。并作出相应的处理。是安卓的四大组件之一。
BroadcastReceiver就是广播接收者,接收广播。
(1)同一app内部的同一组件内的消息通信(单个或多个线程之间)
(2)同一app内部的不同组件之间的消息通信(单个进程)
(3)同一app有不同的组件,且运行在不同的进程中(多个进程之间)
(4)不同app之间的组件之间消息通信(多个进程之间)
(5)Android系统在特定情况下与App之间的消息通信
发布者、订阅者,一听我们就想到了“观察者设计模式”,没错安卓中的广播机制就是基于观察者模式的,只不过安卓中通过“消息中心ASM”来处理沟通广播接收者、发送者。为啥要把ASM设计为消息中心呢?
(1)原理草图
1、广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册;
2、广播发送者通过binder机制向AMS发送广播;
3、AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;
4、消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。
步骤:
1、自定义类继承BroadcastReceiver
2、重写onReceiver方法
3、等待广播发送者发送广播,这样BroadcastReceiver的onReceiver就会回调。
/**
* Created by sunnyDay on 2019/8/13 18:09
*/
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "收到广播", Toast.LENGTH_SHORT).show();
}
}
(1)动态注册
public class MainActivity extends AppCompatActivity { @Override protected void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(); filter.addAction("sunny.day.custom.broadcast"); //添加过滤条件,接收广播 MyBroadcastReceiver mBroadcastReceiver = new MyBroadcastReceiver(); registerReceiver(mBroadcastReceiver, filter); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 点击按钮发送自定义广播 * */ public void send(View view) { Intent intent = new Intent(); intent.setAction("sunny.day.custom.broadcast");// 发送者定义 过滤条件 sendBroadcast(intent); } @Override protected void onPause() { super.onPause(); // activity 销毁时解注册 unregisterReceiver(mBroadcastReceiver); } }
说明:
注意:
广播解注册的时机:
不在onCreate() & onDestory() 或 onStart() & onStop()注册、注销是因为:
当系统因为内存不足(优先级更高的应用需要内存)要回收Activity占用的资源时,Activity在执行完onPause()方法后就会被销毁,有些生命周期方法onStop(),onDestory()就不会执行。当再回到此Activity时,是从onCreate方法开始执行。
假设我们将广播的注销放在onStop(),onDestory()方法里的话,有可能在Activity被销毁后还未执行onStop(),onDestory()方法,即广播仍还未注销,从而导致内存泄露。但是,onPause()一定会被执行,从而保证了广播在App死亡前一定会被注销,从而防止内存泄露。
(2)静态注册
在安卓的manifest中通过receiver节点下添加 intent-filter,然后在intent-filter中添加过滤条件。
<receiver android:name=".MyBroadcastReceiver"
android:exported="false">
<intent-filter >
// 自定义一个action
<action android:name="sunny.day.custom.broadcast" />
</intent-filter>
</receiver>
receiver节点的属性:
1、exported :此BroadcastReceiver能否接收其他App的发出的广播,这个属性默认值有点意思,其默认值是由receiver中有无intent-filter决定的,如果有intent-filter,默认值为true,否则为false。(同样的,activity/service中的此属性默认值一样遵循此规则)同时,需要注意的是,这个值的设定是以application或者application user id为界的,而非进程为界(一个应用中可能含有多个进程)。
2、name :此BroadcastReceiver类名。
3、permission:如果设置,具有相应权限的广播发送方发送的广播才能被此broadcastReceiver所接收。
4、process:四大组件都具有这个属性。为组件指定单独的进程。不指定默认为app默认的进程。
/** * 点击按钮发送自定义广播(隐式发送) */ private fun send1() { val intent = Intent() intent.action = "sunny.day.custom.broadcast" sendBroadcast(intent) } /** * 点击按钮发送自定义广播(显式发送) */ private fun send2() { val intent = Intent(this,MyBroadcastReceiver::class.java) intent.action = "sunny.day.custom.broadcast" sendBroadcast(intent) }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。