Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
service和activity_设计模式中属于行为模式的是,希望能够帮助你!!!。
service 与 activity 之前的通信方式有很多,回调接口方式、观察者模式、广播、还有 handler 等,方法有很多,但要高强度地通信,个人觉得还是用回调接口的方式比较妥当,用handler的话,如果涉及到service要向多个activity传送数据就变得麻烦了)。
所以在这里记录下回调接口的方式进行通信:
1、怎样在启动一个Service时向它传递数据
2、怎样向运行的Service中同步数据
3、怎样侦听Service中数据变化
一般来说: 同一个包内的 activity 和 service,如果 service 没有设定属性 android:process=":remote" 的话,service 会和 activity 跑在同一个进程中,由于一个进程只有一个 UI 线程,所以,service 和 acitivity 就是在同一个线程里面的
android:process=":remote" 值得注意他的用法!!!如果Activity 想访问 service 中的对象或方法,service 设定属性 android:process=":remote",那么就是跨进程访问,跨进程访问容易出现意想不到的问题,还是慎重给 service 设定属性 android:process=":remote"
当 Acitivity 和 Service 处于同一个 Application 和进程时,通过继承 Binder 类来实现
步骤如下:
跨进程通讯,使用 AIDL
步骤如下:
当 acitivity 和 service 处于同一个 application 和进程时,通过继承 binder 类来实现
当一个 activity 绑定到一个 service 上时,它负责维护 service 实例的引用,允许你对正在运行的 service 进行一些方法调用;比如你后台有一个播放背景音乐的 service,这时就可以用这种方式来进行通信
代码如下:
public class localservice extends service { private final ibinder binder = new localbinder(); public class localbinder extends binder { localservice getservice() { return localservice.this; } } public ibinder onbind(intent intent) { return binder; } }
public class bindingactivity extends activity { localservice localservice; private serviceconnection mconnection = new serviceconnection() { public void onserviceconnected(componentname classname,ibinder localbinder) { localservice = (localbinder) localbinder.getservice(); } public void onservicedisconnected(componentname arg0) { localservice = null; } }; protected void onstart() { super.onstart(); intent intent = new intent(this, localservice.class); bindservice(intent, mconnection, context.bind_auto_create); } protected void onstop() { super.onstop(); unbindservice(mconnection); } public void printrandomnumber{ int num = localservice.getrandomnumber(); system.out.println(num); } }
代码解释:
使用使用 context.bindservice() 启动 service 会经历:
context.bindservice()->oncreate()->onbind()->service running onunbind() -> ondestroy() ->service stop
该如何检验 activity 和 service 是否是在同一个进程中运行
一般情况下, activity 和 service 在同一个包名内,并且没有设定属性 android:process=":remote",两者在同一个进程中
因为一个进程只有一个 ui 线程,所以两者就在同一个线程里
如果设置 android:process=":remote",就属于跨进程访问,就属于不同的进程了
验证方法:
在 activiyt 和 service 的 oncreate 中打印进程的信息
如:
log.i("tag",thread.curentthread().getid());
前段时间也是收集整理了关于 Android Framework 底层开发技术知识点!并将之整合成了 PDF 文档;这份文档既能够夯实底层原理核心技术点,又能够掌握普通开发者,难以触及的架构设计方法论;有需要这份 《Android Framework 底层开发技术知识点文档》的朋友 ;可在评论区下方留言,或者私信发送 "进阶" 即可 直达获取
文档内容展示如下:
文中所有资料都是免费分享给大家的;有需要这份 《Android Framework 底层开发技术知识点文档》的朋友 ;可在评论区下方留言,或者私信发送 "进阶" 即可 直达获取
资料很珍贵,希望帮到需要的人;感谢就不必要了,多多点赞关注,是我最大的动力!
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章