2016-09-20 26 views
-4

我們有一個應用程序,每隔10秒處理一個任務。這應該或多或少精確,這意味着12秒的差異是OK,但不是20秒或更多的差距。Android:每10秒完成一次任務(正好)

無論應用程序在前臺還是後臺打開,這都應該可以工作。

我們通過AlarmManager執行此操作,但它無法正常工作。如果智能手機沒有插入並且在後臺運行,則執行中存在差距。

隨着Android 4.3.,我們從時間間隔(約30秒)時,與Android 5.x我們也減少了差距,但約510分鐘長的空白!

我認爲必須有一種方法來實現這一點,鬧鐘也是可能的,而且是確切的。

有關該應用的更多信息:它在一個服務中工作,並實現一個廣播接收器。這意味着如果我擦掉應用程序或重新啓動該應用程序,服務將重新啓動。這工作正常。唯一的問題是10第二項任務。

任何提示?鬧鐘是如何實施的?哪個調用API?

我嘗試過不同的方式,直到現在沒有成功。

感謝 漢斯

回答

0
public void callAsynchronousTask() { 
    final Handler handler = new Handler(); 
    Timer timer = new Timer(); 
    TimerTask doAsynchronousTask = new TimerTask() {  
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() {  
        try { 
         PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask(); 
         // PerformBackgroundTask this class is the class that extends AsynchTask 
         performBackgroundTask.execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(doAsynchronousTask, 0, 10000); //execute in every 10000 ms 
} 
-2

使用 「AlarmManager」 與 「廣播接收器」 和 「服務」。這3個組件將使您的需求得以實現。

使用Alarm Manager生成廣播接收器,並從BroadcastReceiver啓動一個服務,您可以在其中放置所需的邏輯代碼,以便每10秒完成一次任務。

+2

這是一個相當模糊的,不完整的答案。 –

+0

嗨。我用AlarmManager嘗試它。這工作,我的Tast每10秒鐘被調用一次。但過了一段時間,它不需要5或10分鐘!這發生在應用程序運行幾分鐘或幾小時後,並且每小時發生一次(或多或少)。我不知道爲什麼。 – Hans

+0

很高興聽到它爲你工作。我瞭解你目前的問題。這通常會發生,因爲缺乏資源或其他原因可能會停止服務。因此,爲了每次都運行它,您還需要註冊其他廣播接收器。例如,您需要在獲得wake_up權限後註冊Wake_up。因此,無論何時用戶開始使用手機,您的廣播接收器都會被調用,並且您可以檢查您的所需服務是否正在運行。如果不啓動該服務。您甚至可以使用sharedprefs來存儲上次調用toast的服務的值。 –

0

你可以用處理器和可運行做到這一點,我認爲這是由Android首選..

public class ActivityMain extends Activity 
{ 
    private Handler mainHandler = new Handler(); 
    private Runnable backgroundTask = new Runnable() { 
     @Override 
     public void run() { 
      //do your background task 
      mainHandler.postDelayed(this, 10000); 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mainHandler.postDelayed(backgroundTask, 10000); 
    } 
} 
+0

我試過這個,沒有成功。有幾秒或幾分鐘的上限。我不知道爲什麼。 該應用程序應該在前臺和後臺工作。 – Hans