2011-08-27 94 views
1

我目前遇到了集成AlarmManager和BroadcastReceiver的問題。在後臺運行的Android AlarmManager和BroadcastReceiver服務

我的應用程序,我正在運行一個後臺服務,運行無論該應用程序是否運行。我想我得到這部分工作正常。後臺服務保留一個根據用戶位置而變化的數組。但是,每天早上8點,我希望應用程序將數組變量重置爲默認值。經過在線觀看後,似乎要通過AlarmManager(每8點鐘啓動一次任務)和使用BroadcastReceiver(接收警報並執行任務)來完成此任務。

所以基本上代碼是這樣的:

public class BackgroundService extends Service { 

    private ArrayList thisArray; 

    private BroadcastReceiver thisReceiver = new BroadcastReceiver(){ 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      setArrayToDefault(); 
     } 

    } 

    @Override 
    public void onCreate(){ 

     super.onCreate(); 
     Calendar cal = new GregorianCalendar(); 
     cal.add(Calendar.MINUTE, 2); //example 

     this.registerReceiver(thisReceiver, new IntentFilter("BackgroundService")); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), ONE_MINUTE, "what to put here?"); //example, repeat every minute 

    } 

    private void setArrayToDefault(){ 
     //here, the array will be changed back to default values 
    } 
} 

我的主要問題是如何設置AlarmManager調用thisReceiver每次它的設置。任何想法?我的方法是否正確?

回答

1

即時通訊我的應用程序,我正在運行一個後臺服務,無論該應用程序運行或不運行。

請不要。這就是爲什麼用戶在設置中的管理服務屏幕上用任務殺手和強制停止攻擊我們的原因。

我的主要問題是如何設置AlarmManager在每次設置時調用thisReceiver。任何想法?

您尚未註冊BroadcastReceiver,因此AlarmManager將無法​​與其聯繫。

請請請請請請請重新設計您的服務,使它不必運行的所有時間。無論如何,Android會因老年時期而失去你的服務,所以如果你想要一個可靠和穩定的應用程序,無論如何你都需要重新設計。

+0

那麼你認爲我應該如何解決這個問題?基本上應用程序的一部分是它將獲取用戶的位置(可能每隔30分鐘,無論用戶當前是否在運行應用程序)。如果用戶當前位於陣列中指定的位置之一併啓用了通知,則會向用戶發送通知(並且在當天剩餘時間內不會再發送通知)。第二天,所有通知將被重新啓用(因此需要AlarmManager)。 – ImpStudent

+1

@ImpStudent:「(可能每隔30分鐘,無論用戶是否正在運行應用程序)」 - 使用AlarmManager和我的LocationPoller,因此您無需將服務始終保存在內存中 - https://github.com/commonsguy/cwac-locpoll - 你引用的所有東西都應該保存在數據庫或其他持久存儲中。 – CommonsWare

+0

好吧我做了更多的閱讀,它似乎實際上可以做到我的計劃沒有使用後臺服務。感謝您的指導。 – ImpStudent