在安卓系统中停止服务功能无法正常工作。

3

我是一名新手学习安卓开发,我有一个使用后台服务的应用程序。 我想通过点击按钮来启动/停止服务,我是这样做的:

case R.id.enablepop:
        if (!(pop.runningFlag))
            startService(new Intent(mainScreen,PopUpService.class));
        return true;
case R.id.disablepop:
        if (pop.runningFlag)
                stopService(new Intent(mainScreen,PopUpService.class));
        return true;

在服务的onStart()函数中,我有一个runningFlag参数,我将其设置为“true”,然后创建一个线程,只要runningFlag为true,线程就会一直运行。在onDestroy()函数中,我将runningFlag设置为false。
问题是服务不会停止。请问有人能帮我解决吗?

https://dev59.com/eHI95IYBdhLWcg3wvgl9 - Vineet Shukla
你是如何确定“服务不会停止”的? - CommonsWare
我看到了,但是我不太明白我需要做什么,我没有重写onBind()函数,也许这就是问题所在? 我应该把onServiceDisconnect()放在哪里,因为我在Activity中停止了服务。 - kande
我知道服务仍在运行,因为我在其中使用了Log.d()。 - kande
1个回答

2

尝试使用Handler,就像这里可以使用类似Thread的Handler。

以下是示例:

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;

public class MyService extends Service{
    private Handler handler;
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        handler = new Handler();
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        handler.post(updateStatus);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        handler.removeCallbacks(updateStatus);
        handler = null;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        handler.removeCallbacks(updateStatus);
        handler = null;
        return super.onUnbind(intent);
    }

    private Runnable updateStatus = new Runnable() {
        @Override
        public void run() {
            // do something here
            handler.postDelayed(updateStatus, 1000);
        }
    };
}

在这里,处理程序可以在onCreate方法中初始化,然后当调用onStart方法时,updateStatus对象将通过handler.post()被调用,这将启动此Runnable对象的run方法。

现在,在此过程中,run()将立即被调用并仅执行一次语句,因此为了重复此任务,请在此方法内部按照特定延迟时间(例如1000毫秒)进行调用,因此在完成所有执行之后,它将再次在1秒后调用并重复此任务,直到您无法从处理程序中删除可运行对象,因此基本上这是在onDestroy()中调用的。


谢谢您的评论,我尝试了,但仍然不起作用。我需要像之前一样停止服务吗? stopService(new Intent(mainScreen,PopUpService.class)); ? - kande
当然,线程、进程和服务是不同的。因此,即使您使用stopService方法停止了服务,但仍然有线程在后台运行。为了解决这个问题,您可以使用Runnable和Handler来处理线程,就像这样: - Pratik
我使用了Log函数来检查服务是否仍在运行,并且它继续从线程中打印一些东西,所以我猜它仍在工作...有没有其他解决方法? - kande
好的,如果我在服务已经运行时执行startService(new Intent(mainScreen,PopUpService.class)),会有任何问题吗? - kande

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接