Broadcast 是广播接收器 可以被动接收其他应用程式/状态等等
主要需要 IntentFilter 过滤/增加intent 跟一个Reciever接收
分为静态注册 跟 动态注册
静态注册 >mainefest.xml +
动态注册 >程序要打开才可以接收广播 并可以自由控制注册跟取消
动态注册
//要先引用注册器 private CustomReciever customReciever=new CustomReciever();//Oncreate//intent注入 IntentFilter filter=new IntentFilter(); filter.addAction(Intent.ACTION_POWER_CONNECTED); filter.addAction(Intent.ACTION_POWER_DISCONNECTED); //注册 this.registerReceiver(customReciever,filter); ------------------------- OnDestroy this.unregisterReceiver(customReciever); -------------------------------- 注册器 new>Other>broadcastreciever //OnRecieve public void onReceive(Context context, Intent intent) { // TODO: This method is called when the BroadcastReceiver is receiving // an Intent broadcast. String intentAct=intent.getAction(); if (intentAct !=null){ String toast="test"; switch (intentAct){ case Intent.ACTION_POWER_CONNECTED: toast="connected"; break; case Intent.ACTION_POWER_DISCONNECTED: toast="unconnected"; break; case "com.example.Broadcast.ACTION_CUSTOM_BROADCAST": toast="custom"; break; } Toast.makeText(context, toast, Toast.LENGTH_SHORT).show(); }
静态注册+本地广播
本地广播原理:https://blog.csdn.net/u010687392/article/details/49744579
//OnCreate LocalBroadcastManager.getInstance(this).registerReceiver( customReciever,newIntentFilter("com.example.Broadcast.ACTION_CUSTOM_BROADCAST")); //OnDestroy LocalBroadcastManager.getInstance(this).unregisterReceiver(customReciever); //多一个send public void sendCustomBroadcast(View view) { Intent custom=new Intent("com.example.Broadcast.ACTION_CUSTOM_BROADCAST"); LocalBroadcastManager.getInstance(this).sendBroadcast(custom); } //manifest.xml <receiver android:name=".CustomReciever" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.example.Broadcast.ACTION_CUSTOM_BROADCAST"/> </intent-filter> </receiver>
普通广播是异步的。正常广播的接收者通常会同时以不确定的顺序运行。要发送常规广播,请创建广播意图并将其传递给sendBroadcast(Intent)。
本地广播被发送到与发送者在同一应用中的接收者 较为安全。要发送本地广播,请创建广播意图并将其传递给LocalBroadcastManager.sendBroadcast。
有序广播一次传送到一个接收机。当每个接收器执行时,它可以将结果传播到下一个接收器,或者可以取消广播,以使广播不会传递到其他接收器。要发送有序广播,请创建广播意图并将其传递给sendOrderedBroadcast(Intent, String)。
normal broadcast 所有人都会同时收到讯息 不分先后顺序
order broadcast 有先后顺序 故可以阻断
动态注册要打开程序才能接收到广播(可以自由控制注册与取消)
创一个类继承broadcast 并重写class中的onRecieve方法
private IntentFilter intentFilter; private NetworkChangeReciever networkChangeReciever; // 继承broadcast protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcast.LOCAL_BROADCAST"); //网路状态改变 networkChangeReciever = new NetworkChangeReciever(); registerReceiver(networkChangeReciever,intentFilter); Button button=(Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent( "com.example.broadcast.MY_BROADCAST" ); sendBroadcast(intent); } }); // 动态注册广播一定要取消注册 protected void onDestroy(){ super.onDestroy(); unregisterReceiver(networkChangeReciever); } class NetworkChangeReciever 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 is available",// Toast.LENGTH_SHORT).show();// } else {// Toast.makeText(context, "network is unavailable",// Toast.LENGTH_SHORT).show();// }
然后记得拿权限 在manifest.xml中加入 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
--
静态注册不用打开程序也能听到广播 在这里我们透过这个原则实现开机广播
创一个实例 BootCompleteReciever
但在manifest里面要多注册这步骤
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/><receiver android:name=".BootCompleteReceiver" android:enabled="true" android:exported="true"></receiver>
标籤
intent-filter <action android:name="android.intent.ation.BOOT_COMPLETED"/>
自定义广播
先新创一个
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO: This method is called when the BroadcastReceiver is receiving // an Intent broadcast. Toast.makeText(context, "recieve in my", Toast.LENGTH_SHORT).show(); abortBroadcast(); // 截断 后面收不到 throw new UnsupportedOperationException("Not yet implemented"); }}
manifest
<receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true"> <intent-filter android:priority="100"> //priority是先后顺序 <action android:name="com.example.broadcast.MY_BROADCAST"/> </intent-filter> </receiver>
测试有序广播
开第二个专案
public class AnotherBroadcastReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO: This method is called when the BroadcastReceiver is receiving // an Intent broadcast. Toast.makeText(context,"recieved in b ",Toast.LENGTH_SHORT).show(); throw new UnsupportedOperationException("Not yet implemented"); }}
<receiver android:name=".AnotherBroadcastReciever" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.example.broadcast.MY_BROADCAST"/> //接第一支专案的action </intent-filter> </receiver>
mainactivity.java
下面测试本地广播 本地广播安全性比较高 不会被其他城市呼叫
就只是多个本地广播监听器而已
public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private LocalReceiver localReceiver; private LocalBroadcastManager localBroadcastManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); localBroadcastManager= LocalBroadcastManager.getInstance(this); Button button=(Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override Intent intent=new Intent("com.example.broadcast.LOCAL_BROADCAST" ); localBroadcastManager.sendBroadcast(intent); //sendOrderBroadcast(intent); 有先后顺序 } }); intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcast.LOCAL_BROADCAST"); localReceiver =new LocalReceiver(); localBroadcastManager.registerReceiver(localReceiver,intentFilter); } class LocalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent){ Toast.makeText(context, "yes", Toast.LENGTH_SHORT).show(); }
重要提示:儘管意图既用于发送广播,也用于通过发起活动startActivity(Intent),但这些动作是完全无关的。广播接收者无法看到或捕获Intent用于启动活动的。同样,播放时Intent,您不能使用它Intent来查找或开始活动。
广播接收器是Android应用程序的基本组件。
广播接收器可以接收系统或应用发送的广播。
将Intent在广播机构使用的是用于启动活动的意图完全不同。
要处理Intent与广播关联的传入消息,请对BroadcastReceiver类进行子类化并实现onReceive()。
您可以在Android清单文件中或以编程方式注册广播接收器。
本地广播是您的应用私有的。要注册和发送本地广播,请使用LocalBroadcastManager。本地广播不涉及进程间通信,这使它们高效。使用本地广播还可以保护您的应用程序免受某些安全问题的影响,因为数据保留在您的应用程序内部。
要Intent为广播创建唯一的动作名称,通常的做法是在动作名称之前添加程序包名称。
如果您的应用定位到API级别26或更高级别,则不能使用清单为大多数隐式广播声明接收方。(隐式广播(包括大多数係统广播)是不针对您的应用的广播。)少数隐式广播是例外。但是,您可以使用动态接收器来接收所有广播。