广播接收器是粘性还是意图粘性? 据我所知 - “粘性意图是那些在广播后留下的意思。没有粘性广播接收器这样的东西;只有接收者可以听到粘性意图。”
但是我们如何使意图变得粘稠? sendStickyBroadcast(intentA)是使intentA变粘的唯一方法吗?如果是,如果我同时调用 sendStickyBroadcast(intentA)和 sendBroadcast(intentA),会发生什么?意图A是否可用于未来的接收器?
我想用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());
}
}
和LOGS:
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()返回的意图不是NULL,因为它不是 sendStickyBroadcast()?
答案 0 :(得分:2)
广播接收器是粘性还是意图粘性?
如果您拥有发送此类广播的适当权限,则通过Intent
发送的广播sendStickyBroadcast()
是粘性的。
sendStickyBroadcast(intentA)是使intentA变粘的唯一方法吗?
是
如果是,如果我同时调用sendStickyBroadcast(intentA)和sendBroadcast(intentA)会发生什么?意图A是否可用于未来的接收器?
AFAIK,行为没有记录。我不建议使用那种模式。
为什么执行onReceive()方法& registerReceiver()返回的意图不是NULL,因为它不是sendStickyBroadcast()?
也许您之前为同一个操作字符串发送了粘性广播。重新启动您的设备或模拟器并再次尝试测试。