2012-03-29 21 views
1

我有一個小部件,按下後會發送一個廣播,啓動一個CountDownTimer更新我的小部件,並在最後播放警報。這在仿真器中很漂亮。我如何確保CountDownTimer滴答並完成?

然而,在我的手機上,這是一個不同的故事。我的手機資源受到限制,導致我的進程定期死亡,當然,這意味着CountDownTimer不再更新我的小部件。

看來,未來可靠地做事的唯一方法是使用AlarmManager,因爲這會設置系統級別的警報。但是,文檔陳述並且我同意,你不應該使用它作爲蜱。但是,由於您可能使用的任何其他東西都有可能被任意關閉,所以它們並沒有給我們太多選擇。

我的問題是:有沒有辦法確保CountDownTimer保持滴答狀態並最終調用onFinish(),還是我必須簡單地刪除它並切換到AlarmManager並「誤用」它?任何其他保證東西剔除和完成的選項也是受歡迎的。

我應該補充一點,我不能依靠調用onUpdate()的操作系統,這兩者都是因爲它每隔30分鐘就會這樣做,並且也是因爲大部分時間部件什麼都不做。只有當它被點擊時,它會在幾秒鐘內每秒鐘滴答下來。

回答

0

我最終做的是從BroadcastReceiver轉移到服務。 不只是使用虛擬服務,而是讓真正的服務體現了BroadcastReceiver之前的做法。

由於這不能保證我的計時器不會被殺死,如果有要求,android會在殺死後自動嘗試重新啓動服務。在這種情況下,我打算讓一些代碼從磁盤恢復運行狀態並繼續運行。

0

我認爲這是一個解決方案..創建一個虛擬服務..

public class DummyService extends Service{ 


@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 
@Override 
    public void onCreate() { 
     super.onCreate(); 

    } 
    @Override 
    public void onDestroy() { 

     super.onDestroy(); 

    } 
} 

,並使用countdowntimer這樣從活動開始吧..在OnCreate中活動的

Intent intent = new Intent(this, DummyService.class); 
startService(intent); 

和也不要忘了在你的清單中宣佈這項服務,像這樣..

<service android:name=".DummyService" > 
</service> 

希望這有助於..

+0

這會完成什麼? – 2012-03-29 11:43:54

+0

雖然服務仍然可能被殺害。此外,具有CountDownTimer的東西不是一個活動,它是一個BroadcastReceiver,但也許這並不重要。我們基本上將該服務用作主播。不過,我知道會發生什麼。客戶仍然會抱怨,偶爾倒計時不會奏效。 – 2012-03-29 12:10:47

+0

實際上,與此相結合的服務可能是票據:http://stackoverflow.com/questions/3856767/android-keeping-a-background-service-alive-preventing-process-death – 2012-03-29 12:22:15

0

要添加到the accepted answer:從我記得,BroadcastReceiver只有處理廣播需要的時間。

因此,從BroadcastReceiver內啓動計時器或其他東西將不起作用(如上所述)。

這就是爲什麼建議使用BroadcastReceiver來啓動Service這將做的時間。當然,該服務仍然可以被殺死,但不會早於BroadcastReceiver