service与activity之前的通信方式有很多,回调接口方式、观察者模式、广播、还有handler等,方法有很多,但要高强度地通信,个人觉得还是用回调接口的方式比较妥当,用handler的话,如果涉及到service要向多个activity传送数据就变得麻烦了)。 所以在这里记录下回调接口的方式进行通信: 1、怎样在启动一个Service时向它传递数据关键点:Intent传值,onStartCommand()接收。 2、怎样向运行的Service中同步数据关键点:通过onBind()获取Service实例,然后再调用Binder中的相关方法。 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:remoteService的两大功能是什么?怎样实现?Service主要有两个作用:后台运行跨进程通讯情况1: 当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现 步骤如下:Service和Activity的连接;可以用ServiceConnection来实现,需要实现一个新的ServiceConnection,重写onServiceConnected和onServiceDisconnected方法执行绑定,调用bindService方法,传入一个选择了要绑定的Service的Intent(显式或隐式)和一个你实现了的ServiceConnection实例一旦连接建立,你就能通Service的接口onBind()得到serviceBinder实例进而得到Service的实例引用一旦Service对象找到,就能得到它的公共方法和属性;但这种方式,一定要在同一个进程和同一个Application里情况2: 跨进程通讯,使用AIDL 步骤如下:在Eclipse工程的package目录中;建立一个扩展名为aidl的文件;package目录就是Java类所在的目录;该文件的语法类似于Java代码。aidl文件中定义的是AIDL服务的接口;这个接口需要在调用AIDL服务的程序中访问如果aidl文件的内容是正确的,Eclipse插件会自动生成一个Java接口文件(。java)建立一个服务类(Service的子类)实现由aidl文件生成的Java接口在AndroidManifest。xml文件中配置AIDL服务,尤其要注意的是,标签的android:name属性值就是客户端要引用该服务的ID,也就是Intent类构造方法的参数值 当acitivity和service处于同一个application和进程时,通过继承binder类来实现 当一个activity绑定到一个service上时,它负责维护service实例的引用,允许你对正在运行的service进行一些方法调用;比如你后台有一个播放背景音乐的service,这时就可以用这种方式来进行通信 代码如下:service代码publicclasslocalserviceextendsservice{privatefinalibinderbindernewlocalbinder();publicclasslocalbinderextendsbinder{localservicegetservice(){returnlocalservice。this;}}publicibinderonbind(intentintent){returnbinder;}}activity代码publicclassbindingactivityextendsactivity{localservicelocalservice;privateserviceconnectionmconnectionnewserviceconnection(){publicvoidonserviceconnected(componentnameclassname,ibinderlocalbinder){localservice(localbinder)localbinder。getservice();}publicvoidonservicedisconnected(componentnamearg0){localservicenull;}};protectedvoidonstart(){super。onstart();intentintentnewintent(this,localservice。class);bindservice(intent,mconnection,context。bindautocreate);}protectedvoidonstop(){super。onstop();unbindservice(mconnection);}publicvoidprintrandomnumber{intnumlocalservice。getrandomnumber();system。out。println(num);}} 代码解释: 使用使用context。bindservice()启动service会经历:context。bindservice()oncreate()onbind()servicerunningonunbind()ondestroy()servicestop 该如何检验activity和service是否是在同一个进程中运行 一般情况下,activity和service在同一个包名内,并且没有设定属性android:process:remote,两者在同一个进程中 因为一个进程只有一个ui线程,所以两者就在同一个线程里 如果设置android:process:remote,就属于跨进程访问,就属于不同的进程了 验证方法: 在activiyt和service的oncreate中打印进程的信息 如:log。i(tag,thread。curentthread()。getid()); 前段时间也是收集整理了关于AndroidFramework底层开发技术知识点!并将之整合成了PDF文档;这份文档既能够夯实底层原理核心技术点,又能够掌握普通开发者,难以触及的架构设计方法论;有需要这份《AndroidFramework底层开发技术知识点文档》的朋友;可在评论区下方留言,或者私信发送进阶即可直达获取 文档内容展示如下:1、HandlerHandler机制中,存在哪些角色?各自承担了什么功能?Handler分发事件优先级,是否可拦截?拦截的优先级如何?主线程Looper何时运行?Handler的Message可以分为那3类?分别有什么标识?Handler为什么需要使用底层的epoll来休眠? 2、BinderBinder机制是如何跨进程的?Binder的定向制导,如何找到目标Binder,唤起进程或者线程?Binder一次拷贝原理?AndroidAPP进程天生支持Binder通信的原理是什么?使用Binder传输数据的最大限制是多少,被占满后会导致什么问题? 3、AMSAMS是什么?什么时候初始化的?有什么作用?AMS和zygote进程通信是如何实现的?ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系Instrumentation是什么?和ActivityThread是什么关系?ActivityThread是什么?ApplicationThread是什么?它们的区别? 4、PMSAndroidManifest。xml在解析的作用?InstallStart如何显示安装界面?sartnstal流程分析?pms提前缓存内存存档?四大组件如何预加载的? 5、WMSView的绘制流程?onMeasure职责是做什么?Activity如何与window与view进行分工合作的?onResume函数中度量高有效吗?线程中view。setText一定会报错吗,为什么?View的绘制过程都是用的同一个canvas吗? 文中所有资料都是免费分享给大家的;有需要这份《AndroidFramework底层开发技术知识点文档》的朋友;可在评论区下方留言,或者私信发送进阶即可直达获取 资料很珍贵,希望帮到需要的人;感谢就不必要了,多多点赞关注,是我最大的动力!