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

Igo*_*gor 20 service android state

检查Android服务是否正在运行的最佳方法是什么?我知道ActivityManagerAPI,但似乎不建议使用API​​类似于我的()方案.我也知道使用全局/持久变量来维护服务状态的可能性.

我试图使用bindService标志设置0,但我遇到了与链接上的人相同的问题(唯一的例外是,我正在尝试bindService使用本地服务).

以下电话

getApplicationContext().bindService(new Intent(getApplicationContext(),
        MyService.class), mServiceConnection, 0);
Run Code Online (Sandbox Code Playgroud)

始终返回true,但不会连接.这是预期的行为吗?在我看来,bindService如果服务尚未运行(不是,我已经检查过),或者如果BIND_AUTO_CREATE没有设置标志(再次,它不是),我应该返回false .

bry*_*anr 11

我有同样的问题; 似乎最着名的解决方案是在WhateverService中创建一个公共静态布尔值,在onCreate(或onStartCommand,您的选择)期间设置为true,在onDestroy期间设置为false.然后,您可以从同一个apk中的任何其他类访问它.虽然这可能比较棘手.Android中没有用于检查服务是否正在运行的API(没有副作用):请参阅http://groups.google.com/group/android-developers/browse_thread/thread/8c4bd731681b8331/bf3ae8ef79cad75d

我认为竞争条件来自于操作系统可能随时终止远程服务(在另一个进程中).检查本地服务(相同的过程),如上所述,对我来说似乎没有竞争对手 - 如果操作系统杀死了服务,它会杀死检查其状态的任何内容.


Анд*_*чёв 10

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

@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);
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个好主意,SharedPreferences会持久存储到非易失性存储中,因此如果由于某种原因设备崩溃或断电,那么您的`onDestroy`将不会被调用,下次启动您的应用时,您会认为该服务正在运行虽然不是. (7认同)