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