在android中,有没有一种方法可以在绑定到服务之前检查服务是否已经绑定?

在android中,有没有一种方法可以在绑定到服务之前检查服务是否已经绑定?,android,android-service,Android,Android Service,我有多个片段活动,其中一个绑定到一个不断接收消息的服务。当我在活动之间切换时,出现了以下错误。我不知道列表项是如何在服务被绑定的位置被单击的。无论如何,我想知道我是否可以在绑定之前添加一个检查,看看服务是否已经运行和连接 04-08 10:34:54.674: E/ActivityThread(21091): Activity com.MyApp.MyFirstClass has leaked ServiceConnection com.MyApp.MyFirstClass$2@42c84158

我有多个片段活动,其中一个绑定到一个不断接收消息的服务。当我在活动之间切换时,出现了以下错误。我不知道列表项是如何在
服务
被绑定的位置被单击的。无论如何,我想知道我是否可以在绑定之前添加一个检查,看看
服务是否已经运行和连接

04-08 10:34:54.674: E/ActivityThread(21091): Activity com.MyApp.MyFirstClass has leaked ServiceConnection com.MyApp.MyFirstClass$2@42c84158 that was originally bound here
04-08 10:34:54.674: E/ActivityThread(21091): android.app.ServiceConnectionLeaked: Activity com.MyApp has leaked ServiceConnection com.MyApp.MyFirstClass$2@42c84158 that was originally bound here
04-08 10:34:54.674: E/ActivityThread(21091):    at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:974)
04-08 10:34:54.674: E/ActivityThread(21091):    at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:868)
04-08 10:34:54.674: E/ActivityThread(21091):    at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1960)
04-08 10:34:54.674: E/ActivityThread(21091):    at android.app.ContextImpl.bindService(ContextImpl.java:1943)
04-08 10:34:54.674: E/ActivityThread(21091):    at android.content.ContextWrapper.bindService(ContextWrapper.java:529)
04-08 10:34:54.674: E/ActivityThread(21091):    at com.MyApp.MyFirstClass.onItemClick(MyFirstClass.java:1140)
04-08 10:34:54.674: E/ActivityThread(21091):    at android.widget.AdapterView.performItemClick(AdapterView.java:313)
04-08 10:34:54.674: E/ActivityThread(21091):    at android.widget.AbsListView.performItemClick(AbsListView.java:1529)
04-08 10:34:54.674: E/ActivityThread(21091):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:3560)
04-08 10:34:54.674: E/ActivityThread(21091):    at android.widget.AbsListView$3.run(AbsListView.java:5277)
04-08 10:34:54.674: E/ActivityThread(21091):    at android.os.Handler.handleCallback(Handler.java:733)
04-08 10:34:54.674: E/ActivityThread(21091):    at android.os.Handler.dispatchMessage(Handler.java:95)
04-08 10:34:54.674: E/ActivityThread(21091):    at android.os.Looper.loop(Looper.java:146)
04-08 10:34:54.674: E/ActivityThread(21091):    at android.app.ActivityThread.main(ActivityThread.java:5635)
04-08 10:34:54.674: E/ActivityThread(21091):    at java.lang.reflect.Method.invokeNative(Native Method)
04-08 10:34:54.674: E/ActivityThread(21091):    at java.lang.reflect.Method.invoke(Method.java:515)
04-08 10:34:54.674: E/ActivityThread(21091):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
04-08 10:34:54.674: E/ActivityThread(21091):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
04-08 10:34:54.674: E/ActivityThread(21091):    at dalvik.system.NativeStart.main(Native Method)
04-08 10:34:54.674:E/ActivityThread(21091):Activity com.MyApp.MyFirstClass已泄漏ServiceConnection com.MyApp.MyFirstClass$2@42c84158原来是订在这里的
04-08 10:34:54.674:E/ActivityThread(21091):android.app.ServiceConnectionLeaked:Activity com.MyApp泄漏了ServiceConnection com.MyApp.MyFirstClass$2@42c84158原来是订在这里的
04-08 10:34:54.674:E/ActivityThread(21091):在android.app.LoadedApk$ServiceDispatcher上。(LoadedApk.java:974)
04-08 10:34:54.674:E/ActivityThread(21091):在android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:868)
04-08 10:34:54.674:E/ActivityThread(21091):位于android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1960)
04-08 10:34:54.674:E/ActivityThread(21091):位于android.app.ContextImpl.bindService(ContextImpl.java:1943)
04-08 10:34:54.674:E/ActivityThread(21091):位于android.content.ContextWrapper.bindService(ContextWrapper.java:529)
04-08 10:34:54.674:E/ActivityThread(21091):位于com.MyApp.MyFirstClass.onItemClick(MyFirstClass.java:1140)
04-08 10:34:54.674:E/ActivityThread(21091):在android.widget.AdapterView.performItemClick(AdapterView.java:313)
04-08 10:34:54.674:E/ActivityThread(21091):在android.widget.AbsListView.performItemClick(AbsListView.java:1529)
04-08 10:34:54.674:E/ActivityThread(21091):在android.widget.AbsListView$PerformClick.run(AbsListView.java:3560)
04-08 10:34:54.674:E/ActivityThread(21091):在android.widget.AbsListView$3.run(AbsListView.java:5277)
04-08 10:34:54.674:E/ActivityThread(21091):位于android.os.Handler.handleCallback(Handler.java:733)
04-08 10:34:54.674:E/ActivityThread(21091):位于android.os.Handler.dispatchMessage(Handler.java:95)
04-08 10:34:54.674:E/ActivityThread(21091):位于android.os.Looper.loop(Looper.java:146)
04-08 10:34:54.674:E/ActivityThread(21091):位于android.app.ActivityThread.main(ActivityThread.java:5635)
04-08 10:34:54.674:E/ActivityThread(21091):位于java.lang.reflect.Method.Invokenactive(本机方法)
04-08 10:34:54.674:E/ActivityThread(21091):位于java.lang.reflect.Method.invoke(Method.java:515)
04-08 10:34:54.674:E/ActivityThread(21091):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
04-08 10:34:54.674:E/ActivityThread(21091):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
04-08 10:34:54.674:E/ActivityThread(21091):在dalvik.system.NativeStart.main(本机方法)

没有直接的方法,但您可以通过 将服务对象作为静态对象并通过它绑定服务

/** Defines callbacks for service binding, passed to bindService() */
    private ServiceConnection mConnection = new ServiceConnection(){

        @Override
        public void onServiceConnected(ComponentName className, IBinder service)
        {
            // We've bound to LocalService, cast the IBinder and get
            // LocalService instance
            LocalBinder binder = (LocalBinder) service;
            Constant.mService = binder.getService();
            mBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0)
        {
            mBound = false;
        }
    };
在上述代码中,恒定。mService是静态的

所以现在,您可以从任何地方通过执行以下操作来检查服务是否绑定

if (Constant.mService != null)
                {
                Constant.mService.stopService();
                Constant.mService = null;

                }

在上面的示例中,Constant.mService是您的服务类上的对象

不应该有一些您丢失的服务连接。对于每个bindService(),都必须是具有相同意图的unbindService()-。据我所知,绑定onResume()方法(而不是onCreate)和解除绑定onPause()的最佳方法。

不确定是否找到了合适的答案,但我刚刚创建了一个名为
ExtendedServiceConnection
的包装类,它基本上能够跟踪和检查其服务是否绑定

只是稍微干净一点,然后保持一个常量的全局值

 private class ExtendedServiceConnection implements ServiceConnection {

    private boolean isServiceConnected = false;

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Timber.d("Service Connection established with " + name.getShortClassName());
        isServiceConnected=true;
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Timber.d("Service Connection destroyed with " + name.getShortClassName());
        isServiceConnected=false;
    }

    public boolean isServiceConnected() {
        return isServiceConnected;
    }
}
用法
我无法解除绑定,因为在手机关机之前,我一直需要恒定的数据。。所以我使用START_STICKY来实现这一点。您真的需要绑定到服务吗?您的服务可以发送。我并没有说您不应该使用服务。我很遗憾你的服务可以发送广播。顺便说一句,可能有许多活动可以保存此广播。该服务正在发送广播,但由于它是匿名接收器,因此出现了接收器问题,但它必须在活动之间运行,这是不可能的,因为我必须注销它。。所以解决方法是回调。好的,使用服务。因此,虽然没有调用您的服务的onServiceDisconnected()方法,但服务仍然是绑定的。
public void onReceivePause() {
    if (mExtendedServiceConnection.isServiceConnected()) {
        unbindService(orientationServiceConnection);
    }
    handleNotifications(mPackage.isIntentionalPaused());
}