如何在应用程序关闭时保持服务在后台运行,但在应用程序处于前台时停止/禁用它?

时间:2013-12-12 15:19:34

标签: java android

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

基本上我有一个服务在一个单独的进程上运行,每当应用程序关闭时需要每隔一段时间发出一次httprequests,然后在偏好中写入内容或发送通知。

逻辑正常。我遇到的问题是我无法在应用程序运行时找到正确停止/禁用该服务的方法,以及在应用程序完成或放入后台时再次启动。< / p>

我已经尝试在@onResume()/ @ onStart()回调我的活动以及在@onStop()/ @ onDestroy()处启动它,但行为在任何情况下都没有按预期运行...... < / p>

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

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

stopService(new Intent(this,NotificationService.class));
startService(new Intent(this, NotificationService.class));

我的应用中的随机活动(所有这些都在回调中实现):

    @Override
    protected void onResume() {
        if (Utility.isMyServiceRunning(this)){
            Utility.serviceClose(this);
        }
        super.onResume();
    }

    @Override
    protected void onStop() {
        if (!Utility.isMyServiceRunning(this)){
            startService(new Intent(this, NotificationService.class));
        }
        super.onStop();
    }

由于应用程序从许多活动中移出,因此某种方式不起作用或带来意外行为,并且当应用程序运行时服务最终处于活动状态,或者当应用程序处于后台/完成时服务停止。

我还尝试通过询问来切换服务时间任务的开/关服务逻辑:

    @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
    }

但这不起作用,因为进程“com.example.myapp”永远不会被杀死(当然我不能/想要强制完成),所以它永远不会发出任何httprequest。

关于如何实现这一点的任何想法?任何帮助都会非常受欢迎。

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

http://developer.android.com/guide/components/bound-services.html

答案 1 :(得分:1)

通过更好地处理onStop()onResume()回调来解决。