我已经使用警报管理器允许用户安排某个任务在一定时间内重复。在应用程序的上下文中,我有一个Android游戏,人们可以安排何时发送他们的船。报警管理器工作正常,报警在合适的时间启动等。
当闹钟被发射时(通常每小时一点)发生的事情是,我的 IntentService 将开始与服务器通信以发送船只。此操作可能需要1分钟,但最多可持续10分钟。即使这一切都很好。警报被解雇,船只被送走,每个人都开心。问题出现在晚上,我进入睡眠状态并期待醒来后我的船只整夜被送去。不。记录&通知显示正确触发了警报,但似乎IntentService在与服务器通信时被终止。
可能的原因是我不是偶尔看一下这个游戏,就像我清醒的时候一样,因此保持某种形式的进程运行阻止 IntentService 从垃圾收集。
我已经尝试了很多东西来解决这个问题。我曾经使用BroadCastReceiver,我曾经在 IntentService 中产生 ASyncTasks ,但我已经重构了我的代码,因为它们不好而不再使用这些东西了服务实践。
我还检查了这个资源:http://techtej.blogspot.com.es/2011/03/android-thread-constructspart-4.html但是我仍然不确定我正在做的是否正确处理这种情况。我已经在第二天晚上进行了一些广泛的记录,以便在早上进行检讨,但我希望你们对此有所了解。
哦,我还要使用以下方法在 onHandleIntent 函数的整个持续时间内请求WakeLock:
PowerManager pm = (PowerManager) c.getSystemService(Context.POWER_SERVICE);
this.wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "MyApplicationWakeLock");
我的IntentService:
public class ScheduledRequestService extends IntentService {
public ScheduledRequestService() {
super("ScheduledRequestService");
}
@Override
public int onStartCommand(Intent intent, int flags, int startID){
Logger.d("OnStartCommand!");
return super.onStartCommand(intent, flags, startID);
}
@Override
protected void onHandleIntent(Intent intent) {
ScheduledRequest request = (ScheduledRequest) intent.getExtras().getSerializable("request");
// This function will start a lot of client <-> server communication
request.onExecute(this, intent);
}
@Override
public void onDestroy(){
Logger.d("OnDestroy!");
super.onDestroy();
}
}
所以再一次,我的问题是;我正确地构建了这个吗?我应该使用普通的服务而不是 IntentService 吗?我的IntentService在处理 Intent 时是否可以收集垃圾(我想我读过这是可能的)?
答案 0 :(得分:1)
我的IntentService在处理Intent时是否可以收集垃圾(我想我觉得这是可能的)?
不,但您的流程可以终止。
我正确地构建了这个吗?
如果您尝试使用_WAKEUP
警报,则不会。在这种情况下,您需要更仔细地设置,我建议使用WakefulBroadcastReceiver
或my WakefulIntentService
来处理该模式。
我应该使用普通服务而不是IntentService吗?
不,IntentService
会好的。您可能需要考虑使用startForeground()
将其作为前台服务。
答案 1 :(得分:0)
原来错误是除了Android的垃圾收集器之外的其他地方。我使用缓存最终导致我“用完了船只”,因为在发送时间,它从池中扣除了发送的船只数量。然而,当他们返回时,他们从未被添加回缓存。在白天,我可能手动刷新缓存或强制Android通过使用我的手机清除它,否则不会引起问题(同样多)。