AlarmManager перестает работать - PullRequest
       8

AlarmManager перестает работать

0 голосов
/ 14 сентября 2011

Я пишу программу, которая должна запускаться каждые 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 Ответ

2 голосов
/ 14 сентября 2011

Действительно ли он должен запускаться каждые десять минут, даже когда устройство спит?Если этого не произойдет, используйте AlarmManager.ELAPSED_REALTIME, и ваша служба будет работать, когда устройство активируется, экономя много батареи.Что касается вашего вопроса, вы можете предположить, что экран становится темным == идет в спячку (конечно, если другие службы удерживают блокировку, это не так).

...