Android 中在有序广播中添加自定义权限的实例
android 中在有序广播中添加自定义权限的实例
前言;
有序广播说明:
有序广播因为要处理消息的处理结果,所以要复杂一些。
* sendorderedbroadcast(intent intent, string receiverpermission, broadcastreceiver resultreceiver, handler scheduler, int initialcode, string initialdata, bundle initialextras);
如果只是想让广播可以按优先级来收取,并不在意处理的结果,可以用下面的版本:
* sendorderedbroadcast(intent intent, string receiverpermission);
同样,在多用户环境下,也可以选择给哪个用户发广播:
* sendorderedbroadcastasuser(intent intent, userhandle user, string receiverpermission, broadcastreceiver resultreceiver, handler scheduler, int initialcode, string initialdata, bundle initialextras);
首先我们要在androidmanifest.xml中自定义一个权限,格式参考系统自带的权限,android.permission.xxxxx,只要是xxx.peimission.xxxxxx就行,如果不按照这个格式,那么这个权限可能没法使用。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.lsj.broadcasttest"> <span style="color:#ff0000;"> <permission android:name="test.permission.test" android:protectionlevel="normal" ></permission></span> <application android:allowbackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsrtl="true" android:theme="@style/apptheme"> <activity android:name=".mainactivity"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <receiver android:name=".myreceiver" android:enabled="true" android:exported="true"> <intent-filter android:priority="20"> <action android:name="hahaha" /> </intent-filter> </receiver> <receiver android:name=".myreceiver2" android:enabled="true" android:exported="true"> <intent-filter android:priority="19"> <action android:name="hahaha" /> </intent-filter> </receiver> </application> <span style="color:#ff0000;"> <uses-permission android:name="test.permission.test"/></span> </manifest>
然后使用sendorderedbroadcast(intent,"test.permission.test");就可以发送有序广播了,当然发送广播之前还要指定一下接受者的优先级,优先级越高,android:priority指定的数字就越大。取值的范围是:-1000~1000这个就不详细叙述了。
public class mainactivity extends appcompatactivity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); button send= (button) findviewbyid(r.id.send); send.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { intent intent=new intent(); intent.setaction("hahaha"); intent.putextra("msg","一个简单的消息"); sendorderedbroadcast(intent,"test.permission.test"); } }); } }
第一个broadcastreceiver在接收到广播的时候,如果想要添加一些自己的东西进去,可以先创建一个bundle对象,并且存入数据。
然后通过setresultextras(bundle),把这个bundle添加到原来的消息中,
ublic class myreceiver extends broadcastreceiver { public myreceiver() { } @override public void onreceive(context context, intent intent) { toast.maketext(context,"接收到的intent的action为:"+intent.getaction()+"\n消息内容是:"+intent.getstringextra("msg"),toast.length_long).show(); bundle bundle=new bundle(); bundle.putstring("first","第一个broadcast存入的消息!"); setresultextras(bundle); } }
下一个broadcastreceiver通过getresultextras可以将信息提取出来。
ublic class myreceiver2 extends broadcastreceiver { public myreceiver2() { } @override public void onreceive(context context, intent intent) { // todo: this method is called when the broadcastreceiver is receiving bundle bundle=getresultextras(true); string first=bundle.getstring("first"); toast.maketext(context,"第一个broadcast存入的消息为:"+first,toast.length_long).show(); } }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!