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











网友评论