AlarmManager停止运行

时间:2011-09-14 02:29:44

标签: android alarmmanager android-service

我正在编写一个应该在后台每10分钟运行一次的程序。只要我正在积极地使用我的手机,我的代码似乎工作得很好,但经过很长一段时间,过夜说,这个过程似乎停止在它自己。当我的程序运行时,我应该可以在我的设备上的“缓存进程”下查看它,但之后它会在一段时间后停止显示在列表中。

我正在阅读WakefulIntentService并且想知道我是否需要使用它。据我了解,即使手机处于睡眠状态,它也会使您的后台进程保持运行状态。不确定Android中的“睡眠”意味着什么,如果是关机时,或者如果手机暂时不使用则会进入“睡眠”状态。

这是我正在使用的代码:

主要课程:

 public class Main extends ListActivity
 {
      @Override
      public void onCreate(Bundle icicle) 
      {
           AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

           Intent myIntent = new Intent(this, AlarmReceiver.class);
           PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, myIntent, 0);
           alarmManager.cancel(pendingIntent);

           alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 600000, 600000, pendingIntent);
      }
 }

BroadcastReceiver类:

 public class AlarmReceiver extends BroadcastReceiver 
 {
      @Override
      public void onReceive(Context context, Intent intent) 
      { 
           context.startService(new Intent(context, MainService.class));
      }
 }

服务类:

 public class MainService extends Service  
 {  

protected void handleIntent(Intent intent) 
{
    // obtain the wake lock 
    PowerManager pm = (PowerManager)getSystemService(POWER_SERVICE); 
    mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); 
    mWakeLock.acquire(); // check the global background data setting 
    ConnectivityManager cm = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE); 

    if (!cm.getBackgroundDataSetting()) 
    { 
        stopSelf();
        return; 
    }

    new FetchItems().execute();
}
 }

 private class FetchItems extends AsyncTask<Void, Void, Void> 
 {
    protected Void doInBackground(Void... unused) 
    {           
      SomeLongProcess();
      return null;
    }

    @Override 
    protected void onPostExecute(Void result) 
    {   
        stopSelf();
    }
 }

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

 @Override 
 public void onStart(Intent intent, int startId) { 
   handleIntent(intent); 
 }

@Override
public void onDestroy() 
{
         super.onDestroy(); 

         AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

         Intent myIntent = new Intent(this, AlarmReceiver.class);
         PendingIntent pendingIntent = PendingIntent.getService(this, 0, myIntent, 0);
         alarmManager.cancel(pendingIntent);

      mWakeLock.release();
}

的AndroidManifest.xml:

<receiver android:name=".AlarmReceiver"> 
    <intent-filter> 
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter> 
</receiver>

1 个答案:

答案 0 :(得分:2)

即使设备处于睡眠状态,它是否真的必须每十分钟运行一次?如果没有,请使用AlarmManager.ELAPSED_REALTIME,您的服务将在设备唤醒时运行,从而节省很多电池。至于你的问题,你可以假设屏幕变暗= =进入睡眠状态(当然,如果其他服务持有唤醒锁,则情况并非如此)。