同进程Activity调用Serivce中函数(学习笔记四)

 

Activity与Service间通信的代码不是没写过,但是并没有了解过为啥会这样写,先记录一下。

首先得先了解一下AMS,AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要。

1、IBinder存在的意义,myActivity和myService是谁来创建的?

      Activity和Service都是嫡系基类,它们都是都会AMS来创建的,所以我们必须

得取到指针才拿的到。

 

同进程Activity调用Serivce中函数(学习笔记四)同进程Activity调用Serivce中函数(学习笔记四)

2、如何跟AMS要对象的指针呢?

第一个方法:通过静态函数可以得到

第二个方法***:通过IBinder接口来取得myService对象的指针

同进程Activity调用Serivce中函数(学习笔记四)

 

复习一下,IBinder接口

同进程Activity调用Serivce中函数(学习笔记四)

activity可以通过接口来调用service中的方法

 

同进程Activity调用Serivce中函数(学习笔记四)同进程Activity调用Serivce中函数(学习笔记四)

3、解决方法

 

在主线程中完成这个目标

同进程Activity调用Serivce中函数(学习笔记四)

1、取得myService对象 

通过startService,bindService向AMS沟通

2

同进程Activity调用Serivce中函数(学习笔记四)同进程Activity调用Serivce中函数(学习笔记四)

同进程Activity调用Serivce中函数(学习笔记四)同进程Activity调用Serivce中函数(学习笔记四)

整体结构:

同进程Activity调用Serivce中函数(学习笔记四)

 

具体代码实现:

同进程Activity调用Serivce中函数(学习笔记四)

当activity执行bindService的时候,Service中的onBinder方法也会执行并且将IBinder传回到AMS中,

AMS会把它传过来并转成myBinder形式,通过子类的指针就把IS接口传回来了。

 

同进程Activity调用Serivce中函数(学习笔记四)

 

同进程Activity调用Serivce中函数(学习笔记四)

同进程Activity调用Serivce中函数(学习笔记四)

 

 

同进程Activity调用Serivce中函数(学习笔记四)

耗时操作避免放在子线程中,在子线程中完成目标

分析结构图如下:

同进程Activity调用Serivce中函数(学习笔记四)

 

同进程Activity调用Serivce中函数(学习笔记四)

 

同进程Activity调用Serivce中函数(学习笔记四)

同进程Activity调用Serivce中函数(学习笔记四)

同进程Activity调用Serivce中函数(学习笔记四)