1

我使用了警报管理器来允许用户安排特定任务在特定时间重复。在应用程序的上下文中,我有一个 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");

我的意图服务:

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时可以收集垃圾吗(我想我读到这是可能的)?

4

2 回答 2

1

我的 IntentService 在处理 Intent 时可以收集垃圾吗(我想我读到这是可能的)?

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

我的结构正确吗?

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

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

不,一个IntentService会好的。您可能需要考虑使用startForeground().

于 2013-09-04T13:55:03.720 回答
0

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

于 2013-09-05T06:52:17.317 回答