【问题标题】:onServiceConnected never called after bindService method在 bindService 方法之后从未调用过 onServiceConnected
【发布时间】:2011-01-30 00:15:37
【问题描述】:

我有一个特殊的情况: 由广播接收器启动的服务启动一个活动。我想让这个活动能够与服务进行通信。我选择使用 AIDL 来实现它。除了在活动的onCreate() 中调用的bindService() 方法外,一切似乎都很好。实际上,bindService() 会抛出空指针异常,因为 onServiceConnected() 从未被调用,而服务的 onBind() 方法被调用。无论如何bindService() 返回真。 该服务显然是活动的,因为它启动了活动。 我知道从服务中调用活动可能听起来很奇怪,但不幸的是,这是在服务中进行语音识别的唯一方法。

提前致谢

【问题讨论】:

    标签: android binding service speech-recognition


    【解决方案1】:

    我无法根据你的描述做出确切的问题,所以我在这里猜测!

    bindService() 怎么会抛出NullPointerException?这可能(/应该)发生的唯一方法是当您不提供ServiceServiceConnection 侦听器时。

    bindService() 不能抛出 NullPointerException 因为 onServiceConnected() 没有被调用。对onServiceConnected() 的调用是bindService() 的产物。

    所以我猜你是在 Service 实际绑定之前调用 AIDL 方法?

    【讨论】:

    • 是的,抱歉,我知道这个问题可以更好地解释。抛出 NullPointerException 是因为远程接口从未填充为 remote = IRemoteService.Stub.asInterface(service);在 onServiceConnected() 中永远不会被调用。 bindService 应该立即触发 onServiceConnected 吗?
    • onServiceConnected() 不应立即调用,可能会有一点延迟。
    • 你是对的!该方法不会立即调用。那是我的问题。
    • @Matroska 但是如何立即调用它?我对NullPointerException 也有同样的问题,似乎无法摆脱它
    【解决方案2】:

    经过数小时试图弄清楚这一点,问题在于显示服务创建的示例不包含 onBind 方法,或者它们具有以下示例代码,或者它会为您生成:

    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    

    这会导致 onServiceConnected 方法失​​败或永远不会真正执行。修复非常简单,如下所示:

    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    

    您可以在其中创建一个简单的活页夹,如下所示:

    private final IBinder mBinder = new LocalBinder();
    public class LocalBinder extends Binder {
        public ConferenceService getService() {
        return ConferenceService.this;
      }
    }
    

    【讨论】:

    • 谢谢,布拉德,为我节省了一些时间!我有两个问题,一个是您在此处指出的问题,另一个是清单文件中没有定义服务。我发现检查 bindService() 的状态也很重要。
    【解决方案3】:

    我刚刚遇到了这个问题的另一个版本,同样的症状是 onServiceConnected(...) 没有被调用。在我的情况下,原因不同。

    您必须确保在应用程序标记内的 AndroidManifest.xml 中有一个服务声明 - 这对我来说是问题的根源。

    <application android:name=".YourAppTitle" android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Main" android:label="@string/app_name">
        </activity>
        <service android:name="YourService" />
    </application>
    

    如果您在 Eclipse 中使用单独的 Android 库,则会有一个额外的复杂性 - 如果引用的服务与清单位于同一包中,添加此服务标记似乎只能解决问题;即,如果您的应用位于 a.b.c 包中,并且这是 AndroidManifest.xml 所在的位置,则“YourService”也必须位于 a.b.c 包中。 (如有必要,从另一个库手动复制),否则&lt;service..&gt; 标签可能/将被忽略,onServiceConnected(...) 仍然不会被调用。

    即使我在代码中为服务使用了合适的导入语句,我的项目也是如此。 Eclipse 没有显示错误,因此导入正确地识别了 Eclipse 工作区中另一个库中的类。

    HTH

    【讨论】:

    • 我的服务在一个库中,我遇到了这个问题——你必须创建一个继承旧服务的新服务吗?
    • 我有一个包含计费服务的库项目,我希望在一堆子项目中保持基本相同;我已将其修改为抽象并在子项目中创建了一个继承它的服务,但我得到了与以前相同的错误。需要明确的是,bindService(...) 调用必须来自继承的Service 还是可以在抽象父级中?你知道这个问题的根本原因吗?
    • 我写的是我所拥有的所有信息。自去年发布以来,由于对 API 和固件错误的不满,我已经停止了 Android 开发。
    • 我发现这个错误实际上是因为服务没有调用attachBaseContext(Context)引起的。无论如何,包括那个调用修复了错误。
    • @KomodoDave 谢谢一万亿,你救了我一天。我在 developer.android.com/guide/components/… 处遵循了官方教程,而没有先了解 Service。我猜是急躁新手的常见错误。 :D:D:D
    【解决方案4】:

    还有一件事是,如果您在 oncreate 方法内调用 bindservice 方法,则在 oncreate 方法完成后调用 onserviceconnected

    因此,在oncreate 结束之前(或在调用onserviceconnected 之前)对接口函数的任何引用都会显示空指针异常。

    【讨论】:

    • 这正是我遇到的问题,我在 onCreate 中调用了 bind(... 并且不知道为什么服务总是返回 null,谢谢!!
    【解决方案5】:

    onServiceConnected 事件从未在我的应用程序中被调用。

    问题是我的应用程序清单中定义的服务名称为:

    <service android:name="MyService" android:enabled="true"></service>
    

    一旦我将它更改为完整的类名,它就可以工作了:

    <service android:name="com.example.MyService" android:enabled="true"></service>
    

    更新:您也可以使用相对类名:

    <service android:name=".MyService" android:enabled="true"></service>
    

    使用完整的 com.example.MyServiceClass 指定类名,而不仅仅是 MyServiceClass

    【讨论】:

    • 谢谢。在我的情况下,使用“MyService”就足够了,但是由于 Java 编程的疯狂,我想这可能是我实现服务时更安全(或最安全)的选择。
    • 实际上你需要放入“.MyService”而不是完整的,除非它在包外。
    • 我不完全明白为什么,但这绝对是真的!这个答案刚刚解决了我的问题。
    【解决方案6】:

    原始问题的另一个原因可能是该服务尚未运行,并且您将 0 作为标志传递给 bindService。像这样:

    bindService(intent, serviceConnection, 0);
    

    当您正在寻找的是:

    bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
    

    【讨论】:

      【解决方案7】:

      可能还有另一种解释,不是很常见的情况,但我设法进入它并浪费了 2 个小时来解决它。

      所以我所做的是我想重用来自 onBind 方法接收到的意图的包。但我选择了懒惰的版本并改变了意图的类。显然这会导致 onServiceConnected 不被调用。可能是因为系统保留了对意图的引用,并在调用 onServiceConnected 时使用它。

      总之,不要更改您在 onBind 中收到的意图。

      【讨论】:

        【解决方案8】:

        我正在使用空 Intent - getContext().bindService(new Intent(), mConnection, Context.BIND_AUTO_CREATE) 调用 bind。我必须使意图更具体以指示我要绑定到哪个服务。这明显是代码错误,可惜Logcat输出不够清晰。

        【讨论】:

          【解决方案9】:

          您必须等待完成 onCreate() 方法。 示例:在 Button 中设置购买服务:

          Button button_useservice=findViewById(R.id.button_useservice);
                      button_useservice.setOnClickListener(new View.OnClickListener() {
                          @Override
                          public void onClick(View v) {
                              UsinService();
                          }
                      });
          

          【讨论】:

            【解决方案10】:

            如果有人在尝试了所有其他方法后仍在寻找答案,那么这可能会有所帮助.. onServiceConnected() 不会在bindService(...) 之后立即 调用。这需要几秒钟。因此,如果您从onServiceConnected() 接收到一些值,并且您必须在onCreateonStart 的其他地方使用它,它会因为延迟而抛出NullPointerException。因此,如果您可以将需要值的代码行从onCreateonStart 移到onServiceConnected(){......} 内,在您需要的值声明行下方,那么它可能会起作用。

            【讨论】:

              【解决方案11】:

              我只是在这个问题上花了很多时间,因为就我而言,上述答案都不是,所以我将列出另一种可能的情况:

              当我使用kotlin.coroutines.Deferred 对象来表示我的绑定服务时,这发生在我身上,当我在此对象上调用await() 时,我阻塞了应该调用onServiceConnected 的线程。

              所以基本上 - 不要阻塞等待调用onServiceConnected 的主线程,否则将无法调用...

              【讨论】:

                【解决方案12】:

                我也遇到了同样的问题。几分钟后,我发现我的代码完全没有问题。这是有问题的清单文件。 之前我只是用它的名字来声明服务。

                <service android:name=".MyBoundService"/>
                

                改成带包名的全名

                <service android:name="com.pb.servicedemo.MyBoundService"/>
                

                这样您将能够看到您的服务绑定到活动。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多