繁体   English   中英

将Intent Service与Alarm Manager结合使用

[英]Using Intent Service in combination with Alarm Manager

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

我的IntentService处理Intent时能否将其收集为垃圾(我想我读到这是可能的)?

否,但是您的过程可以终止。

我是否正确构造了这个结构?

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

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

不,可以使用IntentService 您可能需要考虑使用startForeground()使其成为前台服务。

原来错误是在Android的垃圾收集器之外的其他地方。 我使用的是高速缓存,最终导致我“船只用完了”,因为在发送时间,它从池中扣除了已发送的船只数量。 但是,当它们返回时,它们永远不会被添加回缓存中。 白天,我可能手动刷新了缓存,或者强迫Android使用我的手机清除了缓存,否则并没有引起问题的发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM