文档章节

Service小结

Alex_凉风
 Alex_凉风
发布于 2016/11/13 00:45
字数 639
阅读 18
收藏 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.通过代理对象调用远程服务方法

上一篇: 属性动画小结
下一篇: Fragment 碎片
Alex_凉风
粉丝 1
博文 22
码字总数 8266
作品 0
武汉
私信 提问
加载中
请先登录后再评论。

暂无文章

TensorFlow 机器学习秘籍中文第二版·翻译完成

原文:TensorFlow Machine Learning Cookbook 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标。——《原则》,生活原则 2.3.c 在线阅读 ApacheCN 面试求职交流群 724187166 ...

布客飞龙
31分钟前
9
0
gin 怎么写个简单的中间件

gin 写个简单中间件,直接上例子: func GinServer() {engine := gin.Default()engine.Use(TestMiddleware)engine.GET("/", func(context *gin.Context) {context.JSON(http.......

is晓歌
34分钟前
18
0
查找算法——插值查找

对于有序的查找表,除了顺序查找、折半查找、斐波那契查找,还可以使用插值查找,对于元素分布较为均匀的查找表,插值查找的性能更优。不妨设想一下存在这样子的序列[10, 12, 14, 16, 18],以...

城北徐公美
38分钟前
20
0
asm 数组的双向传递

asm目前测试中比js大概能快 1.2 - 1.5倍左右 c/c++ 能快1.7 - 2.3 倍左右 asm的最大优势还是书写可以使用类似ts的语法, 比go和c系更加方便, 学习和改造已有工具的成本不大 但是性能还是问题,...

阿豪boy
43分钟前
26
0
为什么国内流行的 MyBatis ,国外 Java 工程师却不愿意使用?

Spring 团队的Josh Long自己在Twitter上做了一个调查。1625次投票,样本量不算大,但也能说明问题。和我答案最后的那些调查图表基本一致。 我们看一下Google Trends的数据: 搜索条件是这样的...

码农突围
51分钟前
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部