2014-01-21 21 views
0

目前,我已經得到了擴展的是這種服務一個單獨的類:使用類似運行的方法Android的最佳途徑定期

public class ServiceSingleton extends Service { 

    private static ServiceSingleton instance; 
    private static boolean serviceSt; 
    private static PrefValues preferences; 
    private static Context context; 

    @Override 
    public IBinder onBind(Intent intent) { 
     throw new UnsupportedOperationException("Not yet implemented"); 
    } 

    public static ServiceSingleton getInstance(Context cont) { 
     if (instance == null) { 
      context = cont; 
      // Some code 

     } 
     return instance; 
    } 

所以基本上我跑在這個類約每30分鐘的一些方法這個:

private static void oneTasks() { 
    //task itself 
} 

private static void oneService() { 
    if (!serviceSt) { 
     serviceRunning = false; 
     return; 
    } 
    serviceRunning = true; 
    oneTasks(); 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      oneService(); 
     } 
    }, (INTERVAL)); 
} 

我也聽說AlarmManager可以做同樣的事情。 無論如何,我的問題是,如果我運行週期性方法,調用方法的方式是最好的方法(尤其是考慮電池使用情況)?

+0

從AlarmManager文檔:'注意事項:報警管理器用於您想擁有情況即使您的應用程序當前未運行,您的應用程序代碼也會在特定時間運行。對於正常的計時操作(滴答,超時等),使用Handler更容易,效率更高。' – nhaarman

+0

我會使用'Executor' ... http://docs.oracle.com/javase/7/docs /api/java/util/concurrent/Executor.html – bblincoe

回答

2

目前我有,像這樣

啐延伸服務一個單獨的類。不要將服務無限期地保存在靜態數據成員中。

所以基本上我跑在這個類約每30分鐘

你還沒有說你是怎麼做的一些方法。

無論如何,我的問題是,如果我正在運行定期方法,調用方法的方式是最好的方法(尤其是考慮電池使用)?

如果您的目標是隻在您的流程因其他原因正在運行時才執行此項工作,歡迎您使用幾乎任何您想要的。我會用ScheduledExecutorService

如果你的目標是做這項工作,即使你的應用程序沒有運行,AlarmManager涵蓋了這種情況。配合使用IntentService,以便您的進程只需在系統RAM中進行實際工作即可。

如果你的目標是做這項工作,即使你的應用程序沒有運行,即使設備睡着了,你將需要使用AlarmManager_WAKEUP報警,再加上無論是WakefulBroadcastReceiver,我WakefulIntentService,或當量。

+0

我補充說我是這麼做的。還編輯了一個事實,即我需要我的應用程序在後臺工作(而另一個應用程序正在運行等) –

+0

@SarpKaya:您正在做的或許是最糟糕的解決方案,因爲它涉及主應用程序線程,而服務不應該正在使用主應用程序線程。如果您的應用程序未運行時需要控制,請使用「AlarmManager」,如答案中所述。 – CommonsWare

+0

因此,使用'AlarmManager'和'IntentService'會是最好的嗎?這是一個很好的指導? http://dhimitraq.wordpress.com/2012/11/27/using-intentservice-with-alarmmanager-to-schedule-alarms/ –

0

我知道這肯定不是最優雅和最佳的解決方案,但你可以簡單地有一個Thread具有無限循環,在結束了一個SystemClock.sleep(1800000),所以基本上是這樣的:

final Thread buf_liberator = new Thread(
    new Runnable() { 
    public void run() { 
     while (true) { 
     /* Your stuff */ 
     SystemClock.sleep(1800000); 
     } 
    } 
    } 
); 
buf_liberator.setPriority(7); 
buf_liberator.start(); 

你也在Thread內需要有一個停止條件,因爲您不能再使用stop()方法停止它。

+1

注意:'1800'等於1.8秒。 – nhaarman

+0

確實,在答案中已更改,謝謝! – nKn

+0

這對我的情況無效,因爲Android操作系統可能會終止此線程。 –

1

通過使用報警管理器,您可以註冊一個重複報警,即使您的應用程序已關閉,該報警也會在每個特定時間自動觸發。所以它在電池使用方面非常有效。

然後在鬧鐘的廣播接收器裏面,你必須實現你所需要的。你應該考慮創建一個新的線程或者使用IntentService類,如果你的方法需要幾秒鐘的時間。

0

你也可以做到這一點通過CountDownTimer

CountDownTimer countDownTimer; 

public void usingCountDownTimer() { 
     countDownTimer = new CountDownTimer(Long.MAX_VALUE, 10000) { 

      // This is called after every 10 sec interval. 
      public void onTick(long millisUntilFinished) {    
       setUi("Using count down timer"); 
      } 

      public void onFinish() {    
       start(); 
      } 
     }.start(); 
    } 

和的onPause()方法中添加

@Override 
    protected void onPause() { 
     super.onPause(); 
     try { 
      countDownTimer.cancel(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    }