广播接收器是粘性的还是 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/