没有合适的资源?快使用搜索试试~ 我知道了~
Android Service那些事1
需积分: 0 0 下载量 126 浏览量
2022-08-08
22:04:26
上传
评论
收藏 115KB DOCX 举报
温馨提示
试读
17页
Android Service那些事版本号描述日期(更新日期)/更新人1.0Android Service使用分析2018/08/10 刘志保1.1
资源详情
资源评论
资源推荐
Android Service 那些事
版本号
描述
日期(更新日期)/更新人
1.0
Android Service 使用分析
2018/08/10 刘志保
1.1
onServiceDisconnected()
何时调用,以及 C/S 两边线程
2018/08/23 刘志保
工程源码
https://github.com/MMLoveMeMM/AngryPandaService.git
目录
预备知识: ..............................................................................................................................3
<1> : IntentService : 这种是在 Service 的基础上改造了一下,改成 Handler+Service,准确
的说事 Looper+Thread+Service,拥有自己事物消息处理过程. ..........................................3
<2> : 现在谈谈 Messager+Service,其实这个很简单,借助 Messager+Handler+Service(常
驻),先看看 Messager.java 类................................................................................................5
<3> : AIDL+Service 产生一个远程 Service 服务,这个算是常规的远程服务开发方式,
这里开发没有太多技术.主要是考虑一个问题:如何让远程服务端知道客户调用端
crash 了,然后释放资源,又如何让客户端知道远程端服务由于异常 crash 了而做响应的
调整. ......................................................................................................................................8
<4> : 拓展一下 Service,利用 Binder 内重写 onTransact 方法,参考对应工程的
TransactService.java 代码 ...................................................................................................13
<5> : 再谈谈服务常驻,不死的问题.这个没什么太多经验,唯一最好的方式就是服务程
序代码质量优秀,不会出现 crash 的问题.当然投机取巧方法,如<1>挂钩子,<2>再搞一
个独立的 service 来监听工作服务 service,<3>看门狗,<4> 还有网上一个什么开源
的杀不死;其实这些都是浮云. .........................................................................................13
<6> : 为什么 Service crash 两次就不会再自动重启呢?............................................13
<7> : 远程服务权限---检查客户端权限,限制非法客户端连接 .......................................14
<8> : 这个地方 onServiceDisconnected()方法什么时候调用.第一印象是觉得客户端调
用.........................................................................................................................................16
预备知识:
参 考 ”Android Handler 事 件 分 析 处 理 .docx” 文 档 , 熟 悉 Handler, 以 及 HandlerThread( 集 成
Thread+Looper 的类).
本文的目的:
介绍分析 Service,远程 Service, IntentService 之间的区别和相同点.以及和 Service 通讯的一些
注意事项.
大概如下:
<1> : IntentService : 这种是在 Service 的基础上改造了一下,改成 Handler+Service,准确的说事
Looper+Thread+Service,拥有自己事物消息处理过程.
首先看看 IntentService 源码:
先看看有什么:
private volatile Looper mServiceLooper;
private volatile ServiceHandler mServiceHandler;
@Override
public void onCreate() {
// TODO: It would be nice to have an option to hold a partial
wakelock
// during processing, and to have a static startService(Context,
Intent)
// method that would launch the service & hand off a wakelock.
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName
+ "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
---------------------------------------------------------------------------------------------------------------------------------
根据源码主体由三个在支撑,ServiceHandler(即 Handler),Looper,以及 HandlerThread.整体的意
义是这样的:Service 内部创建一个线程,并且这个线程自己维护管理一个消息队列,而这个线
程 和 消 息 处 理 是 通 过 HandlerThread 来 实 现 的 , 然 后 返 回 给 mServiceLooper 和
mServiceHandler 在 Service 里面进行逻辑管理,状态逻辑靠这个完成了,那消息事件怎么来?
又怎么处理的过程?
Service 被每次 startService 启动后,会陆续调到
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
这个就是消息的产生由来,然后利用 mServiceHandler 将消息发送到消息队列等待处理.当消
息被处理回调时:
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
首先调用 onHandleIntent 这个将会执行继承 IntentService 子类中的方法(父
类调用子类的具体实现) 也就是 UsingIntentService.java 类中的
onHandleIntent(Intent)方法.
<a> : 这样就实现了一个什么过程呢?
Service 为了发过来的事务不阻塞,就在自己内部新建了一个 Thread 来处理事务,为了保证事
务是串行一个一个的处理的,又引入 Looper,进行消息队列管理,将事务包装成消息 push 到消
息队列,然后”慢慢”来处理.
<b> : 那么事务处理的生命周期是如何?
@Override
protected void onHandleIntent(@Nullable Intent intent) {
// 这里面已经是从消息队列中一个一个被拿出来处理的,
// 即使按键再快,也是间隔 3s,一个一个执行
Bundle bundle=intent.getBundleExtra("bundle");
String key=bundle.getString("key");
Log.
e
(
TAG
,"key : "+key);
try {
Thread.
sleep
(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
生命周期为大概 3s(我是说这段代码会让 IntentService 活过 3s),因为在这里每次处理的
onHandleIntent 执行一次大概就 3s.
然后实现:
@Override
public void onDestroy() {
super.onDestroy();
Log.
e
(
TAG
,"onDestroy");
}
这里直接给个结果吧! 只要每次发给服务处理的事务间隔不超过 3s 钟,都是使用同一个
IntentService 对象,如果超过 3s(即 onHandleIntent 执行完成),就会立即调用 onDestroy 将
IntentService 销毁.如果是在 3s 钟内调用,事务就会入消息队列,这个时候只要消息队列还有事
剩余16页未读,继续阅读
挽挽深铃
- 粉丝: 12
- 资源: 274
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0