标签:
在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());
标签:
原文地址:http://www.cnblogs.com/dracohan/p/5837807.html