Что происходит, когда два приложения определяют один и тот же класс 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 казались чтобы выстрелить в то же время приводит к путанице