将Intent Service与Alarm Manager结合使用

时间:2013-09-04 13:42:22

标签: java android android-service

我已经使用警报管理器允许用户安排某个任务在一定时间内重复。在应用程序的上下文中,我有一个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 时是否可以收集垃圾(我想我读过这是可能的)?

2 个答案:

答案 0 :(得分:1)

  

我的IntentService在处理Intent时是否可以收集垃圾(我想我觉得这是可能的)?

不,但您的流程可以终止。

  我正确地构建了这个吗?

如果您尝试使用_WAKEUP警报,则不会。在这种情况下,您需要更仔细地设置,我建议使用WakefulBroadcastReceivermy WakefulIntentService来处理该模式。

  

我应该使用普通服务而不是IntentService吗?

不,IntentService会好的。您可能需要考虑使用startForeground()将其作为前台服务。

答案 1 :(得分:0)

原来错误是除了Android的垃圾收集器之外的其他地方。我使用缓存最终导致我“用完了船只”,因为在发送时间,它从池中扣除了发送的船只数量。然而,当他们返回时,他们从未被添加回缓存。在白天,我可能手动刷新缓存或强制Android通过使用我的手机清除它,否则不会引起问题(同样多)。