首页 > 代码库 > 跨应用启动Service并传递数据

跨应用启动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 =http://www.mamicode.com/ 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并传递数据