ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:18.19KB ,
资源ID:8117486      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8117486.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(android Service Binder交互通信实例.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

android Service Binder交互通信实例.docx

1、android Service Binder交互通信实例android SDK提供了Service,用于类似*nix守护进程或者windows的服务。Service有两种类型:1.本地服务(Local Service):用于应用程序内部2.远程服务(Remote Sercie):用于android系统内部的应用程序之间前者用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好。后者可被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。编写不需和Activity交互的本地服务

2、示例本地服务编写比较简单。首先,要创建一个Service类,该类继承android的Service类。这里写了一个计数服务的类,每秒钟为计数器加一。在服务类的内部,还创建了一个线程,用于实现后台执行上述业务逻辑。package com.easymorse;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.util.Log;public class CountService extends Service private boolean threadD

3、isable; private int count; Override public IBinder onBind(Intent intent) return null; Override public void onCreate() super.onCreate(); new Thread(new Runnable() Override public void run() while (!threadDisable) try Thread.sleep(1000); catch (InterruptedException e) count+; Log.v(CountService, Count

4、 is + count); ).start(); Override public void onDestroy() super.onDestroy(); this.threadDisable = true; Log.v(CountService, on destroy); public int getCount() return count; 需要将该服务注册到配置文件AndroidManifest.xml中,否则无法找到: 在Activity中启动和关闭本地服务。package com.easymorse;import android.app.Activity;import android.

5、content.Intent;import android.os.Bundle;public class LocalServiceDemoActivity extends Activity /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); this.startService(new Intent(thi

6、s, CountService.class); Override protected void onDestroy() super.onDestroy(); this.stopService(new Intent(this, CountService.class); 可通过日志查看到后台线程打印的计数内容。编写本地服务和Activity交互的示例上面的示例是通过startService和stopService启动关闭服务的。适用于服务和activity之间没有调用交互的情况。如果之间需要传递参数或者方法调用。需要使用bind和unbind方法。具体做法是,服务类需要增加接口,比如ICountS

7、ervice,另外,服务类需要有一个内部类,这样可以方便访问外部类的封装数据,这个内部类需要继承Binder类并实现ICountService接口。还有,就是要实现Service的onBind方法,不能只传回一个null了。这是新建立的接口代码:package com.easymorse;public interface ICountService public abstract int getCount();修改后的CountService代码:package com.easymorse;import android.app.Service;import android.content.In

8、tent;import android.os.Binder;import android.os.IBinder;import android.util.Log;public class CountService extends Service implements ICountService private boolean threadDisable; private int count; private ServiceBinder serviceBinder=new ServiceBinder(); public class ServiceBinder extends Binder impl

9、ements ICountService Override public int getCount() return count; Override public IBinder onBind(Intent intent) return serviceBinder; Override public void onCreate() super.onCreate(); new Thread(new Runnable() Override public void run() while (!threadDisable) try Thread.sleep(1000); catch (Interrupt

10、edException e) count+; Log.v(CountService, Count is + count); ).start(); Override public void onDestroy() super.onDestroy(); this.threadDisable = true; Log.v(CountService, on destroy); /* (non-Javadoc) * see com.easymorse.ICountService#getCount() */ public int getCount() return count; 服务的注册也要做改动,And

11、roidManifest.xml文件: Acitity代码不再通过startSerivce和stopService启动关闭服务,另外,需要通过ServiceConnection的内部类实现来连接Service和Activity。package com.easymorse;import android.app.Activity;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;imp

12、ort android.os.IBinder;import android.util.Log;public class LocalServiceDemoActivity extends Activity private ServiceConnection serviceConnection = new ServiceConnection() Override public void onServiceConnected(ComponentName name, IBinder service) countService = (ICountService) service; Log.v(Count

13、Service, on serivce connected, count is + countService.getCount(); Override public void onServiceDisconnected(ComponentName name) countService = null; ; private ICountService countService; /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) super

14、.onCreate(savedInstanceState); setContentView(R.layout.main); this.bindService(new Intent(com.easymorse.CountService), this.serviceConnection, BIND_AUTO_CREATE); Override protected void onDestroy() this.unbindService(serviceConnection); super.onDestroy(); /注意先后 编写传递基本型数据的远程服务上面的示例,可以扩展为,让其他应用程序复用该服务

15、。这样的服务叫远程(remote)服务,实际上是进程间通信(RPC)。这时需要使用android接口描述语言(AIDL)来定义远程服务的接口,而不是上述那样简单的java接口。扩展名为aidl而不是java。可用上面的ICountService改动而成ICountSerivde.aidl,eclipse会自动生成相关的java文件。package com.easymorse;interface ICountService int getCount();编写服务(Service)类,稍有差别,主要在binder是通过远程获得的,需要通过桩(Stub)来获取。桩对象是远程对象的本地代理。packa

16、ge com.easymorse;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;public class CountService extends Service private boolean threadDisable; private int count; private ICountService.Stub serviceBinder = new ICo

17、untService.Stub() Override public int getCount() throws RemoteException return count; ; Override public IBinder onBind(Intent intent) return serviceBinder; Override public void onCreate() super.onCreate(); new Thread(new Runnable() Override public void run() while (!threadDisable) try Thread.sleep(1

18、000); catch (InterruptedException e) count+; Log.v(CountService, Count is + count); ).start(); Override public void onDestroy() super.onDestroy(); this.threadDisable = true; Log.v(CountService, on destroy); 配置文件AndroidManifest.xml和上面的类似,没有区别。在Activity中使用服务的差别不大,只需要对ServiceConnection中的调用远程服务的方法时,要捕获异

19、常。private ServiceConnection serviceConnection = new ServiceConnection() Override public void onServiceConnected(ComponentName name, IBinder service) countService = (ICountService) service; try Log.v(CountService, on serivce connected, count is + countService.getCount(); catch (RemoteException e) thr

20、ow new RuntimeException(e); Override public void onServiceDisconnected(ComponentName name) countService = null; ;这样就可以在同一个应用程序中使用远程服务的方式和自己定义的服务交互了。如果是另外的应用程序使用远程服务,需要做的是复制上面的aidl文件和相应的包构到应用程序中,其他调用等都一样。编写传递复杂数据类型的远程服务远程服务往往不只是传递java基本数据类型。这时需要注意android的一些限制和规定:1.android支持String和CharSequence2.如果需要在aidl中使用其他aidl接口类型,需要import,即使是在相同包结构下;3.android允许传递实现

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1