sendStickyBroadcast和sendStickyOrderedBroadcast发出的广播会一直滞留(等待),以便有人注册这则广播消息后能尽快的收到这条广播。其他功能与
sendBroadcast
相同。但是使用
sendStickyBroadcast
发送广播需要获得
BROADCAST_STICKY
权限,如果没有这个则会抛出异常。
public class MainActivity extends Activity {
Button btnSendi;
Button btnSends;
Button btnStart;
Context mContext;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSendi = (Button) findViewById(R.id.sendi);
btnSends = (Button) findViewById(R.id.sends);
btnStart = (Button) findViewById(R.id.start);
mContext = getApplicationContext();
btnSendi.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("com.android.my.action");
intent.setFlags(1);
mContext.sendBroadcast(intent);
}
});
btnStart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
ReceiverActivity.class);
startActivity(intent);
}
});
btnSends.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("com.android.my.action.sticky");
intent.setFlags(2);
mContext.sendStickyBroadcast(intent);
}
});
}
}
public class ReceiverActivity extends Activity {
private IntentFilter mIntentFilter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIntentFilter = new IntentFilter();
mIntentFilter.addAction("com.android.my.action");
mIntentFilter.addAction("com.android.my.action.sticky");
}
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
System.out.println("action" + action);
}
};
@Override
protected void onResume() {
super.onResume();
registerReceiver(mReceiver, mIntentFilter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mReceiver);
}
}
首先点击
next Activity
从代码中可以看到
receiver
已经注册,但
Log
无输出,因为没有广播发出自然就不会有人响应了。(
onPause
里
unregisterReceiver
了)
按
back
后退到上图
,
下面分别点击
send broadcast
和
send stickybroadcast
按钮,随便点击几次,此时对应的
receiver
并没有注册,所以是不会有人响应这两条广播的。然后点击
next activity
,当打开新的
activity
后对应的
receiver
被注册,此时从日志中就能看出已经收到了
send stickybroadcast
发出的广播,但没有
send broadcast
发出的广播。这就是
sendStickyBroadcast
的特别之处,它将发出的广播保存起来,一旦发现有人注册这条广播,则立即能接收到。
日志打印为:
action = com.android.action.sticky.broadcastand count = 4
从上面的日志信息可以看出
sendStickyBroadcast
只保留最后一条广播,并且一直保留下去,这样即使已经处理了这条广播但当再一次注册这条广播后依然可以收到它。
如果你只想处理一遍,
removeStickyBroadcast
方法可以帮你,处理完了后就将它删除吧。
sticky
形式的
intent
,接收者可以为空
,
接收者为空时,通常是获取最后一个保存广播的
intent
,从而获取
intent
里的值,不如获取电池的电量:
因为
BatteryManager
发送的是
sticky
形式的
intent
,所以接收者可以为空
。
Intent batteryStatus = registerReceiver(null, ifilter);
//得到电池当前的状态(共有5种,包括unkonwn、charging、discharging、not charging、full)
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
//是否处于充电状态
boolean isCharging = BatteryManager.BATTERY_STATUS_CHARGING ;