2016-03-12 23 views
2

По какой-то причине мне нужно зарегистрироваться в одном приемнике несколько раз, как в манифесте, и один раз в коде. Я хочу слушать изменения пакета, даже приложение не работает, а устанавливается.Регистрация на тот же приемник Несколько раз

1.In в AndroidManifest.xml

<receiver android:name="PackageChangeReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.PACKAGE_CHANGED" /> 
     <action android:name="android.intent.action.PACKAGE_ADDED" /> 
     <action android:name="android.intent.action.PACKAGE_REMOVED" /> 
     <action android:name="android.intent.action.PACKAGE_REPLACED" /> 
     <data android:scheme="package" /> 
    </intent-filter> 

2.Also в коде, чтобы зарегистрировать BroadcastReceiver со следующим фрагментом кода в конструкторе.

public PackageChangeReceiver(@ForApplication Context context) { 
    super(); 
    IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); 
    filter.addAction(Intent.ACTION_PACKAGE_REMOVED); 
    filter.addAction(Intent.ACTION_PACKAGE_CHANGED); 
    filter.addDataScheme("package"); 
    context.registerReceiver(this, filter); 
} 

Но почему-то Android получает только один из них с перерывами, когда-то он получает оба. Есть ли какой-либо документ в более новых версиях, например, как улучшение производительности в ОС Android, например, только получение одной широковещательной передачи, хотя и зарегистрировано несколько раз. Является ли это устройством или ОС или версией?

+0

Приложение для Android может иметь только один BroadcaseReceiver с одним именем. Если вам нужны несколько приемников, вы можете создавать BroadcastReceivers с разными именами. –

+0

На самом деле это периодически работает, когда я помещаю точку прерывания и отключает/активировать приложение по умолчанию. Я получаю его по 2 раза. Также у меня есть один BroadcastReceiver с одним именем. Но я регистрируюсь два раза. – omersem

+0

Я предлагаю вам зарегистрировать свой BroadcastReceiver только один раз. Если вам это нужно динамически, просто удалите объявление из манифеста Android –

ответ

1

Я нашел решение. Marshmallow не разрешает многократную регистрацию одному приемнику вещания. Но если версия ОС меньше или равна LOLLIPOP_MR1, регистрация на том же широковещательном приемнике допустима. Но поскольку Marshmallow (API 23) не позволяет этого, мы можем сделать такое улучшение производительности.

private static final boolean REGISTER_DUPLICATE_RECEIVER = VERSION.SDK_INT <= VERSION_CODES.LOLLIPOP_MR1; 

if (REGISTER_DUPLICATE_RECEIVER) { 
     IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); 
     filter.addAction(Intent.ACTION_PACKAGE_REMOVED); 
     filter.addAction(Intent.ACTION_PACKAGE_CHANGED); 
     filter.addDataScheme("package"); 
     context.registerReceiver(this, filter); 
    } 
Смежные вопросы