我有一个特殊的情况:
由广播接收器启动的服务启动活动。我希望此活动能够与服务进行通信。我选择使用AIDL来实现它。除了活动的bindService()
中调用的onCreate()
方法外,一切似乎都很好。事实上,bindService()会抛出空指针异常,因为在onServiceConnected()
方法服务的时候永远不会调用onBind()
。无论如何bindService()
返回true。
该服务显然是活跃的,因为它启动了活动。
我知道从服务中调用活动可能听起来很奇怪,但不幸的是,这是在服务中进行语音识别的唯一方法。
提前致谢
答案 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
?这可能(/应该)发生的唯一方法是当您不提供Service
或ServiceConnection
侦听器时。
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()
接收到一些值,并且必须在onCreate
或onStart
的其他地方使用它,则由于 delay ,它将抛出NullPointerException。 。因此,如果您可以将需要值的代码行从onCreate
内的onStart
或onServiceConnected(){......}
移到所需值声明行的下方,那么它可能会起作用。 / p>
答案 11 :(得分:0)
我只是花了很多时间,因为就我而言,这不是以上两个答案,所以我将提出另一种可能的方案:
当我使用kotlin.coroutines.Deferred
对象表示绑定服务时,这发生在我身上,当我在该对象上调用onServiceConnected
时,我阻塞了应该调用await()
的线程
所以基本上-不要阻塞等待onServiceConnected
被调用的主线程,否则它将无法被调用...