У меня есть 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
.
Почему вашему приемнику нужен экземпляр 'Activity'? Вы уверены, что не можете делать все, что вам нужно, используя 'Context', переданный в' onReceive() 'вместо этого? –
@MikeM. В 'onReceive()', я вызываю некоторые методы из других частей моего кода, которые требуют 'Activity'. В большинстве случаев эти методы нуждаются в 'Activity' для использования в качестве' Context' и для выполнения '.getApplication()' для использования 'Application'. –
Ну, вызов методов экземпляра 'Activity' непосредственно из приемника не является хорошим дизайном. Кроме того, как уже упоминалось, в 'onReceive()' передается 'Context'. Используйте это вместо этого. При загрузке не будет активного экземпляра 'Activity'. Даже если бы это было так, система обрабатывает статический экземпляр получателя, и он не будет использовать ваш перегруженный конструктор. –