定义
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"/>
发表回复