1

我遇到了這個問題,但我沒有找到任何解決問題的方法。PendingIntent正在查殺服務

我正在建立一個服務,必須在特定的時間做一些事情,所以我有一個AlarmManager來計數定時器。

我開始從活動服務,通過getBaseContext().startService(intent),我有AlarmManager爲mAlarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + TIME, mPendingIntent);

The PedingIntent is: mPendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, new Intent(filter), 0); 

我註冊本地接收器爲以下幾點:registerReceiver(mReceiver, new IntentFilter(filter));

我的問題面對的是:服務正常運行,沒有錯誤,但如果我從「最近的應用程序」中刪除我的應用程序,服務將保持運行,直到AlarmManager觸發我的PendingIntent。它在隨機時間(可能是幾秒或幾分鐘)後崩潰,重新啓動並且不再崩潰。

該服務正在前臺運行。

請記住:該服務不會立即崩潰,它只會在我的AlarmManager觸發我的PendingIntent(應該調用我的BroadcastReceiver)時崩潰。

我不知道它爲什麼會發生,是否有一些標誌可以設置在PendingIntent上?如果我剛剛打開我的應用程序並將其保留,然後將我的應用程序從「最近」刪除,我的服務再次崩潰,可以說服務「倖存」了。

是否有另一種方法可以用來完成喚醒設備的定時器任務以及AlarmManager?

當我從最近的窗口中刪除我的應用程序或類似的東西時,是否有任何偵聽器事件或意圖操作可以過濾?類似於isAppRemovedFromRecents()isAppTrullyDiesFromTheSystem()。這樣我可以使用接收器重新啓動我的服務。

我也想過爲服務製作第二個應用程序,這樣我就可以避免所有這個問題,但它看起來並不「正確」。

我該怎麼辦?

編輯

過濾器的值:String filter = "com.mypackage.TIMERFILTER";

的logcat:Scheduling restart of crashed service com.mypackage/.MyService in 5000ms

在此先感謝

+0

什麼是「過濾器」的值時,你創建'PendingIntent'? –

+1

另外,當你的服務崩潰時,你應該在logcat中看到stacktrace的錯誤。請在你的問題中發佈。 –

+0

@DavidWasser我更新了我的問題:) –

回答

0

我找到了解決辦法,做了很多的研究,我終於來了up here

正如我想的那樣,錯誤發生在PendingIntent上。

自API 16(Jelly Bean)以來,Android API存在一些錯誤或未公開的更改。取而代之的是:

final String filter = "MYFILTER" 

final PendingIntent mPendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, new Intent(filter), 0); 

你應該這樣做:

final String filter = "MYFILTER" 

final Intent piIntent = new Intent(filter); 


if(Build.VERSION.SDK_INT >= 16) piIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); 


final PendingIntent mPendingIntent = PendingIntent.getBroadcast(getBaseContext(), 1, piIntent, 0); // requestCode must be 1, not 0 

這樣,您就可以啓動該服務,離開應用程序,並從「最近使用的應用」的Swype出來,該服務將不會崩潰。

測試摩托羅拉RAZRi,安卓4.1.2,我不知道這是否會工作在較舊的Android版本,請測試並在這裏分享吧:)