1、发送广播的区别:
sendBroadcase;
sendOrderedBroadcast;
sendStickyBroadcast;离线消息
2、服务:(1)、服务类继承Service类
(2)、注册服务类
服务种类:本地服务:在一个工程里面的服务,应用和代码在一个工程。在一个apk。与我们的 主线程(UI线程)在同一个进程里面。(代码,内存,进程)
远程服务:服务分布两个工程。在两个apk。UI线程在一个进程里面。服务在另外一个进程里面。这两个进程不能直接通信!(代码,内存,进程0
服务的Form(形式):可以混用
started:启动,停止我们的服务。
bound:得到服务对象。用bound是因为服务于客户端在两个进程里面。
服务角色:
服务端:onBind(){
return binder;
}(aidl接口)
客户端:连接的回调函数{
aidl接口(xxx1.Stub.asInterface(binder));
}aidl远程对象的接口。
远程的binder(服务端Stub)服务端真正实现的业务逻辑(Stub)。
两个进程之间传递数据:
(1)、基本数据类型(自动打包(parcel))
(2)、自定义类型(不会自动打包)
自定义类型需要实现接口parcelable
实现打包方法
实现解包方法
context相关的实现的代码(google实现)\base\core\java\android\app\ContextImpl.java
3、进程间通信(IPC):binder
AIDL:
(1)、客户端与服务器AIDL包名要一致(一模一样)。
public static abstract class Stub extends android.os.Binder implements com.test.demo.IMyService{
private static final java.lang.String DESCRIPTOR = "com.test.demo.IMyService";
public Stub(){
this.attachInterface(this, DESCRIPTOR);
}
new Stub(); //将类Stub放到Binder里面去:
public Stub(){
Binder.attchInterface(Stub, DESCRIPTOR);
}
}
Binder实现了IBinder接口:IBinder == Binder
因为Stub extends Binder 所以在服务器端 IBinder onBind(return Stub;)
Binder onBind(return Stub;)
android.os.IInterface iin = (android.os.IInterface) obj.queryLocalInterface(DESCRIPTOR);
查询本地有没有Stub对象存在
远程服务(服务不在当前工程里)
调用return new com.test.demo.IMyService.Stub.Proxy(obj);
onServiceConnected(Binder) IMyService.Stub.asInterface(Binder);
new Proxy (Binder);
mRemote = Binder
proxy就有Binder,binder远程服务器传过来的
下面的语句:private IMyService iMyService;
iMyService = IMyService.Stub.asInterface(service);返回的是一个Proxy类
Proxy类实现IMyService(Proxy implements com.test.demo.IMyService)
加分运算: int retNum = iMyService.add(100,200);
iMyService > Proxy类所以调用的是Proxy类的add方法。
Proxy类的add方法:干了什么?
Parcel :打包,打小包。
mRemote.transact(Stub.TRANSACTION_add, _data, _reply, 0);
Stub.TRANSACTION_add:调用远程的方法。
_data:传送到服务的数据。
_reply:服务执行完加法运算后返回的结果。
然后取结果:_result = _reply.readInt();
下面的操作就会得到远程服务的计算结果了。
int retNum = iMyService.add(100, 200);
远程服务: public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags)