Подтвердить что ты не робот

Запустите AlarmManager, если устройство перезагружено

В моем приложении я хочу запускать некоторый код каждый день в определенное время с помощью AlarmManager. В документации по Android я нашел это:

Зарегистрированные тревоги сохраняются, пока устройство спит [...], но будет очищено, если оно выключено и перезагружено.

И в этом проблема. Я хочу запустить код, даже если пользователь перезагрузит телефон. Если пользователь перезагрузит телефон, он в настоящее время должен перезапустить мое приложение, чтобы снова запустить аварийные сигналы. Как я могу это предотвратить? Есть ли лучший механизм, который я должен использовать вместо этого?

4b9b3361

Ответ 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()));
}
}