Android笔记之Service

2017-03-01  本文已影响29人  卖梦想的男孩

相对于应用的界面,Service则是一个看不见的后台。
一个正常的Service需要满足:

Service的正常使用

启动Servie

public ComponentName startService(Intent service)

停止Service

public boolean stopService(Intent name)
//Service中可以调用stopSelf来停止

生命周期
onCreate
onStartCommand //多次启动会回调这个方法
onDestroy

Service的绑定使用

绑定Service

public boolean bindService(Intent service, ServiceConnection conn,int flags) 

BindServiceFlags:

解绑Service

public void unbindService(ServiceConnection conn)

生命周期
onCreate
onBind
onUnbind
onDestroy

public interface ServiceConnection {
    //当连接到Service时
    public void onServiceConnected(ComponentName name, IBinder service);
  //当连接的Service宿主出现崩溃或者被杀掉时
    public void onServiceDisconnected(ComponentName name);
}

注:

IntentService

IntentService本质上是对Service的扩展
优势:

protected void onHandleIntent(final Intent intent)

开发者只需要关心自己的异步实现就可以了。

AIDL

Android接口定义语言(Android Interface Definition Language)
用来实现跨进程的通讯

跨进程方式 对比
BrodcastReceiver 实现简单但跨进程比较耗时
Messenger 请求队列是同步进行的,无法并发执行
AIDL 书写稍微麻烦,但是借助工具可以简化,相对Messenger更灵活

如果是其他进程提供服务的Service,记得配置Manifest的时候导出

android:process=""//指定进程
android:exported="true"//向外暴露

数据类型

package xxxPackage;
parcelable xxxClass;

有个bug,可能是不同版本的问题,我这个版本生成的类会调用readFromParcel,而Parcelable已经去掉了该方法,所以对象类中自己手动写了个。

数据流向
adil中非基本参数都需要指明数据流向,不管是 in , out , 还是 inout 。基本参数的定向tag默认是并且只能是 in

总结:其实adil可以看做的bindService的强化版,只需要做以下几步。

  1. 需要用到自定义的实体,就申明一个实体的aidl,然后写好相应的实体。
  2. 定义adil接口的方法,如果引用到自定义的类型,就导入相应的类并指定数据流向。
  3. 在服务端书写Binder继承接口的Stub
  4. bindService后,在ServiceConnection中获取Binder的实例即可。
上一篇下一篇

猜你喜欢

热点阅读