onServiceConnected从未在bindService方法之后调用

时间:2010-03-21 10:26:32

标签: android binding service speech-recognition

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

提前致谢

12 个答案:

答案 0 :(得分:45)

我刚刚遇到了这个问题的另一个版本,同样没有调用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库,则会出现额外的复杂性 - 如果引用的服务与清单位于同一个包中,则添加此Service标记似乎只能解决问题。即如果您的应用程序位于包a.b.c中并且这是AndroidManifest.xml所在的位置,则“YourService”也必须位于包a.b.c中。 (如果需要,可以从其他库中手动复制),否则<service..>标记可能会被忽略,onServiceConnected(...)仍然不会被调用。

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

HTH

答案 1 :(得分:41)

在尝试解决这个问题后数小时和数小时,问题在于显示服务创建的示例,不包含onBind方法,或者它们具有以下示例代码或者它为您生成:< / p>

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

答案 2 :(得分:26)

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

问题是我在Application Manifest中定义了服务名称:

<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

答案 3 :(得分:13)

我无法从你的描述中解决确切的问题,所以我猜这里会猜!

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

bindService()无法抛出NullPointerException ,因为未调用 onServiceConnected()。致onServiceConnected()的电话是bindService()的产物。

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

答案 4 :(得分:8)

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

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

答案 5 :(得分:5)

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

bindService(intent, serviceConnection, 0);

当你要找的是:

bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

答案 6 :(得分:1)

可以有另一种解释,而不是非常频繁的情况,但我设法进入它并且失去了2个小时来解决它。

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

总之,不要改变你在onBind上收到的意图。

答案 7 :(得分:1)

我也遇到了同样的问题。几分钟后,我发现我的代码绝对没有问题。出现问题的是清单文件。 早些时候,我只声明了服务的名称。

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

将其更改为带有程序包名称的全名

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

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

答案 8 :(得分:0)

我用一个空的Intent调用bind - getContext().bindService(new Intent(), mConnection, Context.BIND_AUTO_CREATE)。我必须使意图更具体,以指示我想要绑定到哪个服务。这显然是代码错误,但遗憾的是Logcat输出不够清楚。

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

我只是花了很多时间,因为就我而言,这不是以上两个答案,所以我将提出另一种可能的方案:

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

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