Android第一行代码——第五章详解广播机制

广播机制

1.标椎广播

完全异步执行的广播,广播发出后,所有的广播接收器几乎在同一时刻接收到这条广播消息。

2.有序广播

同步执行的广播,此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并可以阻断正在传递的广播。

接收系统广播

1,动态接收

					//动态注册监听网络变化
//1.创建一个类继承自BroadcastReceiver,即创建广播接收器,当有广播到来时,
//onReceive()方法就会得到执行,在这个方法中处理收到广播后的逻辑
class ChangeReceiver extends BroadcastReceiver{
    
    

        @Override
        public void onReceive(Context context, Intent intent) {
    
    

            ConnectivityManager connectivityManager = (ConnectivityManager)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 unavailable",Toast.LENGTH_SHORT).show();
            }
        }
    }
    private IntentFilter intentFilter;
    private ChangeReceiver changeReceiver;
 	@Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //2.获取IntentFilter实例,添加相应的action
        intentFilter  = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        //3.创建BroadcastReceiver类的子类对象
        changeReceiver = new ChangeReceiver();
        //4.注册:
        registerReceiver(changeReceiver,intentFilter);
 }
  @Override
    protected void onDestroy() {
    
    
        super.onDestroy();
        //5.取消注册
        unregisterReceiver(changeReceiver);
    }
    

2,静态接收

1.创建广播接收器
public class BootCompleteReceiver extends BroadcastReceiver {
    
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
    
        Toast.makeText(context,"Boot Complete",Toast.LENGTH_SHORT).show();
    }
}
2.在AndroidManifest.xml文件中进行静态注册
 <receiver
    android:name=".BootCompleteReceiver"
    android:enabled="true"		//	是否启用这个广播接收器
    android:exported="true">	//是否允许这个广播接收器接收本程序以外的广播
  	<intent-filter>
     	<action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
 </receiver>

发送自定义广播

Android8.0 静态receiver接收不到隐式广播

1.发送标椎广播

1. 创建广播接收器对广播进行静态接收
public class MyBroadcastReceiver extends BroadcastReceiver {
    
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
    
        Toast.makeText(context,"收到了",Toast.LENGTH_SHORT).show();
    }
}
  <receiver
      android:name=".MyBroadcastReceiver"
      android:enabled="true"
      android:exported="true">
      <intent-filter>
          <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
      </intent-filter>
 </receiver>
2. 写发送广播的逻辑
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.setPackage(getPackageName());
sendBroadcast(intent);

2.发送有序广播

注:由于我们在发送广播时给intent指定了包,所以广播在别的程序中接收不到,在测试时可换成同一程序测试接收顺序

参考博客

1.在写发送广播逻辑时吧sendBroadcast(intent);换成sendOrderedBroadcast(intent,null);
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.setPackage("com.example.revise_5");
sendOrderedBroadcast(intent,null);
2.可设置广播接收器的优先级
 <receiver
     android:name=".MyBroadcastReceiver"
     android:enabled="true"
     android:exported="true">
     <intent-filter android:priority="100">
          <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
     </intent-filter>
 </receiver>
2.设置是否截断
public class MyBroadcastReceiver extends BroadcastReceiver {
    
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
    
        Toast.makeText(context,"收到了",Toast.LENGTH_SHORT).show();
        abortBroadcast();	//加上这个方法就表示将广播截断
    }
}

使用本地广播

发出的广播只能在应用程序的内部传递,并且广播接收器只能接收来自本应用程序的广播,使用之前要导v4包
	private LocalReceiver localReceiver;
	private LocalBroadcastManager localBroadcastManager;        //要导入'com.android.support:support-v4:28.0.0'

    @Override
	protected void onCreate(Bundle savedInstanceState) {
    
    
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.activity_main);
	    // 第一步:获取LocalBroadcastManager实例
	    localBroadcastManager = LocalBroadcastManager.getInstance(this);        //获取实例   
	    //第二步:获取IntentFilter实例,并添加相应的action
	    intentFilter = new IntentFilter();
	    intentFilter.addAction("com.example.revise_5.LOCAL_BROADCAST");
	    //第三步:创建广播接收器实例
	    localReceiver  = new LocalReceiver();
	    //第四步:注册	   
	 localBroadcastManager.registerReceiver(localReceiver,intentFilter);
	
	}

    @Override
    protected void onDestroy() {
    
    
        super.onDestroy();
        //第五步:取消注册
        localBroadcastManager.unregisterReceiver(localReceiver);
    }

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

强制下线功能

demo_Broadcast

猜你喜欢

转载自blog.csdn.net/haazzz/article/details/108563154