如果Service在另一个进程中,如何绑定它?

2024-04-07

显现:

 <service android:name="com.example.MainService" android:process=":main_service"/>

尝试在 Activity 中绑定服务:

public class MainActivity extends Activity {
    MainService mMainService;

    private boolean mBound;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        bindService(intentForMainService, mConnection, Context.BIND_AUTO_CREATE)
    }

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className,
                                       IBinder service) {
            MainService.MainServiceBinder binder = (MainService.MainServiceBinder) service;//HERE IS EXCEPTION
            mMainService = (MainService) binder.getService();
            mBound = true;
        }

        public void onServiceDisconnected(ComponentName className) {
            mMainService = null;
            mBound = false;
        }
    };

    @Override
    protected void onStop() {
        doUnbindService();
        super.onStop();
    }

    void doUnbindService() {
        if (mBound) {
          unbindService(mConnection);
        }
    }
}

Error:

    FATAL EXCEPTION: main
 Process: com.hos.android, PID: 9001
   java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.example.service.main.MainService$MainServiceBinder
   at com.example.ui.base.BaseServiceActivity$1.onServiceConnected(MainActivity.java:34)
   at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1335)
   at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1352)
   at android.os.Handler.handleCallback(Handler.java:739)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:158)
   at android.app.ActivityThread.main(ActivityThread.java:7224)

但是当我删除这个android:process=":main_service"一切正常


步骤#1:写AIDL 文件 https://developer.android.com/guide/components/aidl.html它描述了客户端可以绑定到的服务要导出的接口。为了这个答案的目的,我将调用这个接口Foo,所以 AIDL 文件将是Foo.aidl。请注意,如果客户端和服务位于单独的 Android Studio 模块中,则两者都需要相同的Foo.aidl内容。

步骤#2:扩展您的服务的活页夹Foo.Stub并重写方法Foo.Stub,而不是扩展IBinder.

步骤#3:在您的客户端中onServiceConnected(),将原始活页夹转换为Foo实例通过Foo.Stub.asInterface(service), and Foo具有 AIDL 定义的 API 的客户端。

这对示例项目 https://github.com/commonsguy/cw-omnibus/tree/master/Binding/Remote说明了这一点,在我的例子中,客户端和服务位于不同的应用程序中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果Service在另一个进程中,如何绑定它? 的相关文章

随机推荐