• Broadcast Receiver广播接收器


    1.概述

    广播接收器不仅能接受来自系统的内容,也可以接受来自其他app的内容。广播分为标准广播和有序广播。

    2.标准广播

    一种完全异步执行的广播,在广播发出之后几乎所有的广播接收器都在同一时刻接受到广播信息。没有任何顺序可言。但这种广播无法被拦截。

    基本的使用:重写onReceiver

    public class MyBroadcastReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
    
            String s=intent.getStringExtra("key");
            Toast.makeText(context,s+"--1",Toast.LENGTH_SHORT).show();
        }
    }
        <receiver android:name=".MyBroadcastReceiver">
    
                <!-- 指定能够接收的广播类型 -->
                <intent-filter >
                    <action android:name="aaaa" />
                </intent-filter>
            </receiver>
                    Intent intent=new Intent();
                    intent.setAction("aaaa");
                    intent.putExtra("key","输入的value");
                    /**
                     * 发送普通广播
                     */
                  MainActivity.this.sendBroadcast(intent);

    3.有序广播

    一种同步执行的广播,在广播发送出后,同一时刻只能有一个广播接收器能够收到这个广播,当这个广播接收器中的逻辑处理完毕后才会继续传递。优先级高德接收器先接收到广播,且前面的广播接收器还可以拦截广播,这样后面的广播接收器就接受不到广播了。(优先级相同时,按照注册次序接收广播)

    优先级取值:  -1000~1000(优先级低-->高)

    示例:

    注册2个广播接收器:

      <receiver android:name=".MyBroadcastReceiver">
    
                <!-- 指定能够接收的广播类型 -->
                <intent-filter android:priority="50">
                    <action android:name="aaaa" />
                </intent-filter>
            </receiver>
            <receiver
                android:name=".MyReceiver"
                android:enabled="true"
                android:exported="true">
                <intent-filter android:priority="100">
                    <action  android:name="aaaa"/>
                    </intent-filter>
            </receiver>
    public class MyBroadcastReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
    
            String s=intent.getStringExtra("key");
            Toast.makeText(context,s+"--1",Toast.LENGTH_SHORT).show();
        }
    }
    public class MyReceiver extends BroadcastReceiver {
    
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
    
            String s=intent.getStringExtra("key");
    
    
            Toast.makeText(context,s+"---2",Toast.LENGTH_SHORT).show();
            /**
             * 中断,只对有序广播起作用
             */
            abortBroadcast();
        }
    }
               Intent intent=new Intent();
                    intent.setAction("aaaa");
                    intent.putExtra("key","输入的value");
                   
                    /**
                     * 发送有序广播
                     */
    
                    sendOrderedBroadcast(intent, null);

    如上,发送广播,只会执行 Toast.makeText(context,s+"---2",Toast.LENGTH_SHORT).show();

    4.广播的动态注册:

    上面在Xml配置文件中配置为静态注册,那么动态注册广播代码如下:

    IntentFilter intentFilter;
    MyReceiver myReceiver;
            myReceiver=new MyReceiver();
            intentFilter=new IntentFilter();
            intentFilter.addAction("aaaa");
            /**
             * 设置优先级
             */
            intentFilter.setPriority(100);
            registerReceiver(myReceiver,intentFilter);

     5.本地广播

    为了解决广播的安全性问题,Adnroid引入了一套本地广播机制。使用这个机制发出的广播只能在应用程序内部使用,并且广播接收器也只能接受本地发出的广播。主要的使用是引入了一个loaclBroadcastManager对广播进行管理。

    public class MainActivity extends AppCompatActivity {
    
        Button btn;
        IntentFilter intentFilter;
        LocalReceiver localReceiver;
        LocalBroadcastManager localBroadcastManager;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            localBroadcastManager=LocalBroadcastManager.getInstance(this);
            /**
             * 注册本地广播
             */
            localReceiver=new LocalReceiver();
            intentFilter=new IntentFilter();
            intentFilter.addAction("aaaa");
            localBroadcastManager.registerReceiver(localReceiver,intentFilter);
    
    
    
            btn= (Button) findViewById(R.id.btn);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent=new Intent();
                    intent.setAction("aaaa");
                    intent.putExtra("key","输入的value");
                   localBroadcastManager.sendBroadcast(intent);
    
                }
            });
        }
    
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            localBroadcastManager.unregisterReceiver(localReceiver);
        }
    
        class LocalReceiver extends BroadcastReceiver{
    
            @Override
            public void onReceive(Context context, Intent intent) {
                String s=intent.getStringExtra("key");
                Toast.makeText(context,s+"***",Toast.LENGTH_SHORT).show();
            }
        }
    }
    今天多一点积累,明天少一分烦恼
  • 相关阅读:
    远程桌面连接(mstsc)
    google浏览器网页截取全屏
    Guava缓存工具类封装和使用
    The project description file (.project) for XXX is missing
    国际化常用时间格式并进行格式转换
    MySQL 查询索引失效及如何进行索引优化
    The requested URL could not be retrieved
    java.util.zip.ZipException: invalid LOC header (bad signature)
    熊猫破解 --- 软件分享站
    「在线宣传利器」上传文档转为翻页电子书,生成链接二维码
  • 原文地址:https://www.cnblogs.com/galibujianbusana/p/6435670.html
Copyright © 2020-2023  润新知