Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将意向服务与报警管理器结合使用_Java_Android_Android Service - Fatal编程技术网

Java 将意向服务与报警管理器结合使用

Java 将意向服务与报警管理器结合使用,java,android,android-service,Java,Android,Android Service,我使用了Alarm Manager,允许用户计划在特定时间重复某项任务。在应用程序的上下文中,我有一个Android游戏,人们可以在其中安排何时发送船只。警报管理器工作正常,警报在正确的时间启动等 当警报响起时(通常每小时一次),我的IntentService将开始与服务器通信以发送船只。此操作可能需要1分钟,但最多可以持续10分钟。即使这一切都很好。警报被触发,船只被发送,每个人都很高兴。问题出现在晚上,我睡着了,醒来时,我希望我的船已经被派了一整夜。不。日志记录和通知显示警报已正确触发,但I

我使用了Alarm Manager,允许用户计划在特定时间重复某项任务。在应用程序的上下文中,我有一个Android游戏,人们可以在其中安排何时发送船只。警报管理器工作正常,警报在正确的时间启动等

当警报响起时(通常每小时一次),我的IntentService将开始与服务器通信以发送船只。此操作可能需要1分钟,但最多可以持续10分钟。即使这一切都很好。警报被触发,船只被发送,每个人都很高兴。问题出现在晚上,我睡着了,醒来时,我希望我的船已经被派了一整夜。不。日志记录和通知显示警报已正确触发,但IntentService在与服务器通信时似乎已被终止

可能的原因是,我没有像醒着时那样每隔一段时间看一次游戏,因此保持某种形式的进程运行,从而防止IntentService被垃圾收集

我已经尝试了很多方法来解决这个问题。我曾经使用过BroadCastReceiver,我曾经在IntentService中生成异步任务,但后来我对代码进行了重构,不再使用这些东西,因为它们对服务来说是不好的做法

我也检查了这个资源:但我仍然不确定我所做的是否是处理这种情况的正确方法。我已经为第二天晚上做了大量的日志记录,以便第二天早上进行回顾,但我想听听你们的意见

哦,我还请求在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();
    }
}
公共类ScheduledRequestService扩展了IntentService{
公共ScheduledRequestService(){
超级(“ScheduledRequestService”);
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startID){
Logger.d(“OnStartCommand!”);
返回super.onStartCommand(intent、flags、startID);
}
@凌驾
受保护的手部内容无效(意图){
ScheduledRequest请求=(ScheduledRequest)intent.getExtras().getSerializable(“请求”);
//此功能将启动大量的客户机-服务器通信
请求。onExecute(此,意图);
}
@凌驾
公共空间{
Logger.d(“OnDestroy!”);
super.ondestory();
}
}
所以,我的问题是;我的结构正确吗?我是否应该使用正常的服务而不是意向服务?我的IntentService在处理Intent时是否可以收集垃圾(我认为这是可能的)

我的IntentService在处理意图时是否可以收集垃圾(我想我读到这是可能的)

否,但您的进程可以终止

我的结构正确吗

如果您试图使用
\u唤醒
警报,则不会。在这种情况下,您需要更仔细地进行设置,我建议您要么处理该模式,要么处理该模式

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

不需要,
IntentService
就可以了。您可能需要考虑使用<代码> StestRealStand()/<代码>使其成为前景服务。

我的IntentService在处理意图时是否可以收集垃圾(我想我读到这是可能的)

否,但您的进程可以终止

我的结构正确吗

如果您试图使用
\u唤醒
警报,则不会。在这种情况下,您需要更仔细地进行设置,我建议您要么处理该模式,要么处理该模式

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


不需要,
IntentService
就可以了。您可能需要考虑使用<代码> StestFordSub()/代码>使其成为一个前景服务。

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

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

如果我的IntentService在处理意图时无法进行垃圾收集,那么肯定是其他原因妨碍了Intent正常工作。“唤醒”闹钟是什么意思?我会尝试把它变成前台服务,看看它能做什么。谢谢你的建议。@wotu:正如我所写的,你的进程可能会被终止。除了正在运行的服务之外,所有的东西都可能被终止,如果进程被终止,我的服务也会因此而终止,那么我需要以某种方式来阻止。@wotu:你不能“以某种方式阻止它”。您并不比用户更重要,用户可以随时以各种方式终止您的流程。不过,使用前台服务将降低操作系统自行终止进程的几率。取舍是,当你的应用程序在前台时,它将显示一个
通知
,而