复习Android |
您所在的位置:网站首页 › 安卓中的广播主要分为两种类型是 › 复习Android |
广播简介
在Android中每个应用都可以对任意的广播进行注册,这样就可以接受到指定的广播内容。 Android提供了完整的API,允许应用程序自由的发送和接受广播。 Android中的广播主要分为以下两种: 标准广播 标准广播是一种完全异步执行的广播,在广播发出之后,所有的BroadcastReceiver几乎会在同一时间收到这条广播信息,但是此种广播也就无法被拦截。 有序广播 有序广播是一种同步执行的广播,在广播发出之后,在同一时刻只有一个BroadcastReceiver可以收到此广播信息; 当前的BroadcastReceiver中的逻辑执行完成之后,可以选择继续传递该广播信息也可以选择截断传递; 在有序广播中BroadcastReceiver是有先后顺序的,优先级大的先接受到广播信息; 接受系统广播BroadcastReceiver的注册方式一般有两种,一种是在AndroidManifest.xml中注册为静态注册,另一种是在代码中注册为动态注册。 动态注册监听时间变化创建广播接收器类一般为内部私有类,并重写相关方法: private class TimeChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(FirstActivity.this, "时间发生变化", Toast.LENGTH_SHORT).show(); } }在需要用到地方注册: //获取系统广播 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.intent.action.TIME_TICK"); timeChangeReceiver = new TimeChangeReceiver(); registerReceiver(timeChangeReceiver, intentFilter);在Activity被销毁或者跳转时需要解注册广播: @Override protected void onDestroy() { super.onDestroy(); //解注册广播 unregisterReceiver(timeChangeReceiver); }需要监听什么广播就需要声明相应的IntentFilter。 静态注册实现开机启动动态注册是写在代码里的,这就意味着广播的注册必须要在程序启动之后进行。 在Android8之后所有的隐式广播都不允许静态注册接收,隐式广播是指没有具体指定要发给哪个应用的广播。 声明开机启动广播接收器: public class BootCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "手机启动完毕", Toast.LENGTH_LONG).show(); } }在Manifest文件中声明权限: 在Manifest文件中声明要接收的广播: Android系统为了保护用户设备的安全和隐私,严格规定了应用权限:如果程序需要进行一些对用户比较敏感的操作,必须在Manifest文件中进行权限声明,不然程序直接崩溃。 在标签中常用的属性: android:enabled 是否可以被Android实例化; android:exported 是否可以跟其他应用的组件直接交互; 发送自定义广播 发送标准广播声明广播接收类: public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "收到自定义广播", Toast.LENGTH_LONG).show(); } }在Manifest中注册广播: 在需要的地方发送广播: //发送广播 btnPostBroadcast = findViewById(R.id.btn_post_broadcast); btnPostBroadcast.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent("com.zcd.flcdemo.br.MyBroadcast"); intent.setPackage(getPackageName()); sendBroadcast(intent); } });值得注意的是,默认情况下发出的广播都是隐式广播,而且当前广播注册又是静态的,所以如果不调用setPackage方法来指定接收的广播的话,那么这条广播发出去之后就不会有人接收到。 发送有序广播新建一个有序广播接收器类: public class AntherMyBroadcastReceivers extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "收到有序广播", Toast.LENGTH_LONG).show(); } }在Manifest文件中添加注册: 发送有序广播: //发送有序广播 btnPostBroadcastOrdered = findViewById(R.id.btn_post_broadcast_ordered); btnPostBroadcast.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent("com.zcd.flcdemo.br.MyBroadcast"); intent.setPackage(getPackageName()); sendOrderedBroadcast(intent, null); } });与发送标准广播不同的地方仅仅是调用了sendOrderedBroadcast方法; sendOrderedBroadcast方法的第一个参数是Intent,第二个参数是与权限相关的字符串,一般为null; 如有需要可以在Manifest文件中为有序广播的接收器添加优先级: 如果要拦截广播需要在接收器中添加相应的方法: public class AntherMyBroadcastReceivers extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "收到有序广播", Toast.LENGTH_LONG).show(); //拦截广播 abortBroadcast(); } } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |