BroadcastReceiver
动态注册广播(代码注册)
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver,intentFilter);
动态注册广播接收器一定都要取消注册
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
判断当前有没有网络
ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
if(networkInfo!=null && networkInfo.isAvailable()){
Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();
}
需要声明权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
静态注册广播(清单文件中注册,可以让程序在未启动的情况下就能接收到广播)
开机启动
<receiver android:name=".receiver.BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
声明权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
不要在onReceive()方法中添加过多的逻辑或者进行任何的耗时操作,因为在广播接收器中是不允许开启线程的,当onReceive()方法运行了较长时间而没有结束时,程序就会报错。因此广播接收器更多的是扮演一种打开程序其他组件的角色,比如创建一条状态栏通知,或者启动一个服务等。
自定义广播
发送标准广播
<receiver android:name=".receiver.MyBroadcastReceiver">//广播接收器
<intent-filter>
//与Intent中传递的数据一一对应
<action android:name="com.elmand6.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.elmand6.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});
广播是一种可以跨进程的通信方式,在我们应用程序内发出的广播,其他的应用程序也是可以收到的。
发送有序广播
sendOrderedBroadcast(intent,null);第二个参数是一个与权限相关的字符串
设置接收的优先级
android:priority=”100”
截断广播 abortBroadcast();
广播的安全性,本地广播机制
1.首先通过LocalBroadcastManager的getInstance()方法得到了一个实例,
2.在注册广播接收器的时候调用的是LocalBroadcastManager的registerReceiver()方法
3.在发送广播的时候调用的是LocalBroadcastManager的sendBroadcast()方法
localBroadcastManager = LocalBroadcastManager.getInstance(this);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.elmand6.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);//发送本地广播
}
});
intentFilter = new IntentFilter();
intentFilter.addAction("com.elmand6.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
//注册本地广播接收器
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
本地广播是无法通过静态注册的方式来接收的,因为静态注册主要就是为了让程序在未启动的情况下也能接收到广播,而发送本地广播时,我们的程序肯定是启动了的, 因此也完全不需要使用静态注册的功能
本地广播的几点优势
1.不需要担心机密数据泄露,
2.不需要担心有安全漏洞
3.比发送系统全局广播更加高效
例子:强制下线
//发送一个广播
forceOffline.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.elmand6.broadcastbestpractice.FORCE_OFFLINE");
sendBroadcast(intent);
}
});
//接收广播,弹出Dialog
public void onReceive(final Context context, final Intent intent) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
dialogBuilder.setTitle("Warning");
dialogBuilder.setMessage("You are forced to be offline.Please try to login again.");
dialogBuilder.setCanceSlable(false);
dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll();
Intent intent = new Intent(context, LoginActivity.class);
//根据Activity Affinity判断是否需要创建新的Task,然后再创建新的Activity实例放进去。
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
AlertDialog alertDialog = dialogBuilder.create();
//需要设置AlertDialog的类型,保证在广播接收器中可以正常弹出
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}
清单文件配置:
<receiver android:name=".receiver.ForceOfflineReceiver">
<intent-filter>
<action android:name="com.elmand6.broadcastbestpractice.FORCE_OFFLINE"/>
</intent-filter>
</receiver>
权限:允许系统弹出Dialog的权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
手机可能无法弹出AlertDialog的设置:
设置-其他应用管理-找到你写的程序-最下面的权限管理-显示悬浮窗