0

我目前正在開發一款需要大量電池才能支持背景GPS跟蹤的應用程序。我的經驗表明,當人們不再需要跟蹤時,人們只會忘記在後臺運行的應用程序。因此我設置了一些應該在4小時後關閉應用程序的代碼。在一段時間後自行破壞Android應用程序

public class SelfDestructor { 

    private static SelfDestructor instance; 

    private final long IDLE_TIME_UNTIL_AUTO_DESTRUCT = 4 * 60 * 60 * 1000; // 4 hours 

    private Handler handler; 

    private Runnable closeApp = new Runnable() { 
     @Override 
     public void run() { 
      System.exit(0); 
     } 
    }; 

    public static SelfDestructor getInstance() { 
     if (SelfDestructor.instance == null) { 
      SelfDestructor.instance = new SelfDestructor(); 
     } 
     return SelfDestructor.instance; 
    } 

    public void keepAlive() { 
     if (handler == null) { 
      handler = new Handler(); 
     } 
     handler.removeCallbacks(closeApp); 
     handler.postDelayed(closeApp, IDLE_TIME_UNTIL_AUTO_DESTRUCT); 
    } 
} 

現在我在主要活動中調用keepAlive()。

@Override 
protected void onResume() { 
    super.onResume(); 
    SelfDestructor.getInstance().keepAlive(); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    SelfDestructor.getInstance().keepAlive(); 
} 

現在,如果我設置時間大約一個小時左右,並調試該功能一切工作正常。如果我將時間設置爲4小時,則從不會調用System.exit(0);。我假設關閉回調的應用程序線程在一段時間後被android系統擱置,因此在gps將繼續運行時不會再執行。任何想法如何正確地得到這個工作?

+0

不是確定如何做到這一點,但添加通知欄中無法刪除的通知應該是讓用戶瞭解的好方法。確保點擊通知時,系統會提示用戶關閉進程或保持運行狀態。 – 2014-10-05 21:15:30

+0

是啊,已經實現了...... :) – stephanlindauer 2014-10-05 21:16:34

+0

我想這是處理這個問題的最好方法。自動殺死一個進程似乎並不適合我。至少,我會將它設置爲空閒時間的設置,而不是使用常量。無論如何,就我所知,應用程序可能會被放在後臺,這意味着代碼將不會運行。您必須改爲創建鬧鐘。 https://developer.android.com/training/scheduling/alarms.html – 2014-10-05 21:21:10

回答

1

handlerpostDelayed不適合長時間定時器。至多他們應該在幾秒鐘內使用,我個人認爲我從來沒有用過任何超過2秒的任何東西。

說了這麼多,Android的擁有「的東西很長一段時間後,應該會是」適當的類,它被稱爲AlarmManager:http://developer.android.com/reference/android/app/AlarmManager.html

您可以通過調用Context.getSystemService(Context.ALARM_SERVICE)

獲取到系統服務AlarmManager引用

然後將其設置通過調用am.set(AlarmManager.ELAPSED_REALTIME, IDLE_TIME_UNTIL_AUTO_DESTRUCT, operation)

operationPendingIntent到您在AndroidManifest.xml通過<receiver>標籤註冊BroadcastReceiver。然後你在這個廣播接收機內部做緊密的應用程序代碼。

另外我應該補充一點,稱System.exit(0);從來不好,因爲這只是摧毀了虛擬機而沒有多少警告。如果您傳遞命令給持有GPS的Service(我相信您正在運行服務),那麼這是一個更好,更有組織/結構化的關閉,那麼此服務將取消GPS請求,並致電stopSelf();

相關問題