入门Android开发--第一行代码--笔记系列(广播)

广播机制

分为标准广播和有序广播

标准广播直接对所有设有接收器的应用发送广播

有序广播则是按顺序依次发给接收器1、2、3,其中任何一个接收器都可以截断广播


接受广播(不要在onReceive中进行耗时操作,会报错。也不允许开启线程)

动态注册以监听网络变化为例

public class MainActivity extends AppCompatActivity {


    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;

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

        intentFilter=new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//这个过滤action的语句是哪里找的呢。
        networkChangeReceiver=new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver,intentFilter);
    }

    class NetworkChangeReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"network changes",Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }
}
可以修改网络接收器类,修改具体的NetworkChange

 class NetworkChangeReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectionManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo=connectionManager.getActiveNetworkInfo();//检查是否已经激活示例
            if(networkInfo!=null && networkInfo.isAvailable()){
                Toast.makeText(context,"network available",Toast.LENGTH_SHORT).show();
            }
            
        }
    }

静态注册实现接受开机启动广播

动态的注册方式写在onCreate方法中,需要程序启动后才能接受。而静态的可以开机启动,接受广播后产生业务。

不在内部创建,直接新建一个类

然后在配置文件中添加权限RECEIVE_BOOT_COMPLETED,和注册receiver(和activity类似),并添加过滤action.BOOT_COMPLETED


发送自定义广播

 Intent intent=new Intent("com.example.MY_BROADCAST");//设置接受器一样的过滤条件就可以了
 sendBroadcast(intent);//标准广播
sendOrderedBroadcast(intent,null)<span style="font-family:Arial, Helvetica, sans-serif;">;//有序广播</span><pre name="code" class="html"><span style="font-family:Arial, Helvetica, sans-serif;">//有序广播需要在配置中设置优先级 android:priority="100" //100是例子</span>
<span style="font-family:Arial, Helvetica, sans-serif;">有序广播在onReceive之后,可以abortBroadcast() 来截断广播</span>



本地广播

前面提到的都是全局广播,可以被任何程序接收。我们需要有隐私的“本地”机制

很简单,就是使用LoalReceiver,和LocalBroadcastManager。具体代码就不打了。估计也很好找

本地广播无法使用静态注册实现(本来就是本地的。。肯定启动应用之后用啊)


使用广播实现强制下线功能

需要用到前文的一个activityCollectorUtil类,来实现不管在哪个界面,接到通知就退到登录界面的功能。

由于代码有点多。。直接贴比较核心的部分吧。其他自己琢磨吧。嘿嘿

public class OfflineReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, Intent intent) {
        AlertDialog.Builder builder=new AlertDialog.Builder(context);
        builder.setTitle("警告");
        builder.setMessage("别处登录,是否下线");
        builder.setCancelable(false);//很关键,这样不能用过返回键关闭对话框
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                ActivityCollectorUtil.finishAll();//关闭栈内所有的activity
                Intent intent=new Intent(context,LoginActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//新的任务栈里,不然从广播接收器里打开后,返回会有问题。
                context.startActivity(intent);
            }
        });
        AlertDialog alertDialog=builder.create();
        //需要将AlertDialog设置成系统级别的
        alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);//需要配置权限
        alertDialog.show();
    }
}




你可能感兴趣的:(入门Android开发--第一行代码--笔记系列(广播))