Запустите AlarmManager, если устройство перезагружено
В моем приложении я хочу запускать некоторый код каждый день в определенное время с помощью AlarmManager
. В документации по Android я нашел это:
Зарегистрированные тревоги сохраняются, пока устройство спит [...], но будет очищено, если оно выключено и перезагружено.
И в этом проблема. Я хочу запустить код, даже если пользователь перезагрузит телефон. Если пользователь перезагрузит телефон, он в настоящее время должен перезапустить мое приложение, чтобы снова запустить аварийные сигналы. Как я могу это предотвратить? Есть ли лучший механизм, который я должен использовать вместо этого?
Ответы
Ответ 1
Создайте загрузочный приемник, используя следующий код:
public class BootBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context pContext, Intent intent) {
// 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" />
Ответ 2
Использование может создать службу, используя широковещательный приемник при загрузке устройства.
<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" />
Ответ 3
Вам нужно будет добавить загрузочный приемник в ваш манифест, как этот
<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()));
}
}