web-dev-qa-db-ja.com

デバイスが再起動された場合はAlarmManagerを起動します

私のアプリでは、AlarmManagerを使用して、毎日特定の時間にコードを実行したいと考えています。 Androidドキュメント で私はこれを見つけました:

登録されたアラームは、デバイスがスリープしている間は保持されますが[...]、電源を切って再起動するとクリアされます。

そしてそれが問題です。ユーザーが電話を再起動してもコードを実行したい。ユーザーが電話を再起動した場合、現在、アラームを再開するにはアプリを再起動する必要があります。どうすればこれを防ぐことができますか?代わりに使用する必要があるより良いメカニズムはありますか?

23
Cilenco

次のコードを使用してブートレシーバーを作成します。

public class BootBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context pContext, Intent intent) {
        if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
            // Do your work related to alarm manager
        }
    }
}

マニフェストで、このブロードキャストレシーバーを登録します。

<receiver
Android:name="com.yourapp.BootBroadcastReceiver"
Android:enabled="true" >
<intent-filter>
    <action Android:name="Android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

そして、AndroidManifest.xmlに権限を追加することを忘れないでください:

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
36
The Holy Coder

デバイスの起動時にブロードキャストレシーバーを使用してサービスを作成できますか

 <receiver Android:enabled="true" Android:name=".YourReceiver"
    <intent-filter>
        <action Android:name="Android.intent.action.BOOT_COMPLETED" />
        <category Android:name="Android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

許可:

 <uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
7
Srikanth Roopa

このようにマニフェストにブートレシーバーを追加する必要があります

<application ...  >

    <receiver Android:name=".OnBootReceiver" >
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED" />
            <uses-permission Android:name="Android.permission.WAKE_LOCK" />
        </intent-filter>
    </receiver>
</application>

そして、このようなブートレシーバークラスを作成します...

import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;

public class OnBootReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context ctxt, Intent intent) {
AlarmHelper.setAlarm(ctxt);
}
}

私のアラームヘルパークラスは、このような単純な一日の始まりのアラームです...

public class AlarmHelper {

public static void testAlarm(Context context) {
Calendar when = Calendar.getInstance();
when.add(Calendar.SECOND, 10);
setAlarm(context, when);    
}

public static void setAlarm(Context context) {
Calendar when = Calendar.getInstance();
when.add(Calendar.DAY_OF_YEAR, 1);
when.set(Calendar.HOUR_OF_DAY, 0);
when.set(Calendar.MINUTE, 0);
when.set(Calendar.SECOND, 0);
setAlarm(context, when);
}

    @SuppressLint("SimpleDateFormat")
private static void setAlarm(Context context, Calendar when) {

SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(context.getApplicationContext());

Boolean showNotifications = prefs.getBoolean("PREF_SHOW_NOTIFICATIONS",
false);

if (showNotifications) {    
AlarmManager am = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);

am.setRepeating(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), AlarmManager.INTERVAL_DAY, getPendingIntent(context.getApplicationContext()));

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Log.i(TAG, "Alarm set " + sdf.format(when.getTime()));
}
}
3
CodeChimp