2012-07-17 43 views
1

我有一個Android應用程序,我想在白天如何保證AlarmManager生存手機重啓和應用殺死

對於這種在固定的時間發送給用戶的通知,我使用AlarmManager安排警報然後用它來生成通知

但我面臨的問題是,如果用戶「強制關閉」的應用程序,警報重置,因此我沒有收到任何通知。這是一種正常的行爲?這有什麼出路嗎?

此外,如果手機重新啓動,鬧鐘也會被取消。我如何控制它?我是否需要聽電話重啓事件並再次安排鬧鐘?這是唯一的選擇嗎?

+0

顯示你的代碼,因爲alarmManager讓你把一個報警,如果你重新啓動手機仍在工作。 – Litus 2012-07-17 17:39:10

回答

1

您將需要設置類似於此的內容以掛鉤啓動完成的意圖。

<receiver android:name="MyStartupIntentReceiver"> 
<intent-filter> 
<action 
    android:name="android.intent.action.BOOT_COMPLETED" /> 
<category android:name="android.intent.category.HOME" /> 
</intent-filter> 
</receiver> 

一旦你有,你會需要啓動服務或做一些

public void onReceive(Context context, Intent intent) { 
    Intent serviceIntent = new Intent(); 
    serviceIntent.setAction("com.yourapp.yourservice"); 
    context.startService(serviceIntent); 
} 
2

我有一個表在我的數據庫我所有未決報警存放在重新啓動的情況下, 。如果電話重新啓動,我有一個服務等級重置警報。

private AppDatabase mDbHelper; 
public class BootService extends Service { 

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

    @Override 
    public void onCreate() { 
      super.onCreate(); 
      mDbHelper = new AppDatabase(this); 
      mDbHelper.open(); 
    } 

    @Override 
    public void onStart(final Intent intent, final int startId) { 
      super.onStart(intent, startId); 
      LoadNotificationsFromDB();    
    } 

    private void LoadNotificationsFromDB() { 
      Cursor c = mDbHelper.getPendingNotifications(); 
      if (c.moveToFirst()) { 
        do { 

          int id = c.getInt(AppDatabase.ID_COLUMN); 
          String date = c.getString(AppDatabase.DATE_COLUMN); 
          addNotification(id, date); 
        } while (c.moveToNext()); 
      } 
      c.close(); 
    } 

    private void addNotification(int id, String date) { 
      Intent intent = new Intent(BootService.this,  
          NotificationBroadcastReceiver.class); 

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

      long alarmDate = Long.valueOf(date); 

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

然後創建一個接收器類:

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("<package name>.BootService"); 
        ComponentName service = context.startService(mServiceIntent); 
        if (null == service) { 
          // something really wrong here 
        } 
      } 
    } 
} 

而下面的行添加到Manifest.xml

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

嘿,這篇文章對我來說真的很有用,但我有一個問題......爲什麼你需要這項服務?如果我從啓動接收器的onReceive重新加載警報,是否一樣? – Andres 2013-04-20 20:49:00

+0

IMO,廣播接收器和服務都在UI thread.so上運行,因此在其上創建它也是同樣的效果。如果您真的想將其從UI線程移出,請考慮使用IntentService,它可以在單獨的線程上工作。 – Basher51 2014-07-24 04:47:46

相關問題