美文网首页
第五章--广播机制

第五章--广播机制

作者: dong_hui | 来源:发表于2017-03-14 00:36 被阅读27次

1.广播机制简介

  • 标准广播 :是一种完全异步执行的广播,广播发出后,所有的广播接收器几乎在同一时刻接收到这条广播消息。(无法被截断)

  • 有序广播:是一种同步执行的广播,广播发出后同一时刻只有一个广播接收器能接收到这条广播消息。当这个广播接收器的逻辑执行完毕后,广播才会继续传递,优先级高的先收到广播。(可截断)

2.接收系统广播

  • 动态注册监听网络变化
   private NetworkChangeReceiver  networkChangeReceiver;
   private IntentFilter  intentFilter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        intentFilter=new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver=new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
        ActivityCollector.removeActivity(this);

    }
//获取网络状态的广播,可在networkInfo得到一些网络信息
public class NetworkChangeReceiver  extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager  connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo  networkInfo=connectivityManager.getActiveNetworkInfo();
        if (networkInfo!=null&&networkInfo.isAvailable()){
            Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(context,"network is not available",Toast.LENGTH_SHORT).show();
        }
    }
}

  • 静态注册实现开机启动
    manifest文件中注册广播
        <receiver 
            android:name=".broadcast.NetworkChangeReceiver"
            android:enabled="true"
            android:exported="true"     
            >
        <intent-filter>   
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
</receiver>

注:onReceive()方法中不要添加过多逻辑或耗时操作,因为在广播接收器中不允许开启线程。

3.发送自定义广播

  • 发送标准广播
    //发送广播名字与接收需一样
      Intent  intent1=new Intent("com.study.dh.lockapp.broadcast.MY_BROADCAST");
      sendBroadcast(intent1);
    <receiver android:name=".broadcast.MyBroadcastReceiver">
            <intent-filter>
                <action android:name="com.study.dh.lockapp.broadcast.MY_BROADCAST" ></action>
            </intent-filter>
        </receiver>
  • 发送有序广播
    //发送广播名字与接收需一样
      Intent  intent1=new Intent("com.study.dh.lockapp.broadcast.MY_BROADCAST");
      sendOrderedBroadcast(intent1);

增加优先级

       <receiver android:name=".broadcast.MyBroadcastReceiver"
            >
            <intent-filter android:priority="100" >
                <action android:name="com.study.dh.lockapp.broadcast.MY_BROADCAST" ></action>
            </intent-filter>
        </receiver>

注:有序广播可截断

public class MyBroadcastReceiver  extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
        abortBroadcast();
    }
}
  • 本地广播,只能在应用程序的内部进行传播,并且广播接收器也只能接收来自本应用程序发出的广播
public class ThirdActivity extends AppCompatActivity {
    private IntentFilter  intentFilter;
    private LocalReceiver  localReceiver;
    private LocalBroadcastManager  localBroadcastManager;

    class  LocalReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"local broadcast",Toast.LENGTH_SHORT).show();

        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);

        localBroadcastManager= LocalBroadcastManager.getInstance(this);

        findViewById(R.id.sendbroadcast_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent  intent=new Intent("com.dh.lockapp.MyBroadcastReceiver");
                localBroadcastManager.sendBroadcast(intent);
            }
        });

        intentFilter=new IntentFilter();
        intentFilter.addAction("com.dh.lockapp.MyBroadcastReceiver");
        localReceiver=new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver,intentFilter);
    }
}

4. 广播的最佳实验--强制下线

  • 思路:关闭掉所有功能,回到登陆界面。 -->发送广播通知程序强制用户下线。 --> 强制下线的逻辑应该写在广播接收器里。-->广播接收器需要弹出一个对话框组织用户操作。-->需在BaseActivity动态注册一个广播接收器,因为所有的活动都是继承自BaseActivity。
public class BaseActivity extends AppCompatActivity {
    private ForceOfflineReceiver  forceOfflineReceiver;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityCollector.addActivity(this);

    }

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter  intentFilter=new IntentFilter();
        intentFilter.addAction("com.dh.lockapp.forceofflinebroadcast");
        forceOfflineReceiver=new ForceOfflineReceiver();
        registerReceiver(forceOfflineReceiver,intentFilter);


    }

    @Override
    protected void onPause() {
        super.onPause();
        if (forceOfflineReceiver!=null){
            unregisterReceiver(forceOfflineReceiver);
            forceOfflineReceiver=null;
        }
    }

    class   ForceOfflineReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(final Context context, Intent intent) {
            AlertDialog.Builder builder=new AlertDialog.Builder(context);
            builder.setTitle("warmming")
                    .setMessage("强制下线,重新登陆")
                    .setPositiveButton("ok", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            ActivityCollector.finishAll();    //结束掉所有活动,并跳转至登陆界面
                            Intent  intent1=new Intent(context,LoginActivity.class);
                            startActivity(intent1);
                        }
                    })
                    .setCancelable(false);
            builder.show();

        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}

//在需要强制下线的地方发送一条广播即可
   Intent  intent=new Intent("com.dh.lockapp.forceofflinebroadcast");
   sendBroadcast(intent);

相关文章

  • 第一行代码 阅读笔记(5-9章)

    作者:Mr.Egg状态:完成转载请注明 一.第五章 (本章只理解了大概) 1.广播机制 广播分为标准广播与有序广播...

  • 第五章--广播机制

    1.广播机制简介 标准广播 :是一种完全异步执行的广播,广播发出后,所有的广播接收器几乎在同一时刻接收到这条广播消...

  • Android广播

    参考:Android总结篇系列:Android广播机制Android广播机制 一. 广播 1. 广播是什么? 广播...

  • Android - base - Broadcast

    四大组件之广播 大纲 广播机制简介 广播接收器 广播发信器 接收系统广播 发送自定义广播 本地广播 #广播机制简介...

  • broadcast基础

    广播机制简介 什么是广播,就是字面意思,我们生活中有很多广播的例子。Android提供了广播机制,便于进行系统级别...

  • 广播机制

    1.广播机制  Android设备中,各种事件时有发生。WiFi时有时无,软件装卸,电话接打,短信收发,等等。许多...

  • 广播机制

    广播机制 动态注册 所谓动态注册是指注册逻辑是写在onCreate()中的,即必须要在程序启动之后才能接收到广播。...

  • 广播机制

    标准广播是一种异步广播,几乎所有注册监听这类广播的广播接收器都可以同时收到广播消息,效率比较高,无法截断。 有序广...

  • Android学习(三)—— 四大组件之Boradcast Re

    本文目录结构:一、广播机制简介二、接收系统广播三、发送自定义广播四、使用本地广播 一、广播机制简介 定义: 类似于...

  • 关于Broadcast Receiver的知识点

    一,广播 二,实现广播 三,广播实现机制 四,LoacalBroadcastManager详解 ...

网友评论

      本文标题:第五章--广播机制

      本文链接:https://www.haomeiwen.com/subject/tebqnttx.html