stopService()不起作用

时间:2013-07-01 07:18:53

标签: android service

我有一个执行以下操作的IntentService:

protected void onHandleIntent(Intent intent) {
    // TODO Auto-generated method stub
    while (true) {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Hello, World!");
    }
}

以上是我正在使用的代码示例。我打算用发送到服务器的HTTP请求替换println(),但是现在我用它作为测试。我这样调用startService():

@Override
public void onPause() {
    ConnectionUtility.getInstance().startService(this);
    super.onPause();
}

@Override
public void onDestroy() {
    ConnectionUtility.getInstance().startService(this);
    super.onDestroy();
}

@Override
public void onStop() {
    ConnectionUtility.getInstance().startService(this);
    super.onStop();
}

我的自定义startService方法执行此操作:

public void startService(Activity activity) {
    if (!isMyServiceRunning(activity)) {
        Intent intent = new Intent(activity, BackgroundUpdateService.class);
        activity.startService(intent);
    }
}

注意:isMyServiceRunning()方法是我在别处找到的自定义方法,用于确定服务是否正在运行。据我所知,该方法有效。

现在,此服务的目的是在特定Activity退出时(通过onPause(),onDestroy()或onStop())触发println(),并且当onCreate()或onResume()运行时,服务将如此停止:

@Override
public void onResume() {
    ConnectionUtility.getInstance().stopServiceIfRunning(this);
    super.onResume();
}

更深入了解stopServiceIfRunning():

public void stopServiceIfRunning(Activity activity) {
    if (isMyServiceRunning(activity)) {
        Intent intent = new Intent(activity, BackgroundUpdateService.class);
        activity.stopService(intent);
    }
}

现在问题出现了:我可以启动服务,当我通过Home / Back按钮退出Activity时,或者当我切换到不同的Activity时,startService()方法启动并且运行完美;也就是说,“你好,世界!”根据需要每隔5秒打印一次。但是当我导航回Activity时,我可以确定我的自定义stopServiceIfRunning()方法运行并且代码很好地进入了IF块(已确认),但是服务没有停止并且“Hello,World!”只是保持不变未来。我做错了什么?

--- --- EDIT 回应塞拉芬的评论:

private boolean isMyServiceRunning(Activity activity) {
    ActivityManager manager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (BackgroundUpdateService.class.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

但同样,这个方法到目前为止准确地返回了真值和假值,所以我认为这不是问题。

2 个答案:

答案 0 :(得分:2)

终于找到了办法,非常感谢塞拉芬帮助我这么多。

我最终覆盖了我的自定义IntentService类的onDestroy()方法。这就是我想出的:

public class BackgroundUpdateService extends IntentService {

    private boolean status;

    public BackgroundUpdateService() {
        super("BackgroundUpdateService");
        // TODO Auto-generated constructor stub
    }   

    @Override
    protected void onHandleIntent(Intent intent) {
        status = true;
        // TODO Auto-generated method stub
        while (status) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("Hello, World!");
        }
    }

    @Override
    public void onDestroy() {
        status = false;
        super.onDestroy();
    }
}

显然,每当调用.stopService(intent)时都会调用onDestroy()方法,所以我利用这个事实来阻止while循环。这避免了可靠性问题,因为每个Service都有自己的布尔变量,并且不依赖于静态变量,并且不需要通过Intent传递任何其他变量。

再次感谢Seraphim花时间帮助我。

答案 1 :(得分:0)

停止服务不是同步操作。如果您的服务终止检查接近上一次“服务停止”呼叫,您可能会发现您的服务仍在运行。

在我需要停止服务的应用程序中(退出应用程序时)我进入循环周期(使用AsyncTask)并等待服务终止。

我看到你打电话了

@Override
public void onDestroy() {
    ConnectionUtility.getInstance().startService(this);
    super.onDestroy();
}

我建议您使用Application Context来启动和停止服务,而不是将Activity用作context。因为当活动即将被销毁时你就开始服务了!

也是部分

protected void onHandleIntent(Intent intent) {
    // TODO Auto-generated method stub
    while (true) {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Hello, World!");
    }
}

处理意图时的无限循环?听起来不太好。