rpa*_*abi 1 android android-service android-mediaplayer android-support-library android-service-binding
令人惊讶的是,我很难抓住源自的服务实例MediaBrowserServiceCompat.
对于典型的服务,为了实现这一点,使用本地绑定器
class MyService extends MediaBrowserServiceCompat {
class MyBinder extends Binder {
public MyService getService() {
return MyService.this;
}
private final MyBinder binder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
return binder;
}
public void doMagic() { // <-- How to call this from activity?
// ...
}
}
// At the activity, for example, this binder is retrieved through
// `onServiceConnected()`, typecast to `MyBinder` and thus
// `getService()` gets us the service instance.
Run Code Online (Sandbox Code Playgroud)
但是,这不适用于派生的服务MediaBrowserServiceCompat.
当我尝试提供本地绑定器时,如上所示,服务崩溃,因为MediaBrowserServiceCompat期望它自己的自定义绑定器具有附加功能.这是崩溃堆栈跟踪
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at android.os.Binder.queryLocalInterface(Binder.java:254)
at android.service.media.IMediaBrowserService$Stub.asInterface(IMediaBrowserService.java:31)
at android.media.browse.MediaBrowser$MediaServiceConnection.onServiceConnected(MediaBrowser.java:793)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1223)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1240)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Run Code Online (Sandbox Code Playgroud)
我尝试从MediaBrowserServiceCompat超级类中包装活页夹,如下所示,但它仍然不起作用.
class MyService extends MediaBrowserServiceCompat {
class MyBinder extends Binder {
public MyService getService() {
return MyService.this;
}
private final WrappingBinder<MyService> binder;
@Override
public IBinder onBind(Intent intent) {
if (binder == null) {
binder = new WrappingBinder(super.onBind(intent));
}
return binder;
}
public void doMagic() { // <-- How to call this from activity or elsewhere?
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
那么想知道访问MediaBrowserServiceCompat服务实例的方法是什么?
要清楚,播放功能对我来说很好.问题是如何获得对服务的引用,以便我可以在该服务上调用我的自定义公共方法.
ian*_*ake 11
正如您所发现的,MediaBrowserServiceCompat已经是一个绑定服务 - 您不能也不应该覆盖onBind().
相反,你必须连接到MediaBrowserServiceCompat同一个MediaBrowserCompat按文档.连接后,您可以触发自定义方法,例如doMagic:
MediaControllerCompat从您的MediaBrowserCompat实例创建一个 sendCommand,传入一个command唯一标识您的命令的字符串(比方说doMagic),您希望传递给该方法的任何参数,以及一个ResultReceiver您想要返回值的参数.MediaSessionCompat.Callback您注册时MediaBrowserServiceCompat,覆盖onCommand()并处理命令(例如,通过调用doMagic).这篇博文中提供了这种方法的一个例子
| 归档时间: |
|
| 查看次数: |
1157 次 |
| 最近记录: |