广播机制
分为标准广播和有序广播
标准广播直接对所有设有接收器的应用发送广播
有序广播则是按顺序依次发给接收器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(); } }