sendStickyBroadcast 的理解和使用

转载 2012年03月21日 08:42:18

要知道区别首先需要看一下Android Developers Reference, 它可是我们最好的老师了,sendBroadcast 大家应该都会用了我就不赘述了,下面来看看sendStickyBroadcast

google官方的解释是:

Perform a sendBroadcast(Intent) that is "sticky," meaning the Intent you are sending stays around after the broadcast is complete, so that others can quickly retrieve that data through the return value ofregisterReceiver(BroadcastReceiver, IntentFilter). In all other ways, this behaves the same assendBroadcast(Intent).

You must hold the BROADCAST_STICKY permission in order to use this API. If you do not hold that permission,SecurityException will be thrown.

大概的意思是说: 发出的广播会一直滞留(等待),以便有人注册这则广播消息后能尽快的收到这条广播。其他功能与sendBroadcast相同。但是使用sendStickyBroadcast 发送广播需要获得BROADCAST_STICKY permission,如果没有这个permission则会抛出异常。

 

这个解释看了后似懂非懂的,于是就写了个例子试了下,下面把代码贴出了,希望能还大家一起讨论

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无输出,这是当然的了~~~因为没有广播发出自然就不会有人响应了。

按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方法可以帮你,处理完了后就将它删除吧。

 

如果有什么不对的地方欢迎大家指教+拍砖。


相关文章推荐

StickyBroadcast在获取电池状态中的妙用

StickyBroadcast在获取电池状态中的妙用           今天在做开发的时候,突然遇到这样的一个问题,当你的设备电量低于15%的时候这个时候设备的闪光灯是无法打开的,但是我们平台...

sendStickyBroadcast和sendStickyOrderedBroadcast

sendStickyBroadcast和sendStickyOrderedBroadcast发出的广播会一直滞留(等待),以便有人注册这则广播消息后能尽快的收到这条广播。其他功能与sendBroadc...

sendStickyBroadcast 的理解和使用

要知道区别首先需要看一下Android Developers Reference, 它可是我们最好的老师了,sendBroadcast 大家应该都会用了我就不赘述了,下面来看看sendStickyBr...

Android 三种sendBroadCast的方式对比

作为android 的四大基本组件之一的 BroadCast Receiver,是进行进程间通信的重要手段,几乎所有的应用都会注册和发送各种不同的intent, 那么有一个问题,你是否了解Intent...

使用android中的AIDL让Service与Activity通信(service回调activity)

这几天搞了搞AIDL,终于弄明白了在AIDL中让Service调用Activity的方法 代码: 首先建立一个ICallback.aidl文件,作为Activity中的回调方法 ...

sticky INTENT

BatteryManager 会发送“sticky”类型的系统广播,在 Intent 中包括了当前的电池电量状态和充电状态等信息。 因为电池状态的广播类型是 “sticky”类型的,所以我们不需要注...
  • G_rrrr
  • G_rrrr
  • 2012-09-20 10:05
  • 3160

【Java高级】JVM内存区域模型和加载过程

JVM内存区域模型    1.方法区 也称"永久代” 、“非堆”,  它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB,最大值为64MB,可以通过-XX...

【BroadcastReceiver】StickyIntent简介

stack-over-flow上面的一个解答,什么是sticky intent? http://stackoverflow.com/questions/3490913/what-is-a-sti...

Android广播发送机制剖析【android广播系列二】

上篇博客大致说了说广播的注册机制,动态注册和静态注册广播的原理还不一样,动态广播最后HashMap中了,最后放到mReceiverResolver中,以后当ActivityManagerService...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)