第5章android服务service内容摘要:

c MyBinder() { (TAG, MyBinder Constructure invoked!)。 } public int getCount() { return count。 } } public IBinder onBind(Intent arg0) { (TAG, MyService onBind invoked!)。 return myBinder。 } public void onCreate() { (TAG, MyService onCreate invoked!)。 ()。 → 线程中循环是否停止的标志 → 创建自定义的 MyBinder对象 →MyBinder 的构造方法,观察什么时候创建 →MyBinder 中提供的获取数据的方法 → 重写 onBind()方法, 返回创建的对象 (绑定 Service案例) new Thread(){ public void run(){ while(!quit){ try{ (500)。 count++。 ()。 }catch (Exception e) { ()。 } } } }.start()。 } public void onDestroy() { (TAG, MyService onDestroy invoked!)。 ()。 quit=true。 } → 判断是否继续执行循环 → 休眠 → 数据递增 → 改变循环是否退出的标志,否则子线程一直在循环 (绑定 Service案例) 接着在 MainActivity中添加一个获取数据的按钮 , 获取数据的前提是要绑定 Se r v ic e, 所以先绑定 Se r v ic e, 在 Se r v ic e C onne c t io n()对象的onServiceConnected()方法中 , 获取绑定 Service时 , 返回的 IBinder对象 , 然后将该对象强制类型转换成 MyBinder对象 , 最后利用 MyBinder对象获取服务中的数据信息。 首先改写创建 ServiceConnection对象的方法 , 关键代码如下。 private ServiceConnection conn=new ServiceConnection() { public void onServiceDisconnected(ComponentName name) { (TAG,MainActivity onServiceDisconnected invoked!)。 } public void onServiceConnected(ComponentName name, IBinder service) { (TAG,MainActivity onServiceConnected invoked!)。 myBinder=(MyBinder)service。 } }。 程序清单: /FirstService/src/iet/jxufe//android/ → 将传递的参数强制类型装换成 MyBinder对象 (绑定 Service案例) 然后,为获取数据按钮添加事件处理方法,关键代码如下。 (new OnClickListener() { public void onClick(View v) { (, Count=+(), ).show()。 } })。 程序清单: /FirstService/src/iet/jxufe//android/ → 以消息的形式,显示获取的数据 此时 , 单击绑定服务后 , LogCat控制台打印信息如下图 , 首先创建 MyBinder对象 ,因为该对象是作为 MyService的成员变量进行创建的 , 完成 MyService的初始化工作 ,然后再调用 onCreate()方法 , 再调用 onBind()方法 , 该方法返回一个 IBinder对象 , 因为 IBinder对象不为空 , 表示有服务连接 , 所以会调用 ServiceConnection借口的onServiceConnected()方法 , 并将调用 IBinder对象它的第二个参数。 案例总结 通过 Context的 startService() 方法启动和停止 Service 通过 Context的 bindService() 方法绑定和解除绑定 两种方式混合使用 s t a r t S e r v i c es t o p S e r v i c e按 钮s t a r t S e r v i c e . s e t O nC l i c k L i s t e n e r ( ) 方法 调 用 s t a r t S e r v i c e( ) 方 法。 按 钮b i n d S e r v i c e . s e t O n C l i ck L i s t e n e r ( ) 方 法 调 用b i n d S e r v i c e ( ) 方 法。 按 钮u n b i n d S e r v i c e . s e t O n C l i ck L i s t e n e r ( ) 方 法 调 用u n b i n d S e r v i c e ( ) 方 法。 按 钮s t o p S e r v i c e . s e t O n C l i c kL i s t e n e r ( ) 方 法 调 用s t o p S e r v i c e ( ) 方 法。 按 钮g e t D a t a . s e t O n C l i c kL i s t e n e r ( ) 方 法 调 用g e t C o u n t ( ) 方 法。 u n b i n d S e r v i c eb i n d S e r v i c eg e t D a t a 案例总结 两种方式混合使用时,方法的执行顺序是怎么样的。 问题与讨论 先启动后绑定 先绑定后启动 案例总结 1) 先 启动 Service,然后 绑定 Service。 测试步骤: 【 启动 Service】 →【 绑定 Service】 → 【 启动 Service】 → 【 停止 Service】 → 【 绑定Service】 → 【 解绑 Service】。 总结: 调用顺序如下: onCreate()→[ onStartCommand()1到 N次 ] → onBind()→ onServiceConnected()→ onUnbind() [→ onServiceConnected()→ onRebind()0到 N次 ]→ onDestroy()。 控制台信息如下图所示。 案例总结 2)先 绑定 Service,后 启动 Service。 测试步骤:【 绑定 Service】 → 【启动 Service】 → 【 绑定 Service】 → 【 解绑 Service】 → 【 启动 Service】 → 【 停止 Service】。 总结: 调用顺序如下: onCreate()→ onBind()→ onServiceConnected() → [onStartCommand() 1到 N次 ]→ onUnBind[→ onServiceConnected() → onRebind()0到 N次 → onUnBind]→onDestroy()。 控制台信息如下图所示。 案例总结 注意: ( 1)未启动 Service而直接停止 Service不起作用 , 但未绑定Service而先解绑 Service则程序出错 ,强制退出; ( 2)若该 Service处于绑定状态下,该 Service不会被停止即单击停止按钮不起作用,当单击解绑 Service按钮时,它会先解除绑定随后直接销毁;。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。