Service小结
Service小结
孤峰无悔 发表于1年前
Service小结
  • 发表于 1年前
  • 阅读 0
  • 收藏 0
  • 点赞 0
  • 评论 0

 

生命周期

onCreate() -> onstartcommand() -> onstart() -> onDestroy()

•用start方法开启服务,服务只会被创建一次,执行一次onCreate方法,一旦服务创建完成,
 后续调用start去开启服务只会执行onstart和onstartcommand方法

•当调用了stop方法,服务只会调用一次onDestroy方法

绑定服务步骤

1.创建服务类

class MyService extends Service{}

2.定义一个接口,暴露对外提供的方法

public interface IService{
    //隐藏服务的业务逻辑,只对外提供部分逻辑
    public void callServiceMethed();
}

3.在服务类里定义代理对象,定义一个方法可以间接的调用服务的方法

//通过内部类调用服务内部的方法
private class MyBinder extends Binder implements IService{

   public void callServiceMethed(){
      调用服务的方法
   }
   ...
}
这样写的好处:可以防止不想被暴露的方法被别人调用了

4.在onBinder方法里返回代理对象,如果不返回,调用方拿到的对象就是空的

public IBinder onBind(Intent intent) {
    //
     return new MyBinder();
}

5.创建类实现 ServiceConnection,实现里面的两个方法

//内部类
private class MyConn implements ServiceConnection{
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        //当服务连接成功时候调用
        //将绑定的服务转为接口对象
        IService iService = (IService) service;
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        //当服务断开连接时调用
    }
 }

6.activity采用绑定的方式开启服务

bindService(intent, new MyConn(),  BIND_AUTO_CREATE);

7.在onServiceConnected方法里强转获取所需要的对象

IService iService = (IService) service;

8.调用代理对象的方法,间接的调用了服务里的方法

开启绑定服务的生命周期

•bindService开启,如果服务不存在,调用 onCreate() -->onBind() ,不会调用 onStart()和onStartCommand()

•unbindService解除绑定,onUnbind() --> onDestroy()

•多次绑定服务,onCreate方法和onBind方法只会执行一次

绑定远程服务调用服务的流程

1.远程服务定义的接口文件不能是.java文件,需要改成.aidl文件,里面的修饰符都不需要

2.原来的代理对象继承对象需要改变

//绑定服务(内部代理类)
private class MyBinder extends Binder implements IService 
--> 
//绑定远程服务(内部代理类)
private class MyBinder extends IService.Stub

3.把远程服务的.aidl文件拷贝到本地工程,包名需要和远程服务的包名一致

4.获取代理对象的方法需要改变

//将绑定的服务转为接口对象
IService iService = (IService) service; 
--> 
//将绑定的服务转为接口对象
IService iService = IService.Stub.asInterface(service);

5.通过代理对象调用远程服务方法

共有 人打赏支持
粉丝 2
博文 22
码字总数 8266
×
孤峰无悔
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: