定义
Broadcast(播送)
:一种广泛应用在应用程序之间传输信息的机制;
BroadcastReceiver(播送接收器)
:用于接管来自零碎和其余利用的播送,并对其进行响应的组件。
注册
1. 定义播送接收者
继承 BroadcastReceiver
,实现自定义的播送接收者,实现onReceive()
办法用于承受播送
public class ExampleBroadcastReceiver extends BroadcastReceiver {private static final String TAG = ExampleBroadcastReceiver.class.getSimpleName();
private static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {if (ACTION_BOOT.equals(intent.getAction())) {Log.i(TAG, "receive boot completed broadcast");
Toast.makeText(context, "system boot completed.", Toast.LENGTH_LONG).show();}
}
}
当 onReceive()
办法执行实现之后,ExampleBroadcastReceiver
生命周期完结可能会被零碎回收,所以 onReceive()
中不倡议进行异步操作;另外,因为 ANR 限度,onReceive()
办法必须在 10 秒内执行实现。
2. 动态注册
在 AndroidManifest.xml 中注册
<manifest ...>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application ...>
<receiver
android:name=".broadcast.ExampleBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
- 动态形式注册播送,即便利用未启动,也能接管到播送,所以能够利用播送作为利用的自启动和保活机制。
- android:name:示意自定义的播送接收者类
- action:指定了接管的播送类型,这里示意承受零碎开机启动播送
- uses-permission:申明咱们须要应用到接管开机状态的权限
3. 动静注册
public class ExampleActivity extends AppCompatActivity {
private ExampleBroadcastReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceiver = new ExampleBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.BOOT_COMPLETED");
registerReceiver(myReceiver, filter);
}
@Override
protected void onDestroy() {super.onDestroy();
unregisterReceiver(myReceiver);
}
}
- 在 Activity 的
onCreate()
中通过registerReceiver
注册播送,并指定监听的播送类型;最初在 onDestory()
中关掉播送监听 - 动静形式注册播送,用户能够在须要应用时进行注册,不再应用后敞开掉播送监听,应用上更为灵便
分类
播送能够分为 无序播送 (默认)、 有序播送 、 本地播送 和粘性(Sticky)播送。
无序播送
无序播送是一种 异步执行 形式,所有播送接收者简直都能同时接管到该播送,没有先后顺序,直到没有接收者再承受播送则播送完结。
-
发送播送
public void sendCustomBroadcast(View view){Intent intent = new Intent("com.example.broadcast"); sendBroadcast(intent); }
有序播送
有序播送是一种 同步执行 形式,播送发送之后,同一时刻只会有一个播送接收者在执行播送接管,播送执行者依照优先级程序进行播送接管,而且在接管的过程中能够截断播送,前面的接收者就无奈再接管到该播送。
-
申明播送接收者优先级
<manifest ...> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <application ...> <receiver android:name=".broadcast.ExampleBroadcastReceiver" android:enabled="true" android:exported="true"> <intent-filter android:priority="100"> <action android:name="com.example.broadcast"/> </intent-filter> </receiver> </application> </manifest>
在
IntentFilter
中通过android:priority
指定优先级,值越大优先级越高 -
发送播送
public void sendOrderBroadcast(View view){Intent intent = new Intent("com.example.broadcast"); sendOrderBroadcast(intent); }
-
截断播送
@Override public void onReceive(Context context, Intent intent) {abortBroadcast(); }
在播送接收者的
onReceive()
办法中,能够通过调用abortBroadcast()
办法截断播送,优先级较低的播送接收者就无奈再接管到该播送
本地播送
本地播送是一种 部分播送,只能在本利用外部流传,播送接收者也只能接管本利用外部的播送,因为这一特点,所以本地播送不反对动态注册形式。
-
注册本地播送接收者
public class ExampleActivity extends AppCompatActivity { private ExampleBroadcastReceiver myReceiver; private LocalBroadcastManager localBroadcastManager; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myReceiver = new ExampleBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.BOOT_COMPLETED"); localBroadcastManager = LocalBroadcastManager.getInstance(this); localBroadcastManager.registerReceiver(intent, filter); } @Override protected void onDestroy() {super.onDestroy(); localBroadcastManager.unregisterReceiver(myReceiver); } }
通过
LocalBroadcastManager.getInstance()
或者本地播送治理的实例,应用该实例来注册播送接收者 -
发送播送
private void sendBroadcast() {Intent intent = new Intent("com.example.broadcast"); localBroadcastManager.sendBroadcast(intent); }
粘性播送
后面理解了几种播送类型,咱们能够晓得,当所有播送接收者解决完播送接管之后则播送完结。也就是说,只有在发送前已实现注册的播送接收者能力接管到该播送。那么如果咱们在某种状况下,播送接收者注册晚于播送发送工夫,然而咱们又想接管到该播送,该如何解决呢?这里就须要应用到 粘性播送。
- 粘性播送 在发送之后会保留刚发送过的播送,当有新注册的播送接收者注册后能够持续应用该播送,直到该播送被移除;
- 粘性播送 只会保留最初一次的播送,也就是说如果在某个播送接收者注册前,发送了多条同样的播送,那么播送接收者注册后只能接管到最初一条;
- 粘性播送 通过
sendStickyBroadcast()
发送播送,removeStickyBroadcast()
移除播送,且须要增加权限<uses-permission android:name="android.permission.BROADCAST_STICKY"/>