码迷,mamicode.com
首页 > 其他好文 > 详细

跨应用启动Service并传递数据

时间:2016-09-03 19:55:20      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

启动:

在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并传递数据

标签:

原文地址:http://www.cnblogs.com/dracohan/p/5837807.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!