sendStickyBroadcast和sendStickyOrderedBroadcast
sendStickyBroadcast和sendStickyOrderedBroadcast - 牛仔的移動開發博客 - 博客頻道 - CSDN.NET
sendStickyBroadcast和sendStickyOrderedBroadcast發出的廣播會一直滯留(等待),以便有人
注冊這則廣播消息后能盡快的收到這條廣播。其他功能與sendBroadcast相同。但是使用sendStickyBroadcast 發送廣播需要獲得BROADCAST_STICKY?permission,如果沒有這個permission則會拋出異常。?
例子:
[java]?view plaincopyprint?
- package?com.android.test;??
- ??
- import?android.app.Activity;??
- import?android.content.Context;??
- import?android.content.Intent;??
- import?android.os.Bundle;??
- import?android.view.View;??
- import?android.view.View.OnClickListener;??
- import?android.widget.Button;??
- ??
- public?class?StickyBroadcastTest?extends?Activity?{??
- ???
- ?private?Button?mSendBroadcast;??
- ?private?Button?mSendStickyBroadcast;??
- ?private?Button?mNextActivity;??
- ?private?Context?mContext;??
- ???
- ?private?int?mStickyBrcCount;??
- ????
- ????/**?Called?when?the?activity?is?first?created.?*/??
- ????@Override??
- ????public?void?onCreate(Bundle?savedInstanceState)?{??
- ????????super.onCreate(savedInstanceState);??
- ????????setContentView(R.layout.main);??
- ????????mContext?=?getApplicationContext();??
- ????????mSendBroadcast?=?(Button)findViewById(R.id.broadcast);??
- ????????mSendStickyBroadcast?=?(Button)findViewById(R.id.stickybroadcast);??
- ????????mNextActivity?=?(Button)findViewById(R.id.next_activity);??
- ??????????
- ????????mSendBroadcast.setOnClickListener(new?OnClickListener()?{??
- ?????
- ???@Override??
- ???public?void?onClick(View?v)?{??
- ??????
- ????Intent?intent?=?new?Intent("com.android.action.broadcast");??
- ????mContext.sendBroadcast(intent);??
- ???}??
- ??});??
- ??????????
- ????????mSendStickyBroadcast.setOnClickListener(new?OnClickListener()?{??
- ?????
- ???@Override??
- ???public?void?onClick(View?v)?{??
- ????mStickyBrcCount++;??
- ????Intent?intent?=?new?Intent("com.android.action.sticky.broadcast");??
- ????intent.putExtra("sent_count",?mStickyBrcCount);??
- ????mContext.sendStickyBroadcast(intent);??
- ??????
- ???}??
- ??});????
- ????????mNextActivity.setOnClickListener(new?OnClickListener()?{??
- ?????
- ???@Override??
- ???public?void?onClick(View?v)?{??
- ????Intent?intent?=?new?Intent(StickyBroadcastTest.this,?MyReceiverActivity.class);??
- ????startActivity(intent);?????
- ??????
- ???}??
- ??});??
- ????}??
- ??
- ?@Override??
- ?protected?void?onResume()?{??
- ??//?TODO?Auto-generated?method?stub???
- ??super.onResume();??
- ??mStickyBrcCount?=?0;??
- ?}??
- ?????
- }??
- ??
- ???
- //MyReceiverActivity????
- package?com.android.test;??
- ??
- import?android.app.Activity;??
- import?android.content.BroadcastReceiver;??
- import?android.content.Context;??
- import?android.content.Intent;??
- import?android.content.IntentFilter;??
- import?android.os.Bundle;??
- import?android.util.Log;??
- ??
- public?class?MyReceiverActivity?extends?Activity?{??
- ??
- ?private?IntentFilter?mIntentFilter;??
- ?private?final?static?String?TAG?=?"MyReceiverActivity";??
- ????/**?Called?when?the?activity?is?first?created.?*/??
- ????@Override??
- ????public?void?onCreate(Bundle?savedInstanceState)?{??
- ????????super.onCreate(savedInstanceState);??
- ????????setContentView(R.layout.broadcast_receiver);??
- ??????????
- ????????mIntentFilter?=?new?IntentFilter();?????
- ????????mIntentFilter.addAction("com.android.action.broadcast");?????
- ????????mIntentFilter.addAction("com.android.action.sticky.broadcast");?????
- ??
- ????}??
- ???????
- ?private?BroadcastReceiver??mReceiver?=?new?BroadcastReceiver?()?{??
- ??@Override??
- ??public?void?onReceive(Context?context,?Intent?intent)?{??
- ???final?String?action?=?intent.getAction();??
- ???int?count?=?intent.getIntExtra("sent_count",?-1);??
- ???Log.d(TAG,?"action?=?"?+?action?+?"and?count?=?"?+?count);??
- ?????
- ???//context.removeStickyBroadcast(intent);???
- ??}??
- ?};??
- ??
- ?@Override??
- ?protected?void?onPause()?{??
- ??//?TODO?Auto-generated?method?stub???
- ??super.onPause();??
- ??unregisterReceiver(mReceiver);?????
- ??
- ?}???
- ??
- ?@Override??
- ?protected?void?onResume()?{??
- ??//?TODO?Auto-generated?method?stub?????
- ??super.onResume();??
- ??registerReceiver(mReceiver,?mIntentFilter);???
- ?}??
- ?????
- }??
運行結果如圖:
首先點擊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 ;
轉載于:https://www.cnblogs.com/seven1979/p/4333070.html
總結
以上是生活随笔為你收集整理的sendStickyBroadcast和sendStickyOrderedBroadcast的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么我玩英雄啵咕第3关就一直卡回合,好
- 下一篇: 关于我捡的一只很怕人的流浪猫的求助TAT