2014-02-23 199 views
13

我有一個服務,我希望在後臺每分鐘執行一次任務。只要用戶正在使用它,只要手機處於睡眠狀態,它就不需要執行任務。我試圖用它被設置爲一個IntentService做到這一點如下:每分鐘運行一次的服務

public class CounterService extends IntentService{ 

    public CounterService() { 
     super("CounterService"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     return super.onStartCommand(intent,flags,startId); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Toast.makeText(this, "onhandleintent", Toast.LENGTH_SHORT).show(); 
     while(true) 
     { 
      //one minute is 60*1000 
      try { 
       Thread.sleep(5 * 1000); 
       Toast.makeText(getApplicationContext(), "getting app count", Toast.LENGTH_LONG).show(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

現在得到的功能工作,我只是希望它顯示舉杯每5秒鐘,我會在稍後將其更改爲一分鐘。如果我將while(true)註釋掉,則會顯示「onhandleintent」消息。但是,如果我有以下代碼運行,則沒有任何Toasts顯示。我怎樣才能解決這個問題?

+0

考慮使用PendingIntent和AlarmManager而不是while循環。有關更多信息,請參閱文檔。這是一個[SO帖子](http://stackoverflow.com/questions/3052149/using-alarmmanager-to-start-a-service-at-specific-time),顯示了一個例子。 – Vino

回答

19

這將意向發送給服務每分鐘不使用任何處理器時間在你的活動

之間
Intent myIntent = new Intent(context, MyServiceReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent, 0); 

    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.add(Calendar.SECOND, 60); // first time 
    long frequency= 60 * 1000; // in ms 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), frequency, pendingIntent);   

調整MyServiceReceiver.class,以配合您的目標服務或活動

+1

它應該是PendingIntent.getService而不是PendingIntent.getBroadcast才能運行服務。 – Vistritium

3

您需要退出主線程以避免冒着ANR風險。

而是添加一個處理

Handler mHandler = new Handler(); 

... 

@Override 
protected void onHandleIntent(Intent intent) { 
    Toast.makeText(this, "onhandleintent", Toast.LENGTH_SHORT).show(); 
    mHandler.postDelayed(ToastRunnable, 5000); 
    //while(true) 
    //{ 

     //one minute is 60*1000 
     //try { 
     // Thread.sleep(5 * 1000); 
     // Toast.makeText(getApplicationContext(), "getting app count",   
     //Toast.LENGTH_LONG).show(); 
     //} catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
     // e.printStackTrace(); 
     //} 
    //} 
} 
final Runnable ToastRunnable = new Runnable(){ 
    public void run(){ 
     Toast.makeText(getApplicationContext(), "getting app count",   
       Toast.LENGTH_LONG).show(); 
     mHandler.postDelayed(ToastRunnable, 5000); 
    } 
} 
1

是否這樣做

private void ping() { 
    try { 
     //Your code here or call a method 
    } catch (Exception e) { 
     Log.e("Error", "In onStartCommand"); 
     e.printStackTrace(); 
    } 
     scheduleNext(); 
    } 

    private void scheduleNext() { 
     mHandler.postDelayed(new Runnable() { 
     public void run() { ping(); } 
     }, 60000); 
    } 

    public int onStartCommand(Intent intent, int x, int y) { 
     mHandler = new android.os.Handler(); 
     ping(); 
     return START_STICKY; 
    }