Android で再起動すると、すべての AlarmManagers が削除され、再作成する必要があることを読みました。そこで、次のように WakefulIntentService を呼び出してすべてのアラームを再起動する BootReciever クラスを作成しました。
public class BootReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.v("MessageDelay", "Reboot message Recieved");
try {
WakefulIntentService.sendWakefulWork(context, BootSetter.class);
} catch (Exception e) {
Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
}
マニフェストでそれを宣言し、インテントフィルターを配置して、ブートが次のように完了したときにのみ実行されるようにします:-
<receiver android:name=".BootReciever">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
これが意図したとおりに機能しないという問題を修正しようとして髪を引き裂いた後、BootReciever クラスが起動後に呼び出されていないことに気付きました。代わりに、RecieverHandler という名前の別のクラスがすべてに対して呼び出されています。さらに困惑しているのは、起動時に RecieverHandler に渡された Intent に、実際にはエラーなしで使用できる有効なデータがあることです。
私の RecieverHandler は次のようになります:-
public class RecieverHandler extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
try {
Bundle bundle = intent.getExtras();
Log.v("MessageDelay", "RecieverHandler is doing boot jobs");
Intent newIntent = new Intent(context, MessageDispatcher.class);
newIntent.putExtras(bundle);
// newIntent.addFlags(Intent.FLAG);
//context.startService(newIntent);
WakefulIntentService.sendWakefulWork(context, newIntent);
} catch (Exception e) {
Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
}
マニフェストで次のように宣言されています。
<receiver android:name=".RecieverHandler">
</receiver>
別の状況では問題ないかもしれませんが、電話がオンになっているときと電話が起動したときのために、異なるレシーバーが必要です。
私の質問を要約すると:-
RecieverHandler が Boot completed Intent を処理し、BootReciever が呼び出されないのはなぜですか?
再起動前のインテント データ セットを再起動後も有効にするにはどうすればよいですか?
デバイスの SMS 送信機能の準備が整うまでアクションを遅らせる方法はありますか?