2016-08-31 2 views
0

У меня есть BroadcastReceiver, который будет обрабатывать некоторые действия после завершения загрузки. Однако методы, которые будут вызываться из моего onReceive метода требуют сдачи Activity:Регистрация BroadcastReceivers программно для передачи аргументов

if (intent!!.action.equals(Intent.ACTION_BOOT_COMPLETED)) { 
    Log.i(LOG_TAG, "onReceive (ACTION_BOOT_COMPLETED)"); 
    doSomeActionWithActivity(activity); 
} 

Для того, чтобы сделать это, я создал конструктор для моего приемника (который я назвал BootReceiver:

public BootReceiver(Activity activity) { 
    this.activity = activity; 
} 

Но хотя бы решить мой первоначальный вопрос, я получил сообщение об ошибке из файла манифеста:

.BootReceiver has no default constructor

Для решения этот вопрос, я решил зарегистрировать и отменить регистрацию приемника программно, чтобы я мог передать Activity.

В onCreate():

Log.i(LOG_TAG, "Registering the receiver (BootReceiver)"); 
mReceiver = new BootReceiver(SplashActivity.this); 
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED); 
registerReceiver(mReceiver, intentFilter); 

И в onDestroy():

if (mReceiver != null) { 
    Log.i(LOG_TAG, "Unregistering the receiver (BootReceiver)"); 
    unregisterReceiver(mReceiver); 
} 

После повторного тестирования моего приложения, я получил следующее сообщение об ошибке:

java.lang.IllegalArgumentException: Component class ...BootReceiver does not exist in ...

указывая на части мой код, где я это делаю:

ComponentName receiver = new ComponentName(context, BootReceiver.class); 
PackageManager pm = context.getPackageManager(); 
pm.setComponentEnabledSetting(receiver, 
     PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
     PackageManager.DONT_KILL_APP); 

В приведенном выше коде я хочу перезапустить любые тревоги, установленные при перезагрузке устройства. Кроме того, я использую this file from Remindly, приложение с открытым исходным кодом в качестве руководства/ссылки для вышеуказанного кода.

Каким будет правильный способ перезапуска аварийных сигналов и возможность пройти Activity до моего класса BootReceiver.

+0

Почему вашему приемнику нужен экземпляр 'Activity'? Вы уверены, что не можете делать все, что вам нужно, используя 'Context', переданный в' onReceive() 'вместо этого? –

+0

@MikeM. В 'onReceive()', я вызываю некоторые методы из других частей моего кода, которые требуют 'Activity'. В большинстве случаев эти методы нуждаются в 'Activity' для использования в качестве' Context' и для выполнения '.getApplication()' для использования 'Application'. –

+0

Ну, вызов методов экземпляра 'Activity' непосредственно из приемника не является хорошим дизайном. Кроме того, как уже упоминалось, в 'onReceive()' передается 'Context'. Используйте это вместо этого. При загрузке не будет активного экземпляра 'Activity'. Даже если бы это было так, система обрабатывает статический экземпляр получателя, и он не будет использовать ваш перегруженный конструктор. –

ответ

0

Если вы уверены, что проблема вызвана конструктором с аргументами, вы можете использовать setter вместо аргументов в конструкторе.

+0

Спасибо за ваш ответ. Если бы я должен был написать свой класс «BootReceiver» без аргументов и объявить его в «AndroidManifest.xml» (не требуя, чтобы я зарегистрировал и отменил его регистрацию программно), в какой момент я бы назвал сеттера? Могу ли я вызвать установщика в 'onCreate()' первого «Активность», который запускается в моем приложении? –