Android学习 - sendBroadcast和sendStickyBroadcast

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无输出,因为没有广播发出自然就不会有人响应了。(onPauseunregisterReceiver了)

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 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值