Я хочу подписаться на намеренное действие BOOT_COMPLETED , которое сигнализирует о перезагрузке мобильного телефона. После того, как я подпишусь, я хочу запланировать некоторые тревоги. У меня есть BroadcastReceiver, который прослушивает действие BOOT_COMPLETED, и он вызывается / вызывается, если я использую Android SDK 25 . Как заставить код в BroadcastReceiver выполняться с Android SDK 26 (Oreo) и выше?
Когда я запускаю код на SDK 26, я получаю сообщение об ошибке:
system_process W/BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.BOOT_COMPLETED flg=0x400010 }
Я создал Github repo https://github.com/Ferencz8/BootIntent в более простом случае, который показывает, как именно на SDK 25 работают, а на 26 - нет.
Вот часть AndroidManifest.xml :
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".BootReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<action android:name="android.intent.action.REBOOT"/>
</intent-filter>
</receiver>
</application>
И BroadcastReceiver :
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
Log.d(BootReceiver.class.getSimpleName(), "In Boot Receiver");
Intent mainActivityIntent = new Intent(context, MainActivity.class);
context.startActivity(mainActivityIntent);
}
}
Я попытался в методе OnReceive от BroadcastReceiver запустить сервис ForegroundService, но безуспешно:
@Override
public void onReceive(final Context context,final Intent intent) {
intent.setClass(context, AlarmBootService.class);
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(intent);
}
else{
context.startService(intent);
}
}
Я также попытался добавить другие намеренные действия, кроме BOOT_COMPLETED:
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<action android:name="android.intent.action.REBOOT"/>
Чтобы имитировать действие BOOT_COMPLETED , я использовал команду:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
Кроме того, это мой первый вопрос, так что если у вас есть какие-либо отзывы о том, как лучше описать / сформулировать мой вопрос, пожалуйста, скажите:).