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