调用者不可以访问 service里面的方法. 调用者如果被系统回收了或者调用了ondestroy方法, service还会继续存在
2.通过bindService开启的服务,服务开启之后,调用者和服务之间 还存在着联系 ,
一旦调用者挂掉了.service也会跟着挂掉 .
aidl文件自动帮我们生成Proxy、Stub(抽象类)两个类
interface IMyService { /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ String getValue(); }
2.创建一个远程Service,在Service中创建一个类继承AIDL接口中的Stub类并实现Stub中的抽象方法,最后不要忘记在onBind中返回这个类的对象。
public class MyService extends Service { public class MyServiceImpl extends IMyService.Stub { @Override public String getValue() throws RemoteException { // TODO Auto-generated method stub return "《Android深度探索(卷1):HAL与驱动开发》"; } } @Override public IBinder onBind(Intent intent) { return new MyServiceImpl(); } }
public interface IMyService extends android.os.IInterface { /** Local-side IPC implementation stub class. */ public static abstract class Stub extends android.os.Binder implements server.aidl.peng.cx.com.aidlserver.IMyService
在OnBinder方法里面系统会自动将这个对象封装成IBinder对象,传递给他的调用者。
实例:桌面小组件控制音乐播放器: Service里面还有一个类,继承gen生成的文件,实现里面全部的方法
4.清单文件里面配置一下IMYService
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MyService" > <intent-filter> <action android:name="mobile.android.aidl.IMyService" /> </intent-filter> </service> </application>
调用者;client
2.服务是否连接上了
private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { myService = IMyService.Stub.asInterface(service); btnInvokeAIDLService.setEnabled(true); } @Override public void onServiceDisconnected(ComponentName name) { Toast.makeText(MainActivity.this, "������", Toast.LENGTH_SHORT).show(); btnInvokeAIDLService.setEnabled(true); } };
myService = IMyService.Stub.asInterface(service);怎么获取到Service的实例,不是实例,是实现类=====数据就好办了
1) Proxy
Proxy运行在客户端,它实现了IDownloadService接口,并且持有一个远程代理IBinder mRemote,mRemote不做任何业务逻辑处理,仅仅通过IBinder接口的transact()方法,把客户端的调用参数序列化后transact到远程服务器。
2) Stub
Stub运行在服务器端,继承自Binder,同样也实现了IDownloadService接口,它的核心逻辑在onTransact方法中:
Stub中另外一个比较重要的接口就是asInterface()接口
通过方法名字,我们大致可以猜出,它大概实现的功能,就是将一个IBinder对象转化为接口对象
Connection没有连接,应该是OnBind不能返回为null;
服务相关:
1.service
源码地址:不知道为什么上传不了
1). 通过Binder对象,也就是AIDL的形式
2). 通过broadcast(广播)的形式