2013-07-16 94 views
19

在我的應用程序中,我想在特定時間每天運行一些代碼,使用AlarmManager。在android documentation我發現這一點:如果設備重新啓動,啓動AlarmManager

註冊警報被保留,而設備是睡着了[...]但會如果它被關閉並重新啓動清除。

這就是問題所在。即使用戶重新啓動手機,我也想運行代碼。如果用戶重新啓動手機,他目前必須重新啓動我的應用程序才能再次啓動鬧鐘。我怎樣才能防止這一點?有沒有更好的機制我應該使用?

+1

創建啓動完成一個reciver,如果以往任何報警設置報警管理器(明確也有你的應用程序) –

+1

試試這個http://stackoverflow.com/questions/17315494/android-how-to-start-activity-on-boot-up/17315856#17315856 –

+0

非常有用的問題。 – ivanleoncz

回答

31

創建啓動接收機使用下面的代碼:

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" /> 
7

使用可以在設備引導使用廣播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" /> 
4

您需要在您的清單添加了一個引導接收器這樣

<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())); 
} 
} 
+0

請確保您將使用權限()放入清單文件中的正確位置。 (通常在活動之前) –

相關問題