【问题标题】:Stop service doesn't work on android停止服务在android上不起作用
【发布时间】:2011-10-10 21:42:13
【问题描述】:

我是一名刚接触 android 的学生,我有一个使用后台服务的应用程序。 我想通过单击一个按钮来启动/停止服务,我这样做是这样的:

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。

问题是服务不会停止。有人可以帮我吗?

【问题讨论】:

  • 您如何确定“服务不会停止”?
  • 我看到了,我真的不明白我需要做什么,我没有覆盖 onBind() 函数,也许这就是问题所在?我需要将 onServiceDisconnect() 放在哪里,因为我在 Activity 中停止了服务..
  • 我知道该服务仍在运行,因为我在其中使用了 Log.d()。

标签: android service


【解决方案1】:

尽量使用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)); ??
  • 是的,肯定会发生什么线程进程和服务都是不同的,所以当你使用 stopService 方法停止服务但线程仍然在后台运行时,为了克服这个问题,你可以像这样使用 Runnable 和 Handler 处理线程
  • 我用Log函数来检查服务是否还在工作,它继续从线程打印一些东西,所以我猜它还在工作....有没有其他方法可以解决了吗?
  • 好的,如果有什么情况我在服务已经运行的时候做 startService(new Intent(mainScreen,PopUpService.class)) 会不会有什么问题?
猜你喜欢
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 2021-08-14
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多