首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android:检查服务是否正在运行。bindService

Android:检查服务是否正在运行。bindService
EN

Stack Overflow用户
提问于 2010-12-14 18:18:58
回答 7查看 42.1K关注 0票数 21

检查Android服务是否正在运行的最佳方法是什么?我知道ActivityManager API,但似乎不建议在类似于我的(来源)的场景中使用该API。我还知道使用全局/持久变量来维护服务状态的可能性。

我尝试使用bindService,并将标志设置为0,但我遇到了与源链接上的人员相同的问题(唯一的例外是,我使用本地服务尝试bindService )。

以下呼叫

代码语言:javascript
复制
getApplicationContext().bindService(new Intent(getApplicationContext(),
        MyService.class), mServiceConnection, 0);

始终返回true,但不连接。这是预期的行为吗?在我看来,如果服务还没有运行(我已经检查过了),或者如果没有设置BIND_AUTO_CREATE标志(同样没有),那么BIND_AUTO_CREATE应该返回false。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-01-04 00:59:07

我也有同样的问题;似乎最著名的解决方案是在WhateverService中创建一个公共静态布尔值,在onCreate (或onStartCommand,您的选择)中设置为true,在onDestroy中设置为false。然后,您可以从同一个apk中的任何其他类访问它。不过,这可能是混混。Android中没有API来检查服务是否正在运行(没有副作用):请参阅thread/thread/8c4bd731681b8331/bf3ae8ef79cad75d

我认为竞争条件来自于操作系统可能在任何时候杀死远程服务(在另一个进程中)。检查本地服务(相同的进程),如上面所建议的,似乎没有种族--在我看来--如果OS杀死了服务,它也会杀死任何检查过它的状态。

票数 11
EN

Stack Overflow用户

发布于 2013-01-28 06:43:38

使用共享首选项保存服务运行标志。

代码语言:javascript
复制
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    int res = super.onStartCommand(intent, flags, startId);
    setRunning(true);
    return res;
}

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

private void setRunning(boolean running) {
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    SharedPreferences.Editor editor = pref.edit();

    editor.putBoolean(PREF_IS_RUNNING, running);
    editor.apply();
}

public static boolean isRunning(Context ctx) {
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(ctx.getApplicationContext());
    return pref.getBoolean(PREF_IS_RUNNING, false);
}
票数 11
EN

Stack Overflow用户

发布于 2013-02-15 08:36:34

另一种方法:

代码语言:javascript
复制
public static boolean isServiceRunning(Context ctx, String serviceClassName) {
    ActivityManager manager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (TrackingService.class.getName().equals(serviceClassName)) {
            return true;
        }
    }
    return false;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4442660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档