跨应用启动Service并传递数据

Posted 醉清风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跨应用启动Service并传递数据相关的知识,希望对你有一定的参考价值。

启动:

android5.0之前可以通过隐式intent启动服务,但是Android5.0之后不可以了。

在两个Application之间是不可能获取到Service的定义的,需要调用SetComponent函数:

        serviceIntent = new Intent();
        serviceIntent.setComponent(new ComponentName("com.wanxiang.www.startservicefromanotherapp", "com.wanxiang.www.startservicefromanotherapp.AppService"));
        serviceIntent.putExtra("data", "Hello AppService");

通过这种方法可以指定要启动的Service的Application,并且也同样可以传递数据过去。但是有个前提,被启动的这个Service所在的Activity必须在运行过程中的。

同样也可以通过绑定服务来启动远程Service

                bindService(new Intent(this, MyService.class), this, BIND_AUTO_CREATE);

本地Activity中的onServiceConnected也会被执行:

    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        System.out.println("Bind service");
        System.out.println(iBinder);
}

传递数据:

首先在远程Activity中建一个本地Activity包名的目录,把本地Activity中的AIDL文件拷贝一份过去,可以在onBind()中返回这个接口的stub,并在这个接口中添加函数

@Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return new IAppServiceRemoteBinderInterface.Stub() {
            /**
             * Demonstrates some basic types that you can use as parameters
             * and return values in AIDL.
             *
             * @param anInt
             * @param aLong
             * @param aBoolean
             * @param aFloat
             * @param aDouble
             * @param aString
             */
            @Override
            public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

            }

            @Override
            public void setData(String data) throws RemoteException {
                AppService.this.data = data;
            }
        };
    }

在远程Activity中的onServiceConnected函数中返回这个对象,并保存在类的实例变量中:

    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        System.out.println("Bind service");
        System.out.println(iBinder);
        binder = IAppServiceRemoteBinderInterface.Stub.asInterface(iBinder);
    }

    private IAppServiceRemoteBinderInterface binder = null;

然后就可以通过这个变量来调用AIDL中添加的函数,并传递数据给Service。

            case R.id.btnSync:
                if (binder != null)
                    try {
                        binder.setData(etInput.getText().toString());

 

以上是关于跨应用启动Service并传递数据的主要内容,如果未能解决你的问题,请参考以下文章

Service的启动,绑定,绑定后通信,跨应用绑定,跨应用绑定后通信

跨应用启动Service

Messenger Service可以用于跨应用IPC吗?

Android跨应用启动

通过导航组件在底部导航片段之间传递数据

Nginx——Nginx启动报错Job for nginx.service failed because the control process exited with error code(代码片段