Что происходит, когда два приложения определяют один и тот же класс BroadcastReceiver в своем манифесте?

У меня есть проект библиотеки Android с классом BroadCastReceiver и классом планировщика, который определяет методы для установки повторяющегося PendingIntent для BroadcastReceiver

//delay for AlarmManager setRepeating method in seconds
//id as requestCode for PendingIntent
public static void scheduleBroadcast(Context context,int delay,int id){
    Intent intent = new Intent(context, SuperReceiver.class);
    intent.putExtra(KEY_DELAY, (long)(delay * 1000));
    intent.putExtra("APP_NAME", context.getPackageName());
    long timeGap = (long)(delay * 1000);

    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, id, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
            System.currentTimeMillis() + timeGap, timeGap,
            alarmIntent);
}

Получатель

@Override
public void onReceive(Context context, Intent intent) {
    Log.e("Chirag-Library","SuperReceiver Received!");
    long delay = intent.getLongExtra(BScheduler.KEY_DELAY, -1);
    Log.e("Chirag-Library","Delay is "+delay+" ms");
    Log.e("Chirag-Library", "By App called  "+ intent.getStringExtra("APP_NAME"));
    Log.e("Chirag-Library",context.getPackageName());
}   

Я использую этот проект как зависимость в двух моих приложениях, которые точно так же определяют получателя в манифесте.

        <receiver android:name="com.chirag.library.SuperReceiver"/>

Я вызываю scheduleBroadcast() из обоих моих приложений с разным значением задержки.

В com.chirag.appone

BScheduler.scheduleBroadcast(getApplicationContext(), 10,111);

В com.chirag.apptwo

BScheduler.scheduleBroadcast(getApplicationContext(), 60,999);

Вызывается ли OnReceive() для обоих приложений при запуске любого из PendingIntent?

Это потому, что PendingIntents имеют одно и то же намерение получателя?

Logcat показывает логи в OnReceived, запущенные одновременно

09-21 10:04:19.746  14306-14306/com.chirag.appone E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:04:19.746  14306-14306/com.chirag.appone E/Chirag-Library﹕ Delay is 10000 ms
09-21 10:04:19.746  14306-14306/com.chirag.appone E/Chirag-Library﹕ By App called  com.chirag.appone
09-21 10:04:19.746  14306-14306/com.chirag.appone E/Chirag-Library﹕ com.chirag.appone
09-21 10:05:06.987  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:05:06.987  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ Delay is 60000 ms
09-21 10:05:06.987  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ By App called  com.chirag.apptwo
09-21 10:05:06.987  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ com.chirag.apptwo
09-21 10:06:04.427  14306-14306/com.chirag.appone E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:06:04.427  14306-14306/com.chirag.appone E/Chirag-Library﹕ Delay is 10000 ms
09-21 10:06:04.427  14306-14306/com.chirag.appone E/Chirag-Library﹕ By App called  com.chirag.appone
09-21 10:06:04.427  14306-14306/com.chirag.appone E/Chirag-Library﹕ com.chirag.appone
09-21 10:06:40.666  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:06:40.666  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ Delay is 60000 ms
09-21 10:06:40.666  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ By App called  com.chirag.apptwo
09-21 10:06:40.666  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ com.chirag.apptwo
09-21 10:06:40.682  14306-14306/com.chirag.appone E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:06:40.682  14306-14306/com.chirag.appone E/Chirag-Library﹕ Delay is 10000 ms
09-21 10:06:40.682  14306-14306/com.chirag.appone E/Chirag-Library﹕ By App called  com.chirag.appone
09-21 10:06:40.682  14306-14306/com.chirag.appone E/Chirag-Library﹕ com.chirag.appone
09-21 10:07:40.766  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:07:40.766  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ Delay is 60000 ms
09-21 10:07:40.766  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ By App called  com.chirag.apptwo
09-21 10:07:40.766  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ com.chirag.apptwo
09-21 10:07:40.774  14306-14306/com.chirag.appone E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:07:40.774  14306-14306/com.chirag.appone E/Chirag-Library﹕ Delay is 10000 ms
09-21 10:07:40.775  14306-14306/com.chirag.appone E/Chirag-Library﹕ By App called  com.chirag.appone
09-21 10:07:40.775  14306-14306/com.chirag.appone E/Chirag-Library﹕ com.chirag.appone
09-21 10:08:19.745  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:08:19.745  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ Delay is 60000 ms
09-21 10:08:19.745  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ By App called  com.chirag.apptwo
09-21 10:08:19.745  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ com.chirag.apptwo
09-21 10:08:19.754  14306-14306/com.chirag.appone E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:08:19.754  14306-14306/com.chirag.appone E/Chirag-Library﹕ Delay is 10000 ms
09-21 10:08:19.754  14306-14306/com.chirag.appone E/Chirag-Library﹕ By App called  com.chirag.appone
09-21 10:08:19.754  14306-14306/com.chirag.appone E/Chirag-Library﹕ com.chirag.appone
09-21 10:09:19.742  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:09:19.742  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ Delay is 60000 ms
09-21 10:09:19.742  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ By App called  com.chirag.apptwo
09-21 10:09:19.742  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ com.chirag.apptwo
09-21 10:09:19.751  14306-14306/com.chirag.appone E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:09:19.751  14306-14306/com.chirag.appone E/Chirag-Library﹕ Delay is 10000 ms
09-21 10:09:19.751  14306-14306/com.chirag.appone E/Chirag-Library﹕ By App called  com.chirag.appone
09-21 10:09:19.751  14306-14306/com.chirag.appone E/Chirag-Library﹕ com.chirag.appone
09-21 10:10:19.843  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:10:19.843  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ Delay is 60000 ms
09-21 10:10:19.843  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ By App called  com.chirag.apptwo
09-21 10:10:19.843  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ com.chirag.apptwo
09-21 10:10:19.853  14306-14306/com.chirag.appone E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:10:19.853  14306-14306/com.chirag.appone E/Chirag-Library﹕ Delay is 10000 ms
09-21 10:10:19.853  14306-14306/com.chirag.appone E/Chirag-Library﹕ By App called  com.chirag.appone
09-21 10:10:19.853  14306-14306/com.chirag.appone E/Chirag-Library﹕ com.chirag.appone
09-21 10:11:19.971  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:11:19.971  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ Delay is 60000 ms
09-21 10:11:19.971  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ By App called  com.chirag.apptwo
09-21 10:11:19.971  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ com.chirag.apptwo
09-21 10:11:19.979  14306-14306/com.chirag.appone E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:11:19.979  14306-14306/com.chirag.appone E/Chirag-Library﹕ Delay is 10000 ms
09-21 10:11:19.979  14306-14306/com.chirag.appone E/Chirag-Library﹕ By App called  com.chirag.appone
09-21 10:11:19.980  14306-14306/com.chirag.appone E/Chirag-Library﹕ com.chirag.appone
09-21 10:12:20.065  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:12:20.065  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ Delay is 60000 ms
09-21 10:12:20.066  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ By App called  com.chirag.apptwo
09-21 10:12:20.068  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ com.chirag.apptwo
09-21 10:12:20.075  14306-14306/com.chirag.appone E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:12:20.075  14306-14306/com.chirag.appone E/Chirag-Library﹕ Delay is 10000 ms
09-21 10:12:20.076  14306-14306/com.chirag.appone E/Chirag-Library﹕ By App called  com.chirag.appone
09-21 10:12:20.076  14306-14306/com.chirag.appone E/Chirag-Library﹕ com.chirag.appone
09-21 10:13:20.165  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:13:20.165  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ Delay is 60000 ms
09-21 10:13:20.165  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ By App called  com.chirag.apptwo
09-21 10:13:20.165  14673-14673/com.chirag.apptwo E/Chirag-Library﹕ com.chirag.apptwo
09-21 10:13:20.171  14306-14306/com.chirag.appone E/Chirag-Library﹕ SuperReceiver Received!
09-21 10:13:20.171  14306-14306/com.chirag.appone E/Chirag-Library﹕ Delay is 10000 ms
09-21 10:13:20.171  14306-14306/com.chirag.appone E/Chirag-Library﹕ By App called  com.chirag.appone
09-21 10:13:20.171  14306-14306/com.chirag.appone E/Chirag-Library﹕ com.chirag.appone

Что меня больше смущает, так это то, что задержка 10 секунд от appone срабатывает только один раз, а задержка 60 секунд от apptwo?

Что именно здесь происходит?

1 ответ

Вызывается ли OnReceive() для обоих приложений при запуске любого из PendingIntent?

Нет. Вот почему: Intent, передаваемый в PendingIntent, является явным Intent и, таким образом, делает контекст приложения OnReceive специфичным, и, следовательно, оба приложения имеют свой собственный приемник даже с одинаковым именем.

Что меня больше смущает, так это то, что задержка 10 секунд от appone срабатывает только один раз, а задержка 60 секунд от apptwo?

После некоторых исследований ошибок в setRepeating() я обнаружил этот https://code.google.com/p/android/issues/detail?id=161244

который говорит об API >= 21 Значение интервала setRepeating() сбрасывается на 60 с, если меньше 60 с (это не задокументировано), что оказалось моим случаем.

Следовательно, в первый раз они, кажется, срабатывают с разными временными интервалами (currentTime + 10s и currentTime + 60s соответственно), а позже оба срабатывают с интервалами 60. Также setRepeating() не всегда дает события с точностью до секунды, поэтому оба моих onReceive казались чтобы выстрелить в то же время приводит к путанице

Другие вопросы по тегам