android - 粘性广播接收器 - 它们如何工作?

标签 android broadcastreceiver android-broadcast

广播接收器是粘性的还是 Intent 粘性的? 据我所知,“粘性 Intent 是那些在广播后仍然存在的 Intent 。不存在粘性广播接收器之类的东西;只有可以监听粘性 Intent 的接收器。”

但是我们如何让 Intent 具有粘性呢? sendStickyBroadcast(intentA) 是使 IntentA 粘性的唯一方法吗?如果是,如果我同时调用 sendStickyBroadcast(intentA)sendBroadcast(intentA) 会发生什么? IntentA 是否可供 future 的接收者使用?

我想用 Logcat 测试这个场景,但我收到了意外的日志:

public class MainActivity extends Activity {

    private static final String CUSTOM_INTENT = "com.ashok.abacussb.my_intent";
    Button button;
    Receiver1 receiver1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sendBroadcast(new Intent(CUSTOM_INTENT));
        Log.d("abd", "after sendBroadcast() "+ Thread.currentThread().getName());

        receiver1 = new Receiver1();

        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("abd", "inside onClick()");
                Intent intent = registerReceiver(receiver1, new IntentFilter(CUSTOM_INTENT));
                Log.d("abd", (intent == null ? "null": ""+intent));
            }
        });
    }
}

public class Receiver1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("abd", "inside Receiver1 onReceive() "+ Thread.currentThread().getName());
    }
}

和日志:

09-21 16:26:43.845: D/abd(26620): after sendBroadcast() main
09-21 16:26:49.665: D/abd(26620): inside onClick()
09-21 16:26:49.685: D/abd(26620): Intent { act=com.ashok.abacussb.my_intent flg=0x10 }
09-21 16:26:49.770: D/abd(26620): inside Receiver1 onReceive() main

Receiver1 在按钮单击时注册,这显然是在执行 sendBroadcast() 之后。为什么执行 onReceive() 方法并且 registerReceiver() 返回的 Intent 不为 NULL,因为它不是 sendStickyBroadcast()

最佳答案

Are Broadcast Receivers sticky or Intents sticky?

如果您拥有发送此类广播的适当权限,则通过 sendStickyBroadcast() 发送的广播 Intent 是粘性的。

Is sendStickyBroadcast(intentA) is the only way to make intentA sticky?

是的。

If yes, what would happen if I call both sendStickyBroadcast(intentA) and sendBroadcast(intentA) ? Will the intentA be available for future receivers?

据我所知,该行为没有记录。我不建议使用该模式。

Why is the onReceive() method executed & the intent returned by registerReceiver() not NULL, since it was not a sendStickyBroadcast() ?

也许您之前曾针对同一操作字符串发送过粘性广播。重新启动您的设备或模拟器并再次尝试测试。

关于android - 粘性广播接收器 - 它们如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25958635/

相关文章:

android - 如何在 facebook SDK 3.0 中启用登录?

java - 如何检查解析中是否已存在类并以编程方式创建

android - Thoughtbot Recyclerview 可扩展组不扩展

android - Android >=4.0 上的捕获媒体按钮(适用于 2.3)

java - 同时停止闹钟和闹钟铃声

java - 致命异常 : android. app.RemoteServiceException : can't deliver broadcast at android. os.Handler.dispatchMessage

java - 未通过广播监听器注册 Intent

java - 在我的主要 Activity 中将 sqlite 数据库中的值显示到 ListView 。安卓

android - AlarmManager.RTC_WAKEUP 没有唤醒设备?

android - 如何知道一天在android中何时开始?