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

时间:2010-12-14 18:18:59

标签: android service state

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

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

以下电话

getApplicationContext().bindService(new Intent(getApplicationContext(),
        MyService.class), mServiceConnection, 0);

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

7 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:11)

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

@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);
}

答案 2 :(得分:2)

另一种方法:

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 :(得分:1)

我有同样的需求,并发现运行.bindService已经绑定了其他东西,它会导致错误。我在运行.bindService

之前做到了这一点
try{
    context.unbindService(fetch_connection);
} catch (IllegalArgumentException e){
    System.out.println("Unbinding didn't work. little surprise");
}

答案 4 :(得分:0)

答案 5 :(得分:0)

在您的活动中,您只需使用服务实例进行检查即可 在我的情况下,我使用

完成
  button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent intent=new Intent(MainActivity.this, MyService.class);
            //startService(intent);
            bindService(intent,serviceConnection,BIND_AUTO_CREATE);
            if (myService!=null)
            {
                myService.RecData(editText.getText().toString());
            }
        }
    });
}

ServiceConnection serviceConnection=new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        Toast.makeText(MainActivity.this,"onServiceConnected called",Toast.LENGTH_SHORT).show();
        MyService.MyBinder myBinder= (MyService.MyBinder) iBinder;
        myService= myBinder.getServiceInstant();
        myService.SetActivity(MainActivity.this);
        myService.RecData(editText.getText().toString());
    }

答案 6 :(得分:-1)

如果服务正在运行/未运行,您打算做什么?为什么不拨打startService()。如果它没有运行,那将创建它,如果是,它将调用它的onStart()方法。