我想以固定的时间间隔(例如30分钟)从后台获取一些数据。我已经使用警报管理器实现了解决方案,我在固定间隔内调用服务。这个过程工作正常,但我面临的问题是电池电量很少。我想利用电池消耗,以免用户逃离应用程序。警报设置与代码的第一部分类似。
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, PollingClass.class);
PendingIntent pi = PendingIntent.getService(context, 0, i, 0);
am.cancel(pi);
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60 * 1000, 30 * 60 * 1000, pi);
在第二部分中,警报会调用Service类来执行任务。
public class PollingClass extends Service {
private WakeLock mWakeLock;
public PollingClass() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void handleIntent(Intent intent) {
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "NEW");
if ((mWakeLock != null) && (mWakeLock.isHeld() == false)) {
mWakeLock.acquire();
}
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
if (!cm.getBackgroundDataSetting()) {
stopSelf();
return;
}
//Calling an Async class to fetch the data from the server
stopSelf();
}
@Override
public void onStart(Intent intent, int startId) {
handleIntent(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handleIntent(intent);
return START_NOT_STICKY;
}
public void onDestroy() {
super.onDestroy();
mWakeLock.release();
}
}
提前致谢。
答案 0 :(得分:0)
IntentService是服务的基类,可根据需要处理异步请求(表示为Intents)。客户端通过json
电话发送请求;根据需要启动服务,使用工作线程依次处理每个Intent,在工作失效时自行停止。 IntentService有一个后台线程,但仅限于调用 onHandleIntent()。一旦 onHandleIntent()返回,线程不仅会消失,而且服务也会被破坏。因此,当您在onHandleIntent()中实现代码时,这将有助于您的代码在不同的线程中运行。
例如:
startService(Intent)
THANKYOU。我希望这很有帮助。