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

时间:2014-09-21 11:19:25

标签: android broadcastreceiver android-broadcast

广播接收器是粘性还是意图粘性? 据我所知 - “粘性意图是那些在广播后留下的意思。没有粘性广播接收器这样的东西;只有接收者可以听到粘性意图。”

但是我们如何使意图变得粘稠? 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()

1 个答案:

答案 0 :(得分:2)

  

广播接收器是粘性还是意图粘性?

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

  

sendStickyBroadcast(intentA)是使intentA变粘的唯一方法吗?

  

如果是,如果我同时调用sendStickyBroadcast(intentA)和sendBroadcast(intentA)会发生什么?意图A是否可用于未来的接收器?

AFAIK,行为没有记录。我不建议使用那种模式。

  

为什么执行onReceive()方法& registerReceiver()返回的意图不是NULL,因为它不是sendStickyBroadcast()?

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