• 初识安卓之发送系统广播与广播接受者


    发送一个广播的过程:

    public class MainActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
        public void normal(View view){
            //创建广播的意图对象,指定广播的动作,也就是只要接收者配置清单里有这个动作的,都能接受
            Intent intent=new Intent("com.itheima.action.TEST");
            
            //发送无序广播,发送同时,指定接受者的权限,
            //如果接受者没有这个权限,则收不到,权限可以在发送端自定义一个
            sendBroadcast(intent,"com.itheima.permission.MYPERMISSION");
            //sendBroadcast(intent);
            System.out.println("收到么,我发了");
        }
        //有序广播,权限可以为null,表示所有接受者都可以收到
        public void ordered(View view){    
            Intent intent=new Intent("com.itheima.action.TEST");      
            //发送动作参数依次为:(intent),(权限值),(定义一个接收者的终结者最后收信息,终结者不用在清单里注册!!即便信息在多个接受者间传递时,一个接收者中断了广播,终结者还是能收到,因为终结者是在线程中创建的,线程每段就可以收),(一个handler它在哪个线程中创建,终结者就在哪个线程中被回调接受最终消息,一般是在activity的主线程中),(一个int值表示数据包编号),(一个字符串表示数据包名字),(一个bundle表示数据包本身)
            
            //需要一个bundle,用来存放结果数据
            Bundle bundle=new Bundle();
            bundle.putString("name", "小吕");
            bundle.putInt("age", 25);
            sendOrderedBroadcast(intent, null, null, null, 100, "aaa", bundle);
            System.out.println("有序的长的,收到么,我发了");
        }
    }
     
    发送者清单文件中配置一个权限值
       <permission android:name="com.itheima.permission.MYPERMISSION"></permission>
     
     
     
    定义一个广播接收者的过程:
    public class MyReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            System.out.println("收到广播");
            //通过设置接收者receive标签中,过滤器子标签的priority属性值(int类型)
            //可以给多个接受者一个优先级,越大的先收到广播,默认人值为0
            System.out.println("1得到广播里的结果码"+getResultCode());
            System.out.println("1得到广播里的结果名"+getResultData());
            //getResultExtras接受一个布尔值,如果写true,则当广播数据包里什么也没有时(bunlde是个null),可以拿到一个map,里面什么也没有
    如果写false,当广播数据包里什么也没有时,只能拿到一个null,所以都写true,可以避免空指针异常的出现
            System.out.println("1得到广播里的结果数据包"+getResultExtras(true).getString("name")+","+getResultExtras(true).getInt("age"));
            
            //收到广播后,可以对广播内容进行修改,这样优先级低的接收者得到的广播内容就是被改过的了
            
    /*        setResultCode(250);
            setResultData("bbb");
            setResultExtras(new Bundle());*/
            
            //一句话搞定:
            Bundle bundle=new Bundle();
            bundle.putString("name", "小孙");
            bundle.putInt("age",23);
            setResult(250, "bbb", bundle);
            
            //abortBroadcast()设置中断广播后,后面的接收者就收不到任何广播了
        }
     
    }
     
    广播接收者配置清单中的配置信息:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.itheima.myreceiver"
        android:versionCode="1"
        android:versionName="1.0" > 
        <uses-sdk android:minSdkVersion="10" />
        <uses-permission android:name="com.itheima.permission.MYPERMISSION"/>
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >        
            <receiver android:name=".MyReceiver">
                <intent-filter android:priority="2">
                    <action android:name="com.itheima.action.TEST"/>
                </intent-filter>
            </receiver>       
        </application>
    </manifest>

  • 相关阅读:
    php if() 括号中为 真详解
    php 写入日志
    trim,rtrim,ltrim详解
    SQlite3 的简单用法。 调用本地时间
    RuntimeError at /host You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your fo
    D3.js 入门系列3
    js中const,var,let区别
    D3.js 入门系列2 — 选择元素和绑定数据
    D3.js 入门系列1
    SVG 教程03
  • 原文地址:https://www.cnblogs.com/94007boy/p/2797490.html
Copyright © 2020-2023  润新知