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();
        }
    }
}

实现强制下线功能

 

posted @ 2018-04-23 22:28  大一脚步  阅读(477)  评论(0编辑  收藏  举报