我正在编写一个应该在后台每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>
答案 0 :(得分:2)
即使设备处于睡眠状态,它是否真的必须每十分钟运行一次?如果没有,请使用AlarmManager.ELAPSED_REALTIME
,您的服务将在设备唤醒时运行,从而节省很多电池。至于你的问题,你可以假设屏幕变暗= =进入睡眠状态(当然,如果其他服务持有唤醒锁,则情况并非如此)。