【发布时间】:2013-09-04 13:42:21
【问题描述】:
我使用了警报管理器来允许用户安排特定任务在特定时间重复。在应用程序的上下文中,我有一个 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();
}
}
所以,我的问题是;我的结构正确吗?我应该使用普通的 Service 而不是 IntentService 吗?我的 IntentService 在处理 Intent 时可以收集垃圾吗(我想我读到这是可能的)?
【问题讨论】:
标签: java android android-service