Android编程权威指南学习之broadcast intent(二)

来源:互联网 发布:树莓派ubuntu系统图片 编辑:程序博客网 时间:2024/06/04 18:23

2.3.3 私有权限的使用背景:
系统中的任何应用均可监听并触发我们的receiver,通常这种情况是不希望发生的。
方法一:在manifest配置文件里给receiver标签添加一个android:exported=”false”属性,声明它仅限应用内部使用。
方法二:在AndroidManifest.xml中添加permission标签来完成。

<permission android:name="com.bignerdranch.android.photogallery.PRIVATE"android:protectionLevel="signature" /><uses-permission android:name="com.bignerdranch.android.photogallery.PRIVATE" />

发送的Broadcast intent:

public static final String PERM_PRIVATE="com.bignerdranch.android.photogallery.PRIVATE";sendBroadcast(new Intent(ACTION_SHOW_NOTIFICATION), PERM_PRIVATE);

接收的Broadcast receiver,在registerReceiver()方法传入自定义权限就能解决该问题。

IntentFilter filter = new IntentFilter(PollService.ACTION_SHOW_NOTIFICATION);getActivity().registerReceiver(mOnShowNotification, filter,PollService.PERM_PRIVATE, null)

注意:自定义权限必须指定android:protectionLevel属性值,Android根据protectionLevel属性值确定自定义权限的使用方式。

2.3.4 有序broadcast的使用
一般broadcast intent可同时被所有人接收。事实上, onReceive(…)方法是在主线程上调用的,所以receiver并没有同步并发运行。因而,不可能指望它们按照某种顺序依次运行,或知道它们什么时候全部结束运行。结果就是,无论是broadcast receiver之间要通信,还是intent发送者要从receiver接收信息,都会很麻烦。
为解决问题,可使用有序broadcast intent实现双向通信。有序broadcast允许多个broadcast receiver依序处理broadcast intent。另外,通过传入一个名为result receiver的特别broadcast receiver,有序broadcast还支持让broadcast发送者接收broadcast接收者的返回结果。

  private void showBackgroundNotification(int requestCode, Notification notification) {    Intent i = new Intent(ACTION_SHOW_NOTIFICATION);   i.putExtra(REQUEST_CODE, requestCode);    i.putExtra(NOTIFICATION, notification);   sendOrderedBroadcast(i, PERM_PRIVATE, null, null,Activity.RESULT_OK, null, null);  } 

除了在 sendBroadcast(Intent,String) 方法中使用的参数外, Context.sendOrdered-Broadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle) 方法还有另外五个参数,依次为:一个result receiver,一个支持result receiver运行的 Handler ,结果代码初始值,结果数据以及有序broadcast的结果附加内容。
result receiver比较特殊,只有在所有有序broadcast intent接收者结束运行后,它才开始运行。虽然有时能使用result receiver接收broadcast和发布通知对象,但此处行不通。目标broadcast intent通常是在 PollService 对象消亡之前发出的,这意味着broadcast receiver很可能也不存在了。
因此,最终的broadcast receiver应该是个standalone receiver。而且,无论如何都要保证它在其他动态登记的receiver之后运行。

public class NotificationReceiver extends BroadcastReceiver {    private static final String TAG = "NotificationReceiver";    @Override public void onReceive(Context c, Intent i) {    Log.i(TAG, "received result: " + getResultCode());    if (getResultCode() != Activity.RESULT_OK) {    // A foreground activity cancelled the broadcast return;    }    int requestCode = i.getIntExtra(PollService.REQUEST_CODE, 0);    Notification notification = (Notification)i.getParcelableExtra(PollService.NOTIFICATION);    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(c);        notificationManager.notify(requestCode, notification);    } } 
对改进行登记: <receiver android:name=".NotificationReceiver" android:exported="false"> <intent-filter android:priority="-999"> <action android:name="com.bignerdranch.android.photogallery.SHOW_NOTIFICATION" />  </intent-filter> </receiver>

3、receiver与长时运行任务 使用broadcast intent触发一个长时运行任务。
两种方法:
1)将任务交给服务处理,然后通过broadcast receiver启动服务。这也是首推方式。
2)使用BroadcastReceiver.goAsync()方法。

4.深入学习:本地事件
背景:需要一个仅在应用内使用的消息事件广播。
事件总线(EventBus)设计思路:提供一个应用内的部件可以订阅的共享总线或数据流。事件一旦发布到总线上,各订阅部件就会被激活并执行相应的回调代码。
EventBus的使用:要在应用中使用EventBus,首先需要在项目中添加依赖库。然后,就可以定义事件类了(如果需要传送数据,可以向事件里添加数据字段):
public class NewFriendAddedEvent { }
在应用的任何地方,都可以把消息事件发布到总线上:
EventBus eventBus = EventBus.getDefault();eventBus.post(new NewFriendAddedEvent());
在总线上登记监听,应用的其他部分也可以订阅接收事件消息。通常,activity或fragment的登记和撤销登记都是在相应的生命周期方法中
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@Override
public void onStart() {
super.onStart();
mEventBus.register(this);
}
@Override
public void onStop() {
super.onStop(); mEventBus.unregister(this);
}的事件消息发布时,可实施 onEvent(…) 或者 onEventMainThread(…) 方法并传入合适的事件类型,让订阅者作出响应。如果使用的是 onEvent(…) 方法,事件消息来自哪个线程,就在哪个线程上处理。(可以实施 onEventMainThread(…) 方法确保事件在主线程上处理,哪怕它碰巧来自后台线程。)

// In some registered component, like a fragment or activity...public void onEventMainThread(NewFriendAddedEvent event){     Friend newFriend = event.getFriend(); // Update the UI or do something in response to event...}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾驶证过期了被交警抓到怎么办 摩托车驾驶证6年到期在增驾怎么办 驾照年检时色盲图过不了怎么办 驾驶证扣12分超过两年怎么办 驾驶证被注销后超过两年怎么办 a2照驾驶证年审过期一个月怎么办 车被别人追尾行驶证过期怎么办 骑魔头车没驾照车祸保险拒赔怎么办 行驶证过了两个多月没年检怎么办 驾照没满一年扣了3分怎么办 6年免检但是行驶证到期怎么办 驾驶证和行驶证一起丢了怎么办 身份证驾驶证行驶证一起丢了怎么办 在银行柜圆机取款时忘了取卡怎么办 中国建设银银行取款密码忘了怎么办 买到证件不全的二手电动车怎么办 光大乐惠金卡信用卡还了怎么办 增驾期间被扣3分怎么办 a2驾驶证被扣12分后怎么办 我手机换号码了驾驶证档案怎么办 手机号码换了查不到驾照分了怎么办 金牛区源泉幼儿园摇不到号怎么办 b2驾驶证被扣12分后怎么办 福建省超过一年驾照未年审要怎么办 为缓解交通拥堵现状人们应该怎么办 告对方不知道对方出身日期怎么办 上海业余围棋4进3老不过怎么办 孩子想上学但又怕同学议论怎么办 在菲律宾黑了博彩老板的钱怎么办 九阴真经3d先遣服更新失败怎么办 公司核名通过不想用了怎么办 公司核名下来了不想注册了怎么办 家人受到小贷公司催款威胁怎么办 商标抽签资料提交上去有问题怎么办 花椒直播助手苹果版下载不了怎么办 在香港酒店住把床单弄上血了怎么办 综英美我能怎么办我也很绝望百度云 护照的名字中间有个空格怎么办 开车不小心压死黄鼠狼了怎么办 三户联保贷款一方不还怎么办 因为隔断中介违约…我该怎么办