Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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 - Fatal编程技术网

Java 当应用程序关闭时,如何保持服务在后台运行,而当应用程序位于前台时,如何停止/禁用服务?

Java 当应用程序关闭时,如何保持服务在后台运行,而当应用程序位于前台时,如何停止/禁用服务?,java,android,Java,Android,在这种情况下,我很难处理服务行为 基本上,我有一个服务运行在一个单独的进程上,每当应用程序关闭时,它都需要在每个特定的时间发出httprequests,然后在首选项中写入一些内容或抛出一个通知 逻辑运作良好。我遇到的问题是,每当应用程序运行时,我都无法找到正确停止/禁用该服务的方法,也无法在应用程序完成或进入后台时重新启动该服务 我尝试在@onResume()/@onStart()回调我的活动时停止它,也尝试在@onStop()/@onDestroy()启动它,但在任何情况下行为都不会按预期运行

在这种情况下,我很难处理服务行为

基本上,我有一个服务运行在一个单独的进程上,每当应用程序关闭时,它都需要在每个特定的时间发出httprequests,然后在首选项中写入一些内容或抛出一个通知

逻辑运作良好。我遇到的问题是,每当应用程序运行时,我都无法找到正确停止/禁用该服务的方法,也无法在应用程序完成或进入后台时重新启动该服务

我尝试在@onResume()/@onStart()回调我的活动时停止它,也尝试在@onStop()/@onDestroy()启动它,但在任何情况下行为都不会按预期运行

我将在这里粘贴一些我迄今为止尝试过的代码片段:

我使用以下方式启动/停止服务:

stopService(new Intent(this,NotificationService.class));
startService(new Intent(this, NotificationService.class));
我的应用程序中的随机活动(所有应用程序都在其回调中实现):

由于应用程序从许多活动中移动,这可能无法工作或带来意外行为,并且当应用程序正在运行或在后台/完成时停止服务时,服务将处于活动状态

我还尝试在service Timer上打开/关闭service logic(服务时间任务),通过询问:

    @Override
    public void run() {

       ActivityManager activityManager = (ActivityManager) getBaseContext().getSystemService( ACTIVITY_SERVICE );
            List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
                for(int i = 0; i < procInfos.size(); i++){
                    if(procInfos.get(i).processName.equals("com.example.myapp")) {
                        return;
                    }
                }
    //service http request logic here
    }
@覆盖
公开募捐{
ActivityManager ActivityManager=(ActivityManager)getBaseContext().getSystemService(ACTIVITY_服务);
List procInfos=activityManager.getRunningAppProcesses();
对于(int i=0;i
但这也不起作用,因为进程“com.example.myapp”从未被杀死(当然我不能/想强制完成),所以它从未发出任何httprequest

关于如何实现这一点有什么想法吗?欢迎任何帮助


提前感谢。

绑定到您的服务,然后直接与之通信怎么样?实现一个简单的开/关布尔值,在绑定上公开一个getter/setter,然后确保服务在执行任何工作之前检查布尔值。这样,您就可以在应用程序运行时禁用它,而不必反复启动/停止服务


通过更好地处理onStop()onResume()回调解决了此问题。

谢谢您的回答。我考虑过这个选择。问题是我担心这个解决方案会遇到同样的问题。例如,我不能单击“多任务”,然后将应用程序拖走,并期望看到onDestroy()调用,以便我可以解除服务绑定和/或切换布尔值。这与其说是关于服务与应用程序或代理程序的通信方式,不如说是关于确保每当应用程序在后台/完成时,服务都会每x次运行其请求。无论何时启动应用程序,它都应该停止。可能会导致当前解决方案出现问题的一个原因是,在切换活动时,在对旧活动调用
onStop()
之前,会对新活动调用
onResume()
。这意味着您的服务将在切换活动时停止运行。通过中断适当的方法,您应该能够很容易地看到这一点。至于为什么当应用程序关闭时,你会发现它没有运行,也许操作系统正在关闭它?如果你想让你的服务永久运行,你需要使用
startForeground()
。你能告诉我你是如何处理OnStop还是OnResume。。。?
    @Override
    public void run() {

       ActivityManager activityManager = (ActivityManager) getBaseContext().getSystemService( ACTIVITY_SERVICE );
            List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
                for(int i = 0; i < procInfos.size(); i++){
                    if(procInfos.get(i).processName.equals("com.example.myapp")) {
                        return;
                    }
                }
    //service http request logic here
    }