zoukankan      html  css  js  c++  java
  • broadcast广播机制的学习

    广播机制:标准广播,有序广播

    标准广播:发一条广播,所有广播接收器都会收到这条广播

    顺序广播:发一条广播,广播接收器按照优先权,从大到小先后接收这条广播,当优先权大的广播接收器拦截正在传播的该广播,后面的接收器将接收不到信息

    广播接收器:可以自由对自己感兴趣的广播进行注册(当有相应的广播发出时,广播接收器就可以接收到该广播,并在内部做处理)

    注册广播的方式:

    1. 动态注册(在代码中注册)

    public class MainActivity extends AppCompatActivity{
        private IntentFilter intentFilter;
        private NetworkChangeReceiver receiver;
        public void onCreate(Bundle saveInstanceState){
              super.onCreate(saveInstanceState);
              setContentView(R.layout.main);
              //意图过滤器,用来添加我们要监听的广播
               intentFilter = new IntentFilter();
               intentFilter.addAction("这里添加我们一条广播");
               receiver = new NetworkChangeReceiver();
               registerReceiver(receiver,intentFilter);//将广播注册到我们定义的广播接收器
              
        }  
    
    /**
    **定义一个广播接收器,实现onReceive(Context context,Intent intent)方法
    */
    
        class NetworkReceiver extends BroadcastReceiver{
    
                public void onReceive(Context context,Intent intent){
    
                    //接收到系统发来的广播后进行一系列内部操作    
               }
        }
    }

    2. 静态注册(在AndroidManifest.xml文件中注册)

    通过Android studio创建一个BroadcastReceiver,实现onReceive()方法

    在AndroidManifiest.xml文件中,需要注册我们定义的广播接收器

    <reveiver
        android:name=".MyBroadCastReceiver"
        android:enabled="true"
        android:exported="true">
    
    <!--添加intent-filter-->
        <intent-filter>
               <action android:name="my.example.broadcast"
        </intent-filter>
    </receiver>

    ******************注意:不要在onReceive()方法中添加过多逻辑或耗时操作************************

    在做了上述注册之后,当接收器收到一条my.example.broadcast的广播,系统将会执行onReceive()中的方法

    比如:我们通过点击button来发送一条广播

    public class MainActivity extends BaseActivity{
        ....
    ......
        public void onCreate(Bundle saveInstance){
                ....
               Button button  =  (Button)findViewById(R.id.bt);
                button.setOnclickListener(new OnClickListener){
                       public void onClick(View v){
                          Intent intent = new Intent("my.example.broadcast"); 
    sendBroadcast(intent);///当改为sendOrderedBroadcast(intent,null),会发送有序广播

    } } } }

    上述代码:当点击button时,会触发广播接收器

    有序广播,无序广播,都具有全局性,尽管有序广播可以通过在每个应用中对intent-filter的android:priority=""对我们要监听的广播设置权重,从而在onReceive()中通过abortBroadcast()方法中断广播传送,但是仍然存在安全性问题,可以通过本地广播,来避免问题。

    本地广播:主要使用LocalBroadcastManager对广播进行管理

    public class LocalBroacastActivity extends AppCompatActivity {
        private Button bt;
        private IntentFilter intentFilter;
        private LocalReceiver localReceiver;
        private LocalBroadcastManager localBroadcastManager;
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_broad);
            localBroadcastManager = LocalBroadcastManager.getInstance(this);
            bt = (Button)findViewById(R.id.button);
            bt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent("com.example.broadcasttest.LOCAL");
                    localBroadcastManager.sendBroadcast(intent);
                }
            });
            intentFilter = new IntentFilter();
            intentFilter.addAction("com.example.broadcasttest.LOCAL");
            localReceiver = new LocalReceiver();
            localBroadcastManager.registerReceiver(localReceiver,intentFilter);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            localBroadcastManager.unregisterReceiver(localReceiver);
        }
    
        class LocalReceiver extends BroadcastReceiver{
    
            @Override
            public void onReceive(Context context, Intent intent) {
                Toast.makeText(context,"receiver",Toast.LENGTH_LONG).show();
            }
        }
    }

    实现强制下线功能

  • 相关阅读:
    java 算法最长连续递增子序列
    java 算法最长连续递增序列
    最大连续子数组和(Java)
    mysql时间序列与窗口函数
    CSS控制br高度
    小知识随手记(九):兄弟选择器(~和+)区别
    VUE组件递归实现自定义目录及拖拽效果
    VUE的插件解析
    VUE的mixin混入解析
    VUE高阶组件解析
  • 原文地址:https://www.cnblogs.com/yfafa/p/8920818.html
Copyright © 2011-2022 走看看