2012-03-12 40 views
3

我在特定時間設置了鬧鐘。如果手機關機,鬧鐘就會丟失?我已關閉電話,再次啓動,但在指定的時間沒有觸發鬧鐘。AlarmManager在關機時刪除所有日程表?

PendingIntent pendingIntent = PendingIntent.getBroadcast(
      Global.a.getApplicationContext(), (int) cd.e.alarmTime, intent, 0); 

    AlarmManager alarmManager = (AlarmManager) Global.a.getSystemService(Activity.ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC, cd.e.alarmTime, pendingIntent); 
+0

是的,你必須重新設置它。 – Akram 2012-03-12 16:46:12

回答

8

首先,你需要創建一個BroadcastReceiver來觸發BOOT_COMPLETE

public class BootReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 
      if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) { 
        Intent mServiceIntent = new Intent(); 
        mServiceIntent 
            .setAction("com.crossfire.appname.service.BootService"); 
        ComponentName service = context.startService(mServiceIntent); 
        if (null == service) { 
          // something really wrong here 
          Log.e(TAG, "Could not start service "); 
        } 
      } else { 
        Log.e(TAG, "Received unexpected intent " + intent.toString()); 
      } 
    } 
} 

然後創建一個服務,可以將所有的報警:

public class BootService extends Service { 

    private final String TAG = "BootService"; 

    @Override 
    public IBinder onBind(final Intent intent) { 
      return null; 
    } 

    @Override 
    public void onCreate() { 
      super.onCreate(); 
      Trace.i(TAG, "created"); 
    } 

    @Override 
    public void onStart(final Intent intent, final int startId) { 
      super.onStart(intent, startId); 
      Trace.i(TAG, "started"); 

      LoadAlarmsFromDatabase(); 

    } 

    private void LoadAlarmsFromDatabase() { 
      Cursor c = mDbHelper.getPendingAlarms(); 
      if (c.moveToFirst()) { 
        do { 

          int id = c.getInt(mDbHelper.ID_COLUMN); 
          String time = c.getString(mDbHelper.TIME_COLUMN); 
          addNotification(id, time); 
        } while (c.moveToNext()); 
      } 
      c.close(); 
    } 

    private void addNotification(int apptId, String time) { 
      Trace.d(TAG, "addNotification " + apptId + ", " + time); 
      Intent intent = new Intent(BootService.this, 
          ApptBroadcastReceiver.class); 

      intent.putExtra("appt_id", Integer.toString(apptId)); 

      PendingIntent mAlarmSender = PendingIntent.getBroadcast(
          BootService.this, apptId, intent, 0); 

      long alarmTime = System.currentTimeMillis() + 60000; 
      Calendar c = null; 

      try { 
        c = CustomDateUtils.StringToCalendar(time); 
        alarmTime = c.getTimeInMillis(); 
      } catch (ParseException e) { 
        Log.e(TAG, "ParseException"); 
      } 

      AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
      am.set(AlarmManager.RTC_WAKEUP, alarmTime, mAlarmSender); 

    } 
} 

最後,許可和接收器添加到清單

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<receiver android:name=".receiver.BootReceiver" android:enabled="true"> 
      <intent-filter> 
        <action android:name ="android.intent.action.BOOT_COMPLETED"></action> 
      </intent-filter> 
    </receiver> 
+0

對不起@Woodsy,我有一個愚蠢的問題,爲什麼你直接在OnStart方法中運行查詢?是不是需要像異步一樣進行操作? – 2014-12-11 18:06:39

0

你可以做這樣的:

店時間在SharedPreference,抓Intent.ACTION_BOOT_COMPLETED,如果需要重新設置AlarmManager

4

試過@Woodsy方法,但沒有工作,所以我固定的一些事情,因此它可以工作

public class BootReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) { 

     Log.d("receiver", "The Receiver is called"); 
     Intent mServiceIntent = new Intent(context, BootService.class); 
     context.startService(mServiceIntent); 

    } else { 
     Log.d("boot receiver ", 
       "Something went wrong with the boot complete maybe with permissions "); 
    } 
} 

}

* 權限&清單*

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 



Booting update 
     <service android:name="com.packagename.appname.service.BootService" /> 

     <receiver 
      android:name=".Receivers.BootReceiver" 
      android:enabled="true" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" > 
       </action> 
      </intent-filter> 
     </receiver> 

希望這可以幫助其他

相關問題