美文网首页
Android源码-Service(一)

Android源码-Service(一)

作者: 没有了遇见 | 来源:发表于2023-12-08 17:20 被阅读0次

1:什么是service

Service(服务)是Android系统提供的四大组件之一,主要作用是后台执行操作.Activity是Android提供的UI操作的组件,而Service是Android提供的没有UI页面后台执行的操作.

2:Service生命周期

2.1 startService() 生命周期

开启Service 分为两种 startService() 和bindService() startService() Service会在后台长期运行 和也页面Activity无关 bindService()关联了Activity的生命周期 页面销毁也销毁

bindService 可以传入一个ServiceConnection实例 CS 模式一对多个实例 c是Client s Service.
AIDL 的实现就是bindService 这种方式实现的

1:onCreate() 第一次创建执行创建方法 已经存在就不再走此方法
2:onStart() 过期方法
3:onStartCommand() 执行完onCreate() 方法之后执行此方法,当Service已经存在 直接执行此方法
4:onDestory()销毁的时候执行此方法,调用stopSelf()或者context.stopService()之后执行

####注意:
当onStartCommand()方法未执行完毕的时候调用stopSelf()或者context.stopService() 不会立即调用onDestory()方法.需要onStartCommand()方法执行完毕之后再执行onDestory方法().

2.2 bindService()

启动 context.bindService()
1:onCreate() 
2:onBind()
释放 context.unBindService()
3:onUnBind()
4:onDestory()

3.Service和IntentService

Service 是Android的一个组件实现了后台运行的机制,在主线程中.后台运行就是为了处理数据,但是耗时处理又需要在子线程中处理,基于这种情况Android系统又提供了一个Service的子类.

IntentService :是Service的子类,内部维护了一个HanlerThread线程和一个Looper和一个Handler.用于处理子线程的操作().
实质就是:Service +Thread+Handler+looper的子线程耗时操作

问题:

1:Service中能Toast吗?

回答: Service 是主线程的可以Toast

2: 为什么IntentService 回调方法中不能Toast??

IntentService 是维护了一个ThreadHandler 在子线程操作 在他的回调方法中是不可以直接Toast的 可以创建一个Handler 切换到主线程再Toast.

回答:因为IntentService的操作 是运行在HandlerThread中的 是子线程 且 Looper没有调用Looper.prepare() 所以 不能Toast.

注意:
子线程调用Toast 需要在Toast前初始化Looper.prepare()

3.stopSelf()和context.stopService()

两者都是关闭服务的,stopSelf()是Service的方法,stopService()是Context的方法 调用这两个方法后会执行onDestory方法.

注意:

当onStartConmmand()方法未执行完毕时,调用stopService和stopSel()时 不会立即执行onDestory 会等待onstartCommand方法执行完在执行.

问题

1:startServce() 生命周期
2:stopService() 生命周期
3:stop() 和stopSelf() 区别
4:startService()和bindService()
5:IntentService()
6:Toast 在Service 中显示

相关文章

网友评论

      本文标题:Android源码-Service(一)

      本文链接:https://www.haomeiwen.com/subject/mvnegdtx.html