2016-08-09 33 views
0

我有一個應用程序在應用程序在後臺時每隔10分鐘由一個報警觸發的服務中執行某些操作。即使操作系統殺死了應用程序(所以它已經死了,必須重新啓動),並且只有當用戶從最近的應用程序中刪除應用程序或強制從設置中殺死應用程序(或者註銷但是已經工作)。我嘗試了很多不同的方法,最近我沒有任何運氣嘗試這個http://www.dotkam.com/2011/01/10/android-prefer-alarms-and-intent-receivers-to-services/。我的鬧鐘看起來像這樣。只希望當從最近的應用程序中刪除或用戶被迫中止時報警死亡

if(ActivityLifecycleHandler.isApplicationInForeground()) { 
     return; // If App is in foreground do not start alarm! 
    } 

    String alarm = Context.ALARM_SERVICE; 
    AlarmManager am = (AlarmManager) context.getSystemService(alarm); 

    Intent intent = new Intent(locationBroadcastAction); 
    PendingIntent pi = PendingIntent.getBroadcast(context.getApplicationContext(), 0, intent, 0); 

    int type = AlarmManager.ELAPSED_REALTIME_WAKEUP; 

    // Set trigger time to 0, because want to fire off the first one instantly 
    am.setRepeating(type, 0, ONE_MINUTE, pi);  

而且廣播接收器:

public class LocationBroadcastReceiver extends BroadcastReceiver{ 

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

    Intent myIntent = new Intent(context, LocationService.class); 
    context.startService(myIntent); 
} 
} 

什麼我做錯了任何想法?一切工作正常,直到OS殺死應用程序。

回答

1

即使應用程序被殺,即使從最近的應用程序中刪除(但不是如果它被強制停止),鬧鐘也應該關閉。

它實際上是使用AlarmManager整點:

注:報警管理的目的是爲您想擁有 在特定的時間您的應用程序代碼運行的情況下,即使你的應用程序 目前沒有運行。對於正常的定時操作(ticks, 超時等),使用Handler更容易,效率更高。

你可以看到,如果報警仍存在有:

adb shell dumpsys alarm 

什麼是可能發生的是,該設備被喚醒接收警報,而是睡着了,一旦下跌的接收器完成,在服務開始之前。

接收器應該採取喚醒鎖(由服務釋放)。支持庫提供了WakefulBroadcastReceiver這正是如此:

助手用於實現一個BroadcastReceiver該 接收設備的喚醒事件,然後共同圖案假冒到 服務的工作,同時確保該裝置不會在轉換過程中不要回到睡眠 。

+0

Aaah,太棒了!是的,我實際上認爲這也是鬧鐘的全部,但我無法讓它正常工作,所以我懷疑。我會試試看,看看它是否有效。無論如何感謝這些信息。順便說一句,用戶會注意到,自從它醒來後,該服務以任何方式運行了大約5秒鐘? – Slagathor

+0

啊,報警實際上沒有顯示在應用程序死亡後轉儲.. – Slagathor

+0

這很奇怪,我試過你的代碼在API 21,它似乎工作。即使應用程序已被殺死並且屏幕關閉:該進程已創建,並且接收方會收到警報。唯一可能不同的是Receiver是靜態註冊的(否則系統不知道如何重新創建它),但它不能解釋爲什麼警報從列表中消失。 – bwt

相關問題