-
是什么
一种数据传输机制,起到进程间通信的作用。和Binder机制不一样的地方在于,广播的发送者和接收者事先是不需要知道对方的存在的,这样带来的好处便是,系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。关于底层实现可以参考:https://www.jianshu.com/p/02085150339c -
特点
类似于观察者模式
接收者生命周期短暂
不要做耗时太长的工作 ( 不要在广播里添加过多逻辑或者进行任何耗时操作,因为在广播中是不允许开辟线程的, 当onReceiver( )方法运行较长时间(超过10秒)还没有结束的话,那么程序会报错(ANR), 广播更多的时候扮演的是一个打开其他组件的角色,比如启动Service,Notification提示, Activity等!)
广播类型:
标准广播(异步执行,发出后所有接收者同一时间收到,无法截断)
有序广播(同步执行,发出后按照优先级接收广播,只有当前一个接收器执行完之后广播才能继续传递)
有序广播有一个好的例子:https://blog.csdn.net/huandroid/article/details/52247330自定义BroadcastReceiver 可以执行的操作
(1)Toast
(2) 发布通知栏信息
(3) 对话框 (注意上下文 必须是一个Activity,因为对话框必须依赖于Activity存在)
(4) 发送广播
(5) 开启服务
(6) 开启新的Activity
-
如何用
1. 静态注册
即使App退出,仍然可以接收到广播。在Manifest中注册
安卓8.0对静态注册进行了一定的修改,应用无法使用其清单注册大部分隐式广播(即并非专门针对此应用的广播),故现在静态注册的使用形式如下:
发送者:Intent intent = new Intent("com.example.broadcast.my"); //参数一是接收器的包名,参数二是你的接收器的路径 intent.setComponent(new ComponentName("com.example.receive","com.example.receive.Receiver")); sendBroadcast(intent);
接收者:
Manifest文件中:<intent-filter> <action android:name="com.example.broadcast.my"/> </intent-filter>
主文件中:
public class Receiver extends BroadcastReceiver { @Override public void onRecive(Context context, Intent intent) { //执行 } }
2.动态广播:
在代码中注册。接收优先级高于静态广播。
动态注册设置优先级 intentFilter.setPriority(-1000);
发送者同上
接收者:
public class MainActivity extends Activity { public static final String BROADCAST_ACTION = "com.example.corn"; private actionReceiver mBroadcastReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBroadcastReceiver = new MyBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(BROADCAST_ACTION); registerReceiver(mBroadcastReceiver, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(mBroadcastReceiver); } class actionReceiver extends BroadcastReceiver { @Override public void onRecieve(Context context, Intent intent) { //行为 } } }
注意在onDestory生命周期需要注销接收
发送有序广播:sendOrderedBroadcast(intent, null);
接收器中,abortBroadcast()方法会将广播截断。
发送本地广播(只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播)://send LocalBroadcastManager broad = LocalBroadcastManager.getInstance(this); ... local.sendBroadcast(intent) //receive LocalReceiver receive = new LocalReceiver(); localBroadcastManager.registerReciver(receive, intentFilter);
本地广播是无法通过静态注册的方式来接收的。
最后盘点一下使用本地广播的优势:
可以明确知道正在发送的广播不会离开我们的程序,不需要担心机密数据泄漏的问题。
其他的程序无法将广播发送到我们程序的内部,不需要担心会有安全漏洞的隐患。
发送本地广播比起发送系统全局广播将会更加高效。
在最佳实践中关于对话框的设计:AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("警告"); builder.setMessage("你已被下线,请重新登录"); // 设置不可取消 builder.setCancelable(false); // 设置点击事件 builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { // 销毁所有活动 ActivityCollector.finishAll(); // 重新启动 LoginActivity IntentUtils.myIntent(context, LoginActivity.class); } }); builder.show();
《第一行代码》——广播
最新推荐文章于 2024-02-25 23:38:50 发布