在我的應用程序中,我想在特定時間每天運行一些代碼,使用AlarmManager
。在android documentation我發現這一點:如果設備重新啓動,啓動AlarmManager
註冊警報被保留,而設備是睡着了[...]但會如果它被關閉並重新啓動清除。
這就是問題所在。即使用戶重新啓動手機,我也想運行代碼。如果用戶重新啓動手機,他目前必須重新啓動我的應用程序才能再次啓動鬧鐘。我怎樣才能防止這一點?有沒有更好的機制我應該使用?
在我的應用程序中,我想在特定時間每天運行一些代碼,使用AlarmManager
。在android documentation我發現這一點:如果設備重新啓動,啓動AlarmManager
註冊警報被保留,而設備是睡着了[...]但會如果它被關閉並重新啓動清除。
這就是問題所在。即使用戶重新啓動手機,我也想運行代碼。如果用戶重新啓動手機,他目前必須重新啓動我的應用程序才能再次啓動鬧鐘。我怎樣才能防止這一點?有沒有更好的機制我應該使用?
創建啓動接收機使用下面的代碼:
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" />
使用可以在設備引導使用廣播reciever了
ü創建服務<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" />
您需要在您的清單添加了一個引導接收器這樣
<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()));
}
}
請確保您將使用權限(
創建啓動完成一個reciver,如果以往任何報警設置報警管理器(明確也有你的應用程序) –
試試這個http://stackoverflow.com/questions/17315494/android-how-to-start-activity-on-boot-up/17315856#17315856 –
非常有用的問題。 – ivanleoncz