实现远程结构(AIDL)
当然你费很大功夫写了一个程序,肯定会考虑到跟其他应用程序的“交流”问题(执行其他调用),所以很明显的就会涉及到接口(远程接口)问题,AIDL就是解决这个问题的核心所在了。你要定义远程接口,首先你必须创建一个AIDL文件,在文件中声明接口,然后实现这个接口,并且在onBind()方法被调用时返回这个接口(感觉不太清楚,看代码应该是,创建了一个类来实现这个接口,返回这个类的实例)的实例。
咳咳,自己第一次做的时候连eclipse怎么创建一个AIDL文件都不知道,不过总是有好心人在某个角落留下了例子(链接:http://my.oschina.net/u/779520/blog/79936)。
接着我们就可以通过其接口来实用服务了,这时候就涉及到ServiceConnection的两个方法,onServiceConnected()和onServiceDisconnected()来实现Service的连接和释放连接(注:远程接口调用将进行跨线程的操作,并且同步完成,如果调用需要消耗比较长的时间,那么应该向其他的耗时调用一样在另外的线程中进行处理)。
注:在另外的程序中需要使用这个接口的时候,需要在工程中添加AIDL文件以及相应的包(说的普通点就是涉及到的程序中都要有这个接口文件,一个(主人家)是实现,剩下的(客人)用来调用它)。
实例:
package com.qimu.service; interface IRemoteInterface { String getValue(); }
package com.qimu.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; public class Aidl_Service extends Service { public class aidlService extends IRemoteInterface.Stub { @Override public String getValue() throws RemoteException { return "Service 连接成功!"; } } @Override public IBinder onBind(Intent intent) { return new aidlService(); } } 服务端Service实现
package com.qimu.service; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.os.RemoteException; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity implements OnClickListener { TextView tv_service; Button bt_1, bt_2; private IRemoteInterface iremoteInterface = null; private ServiceConnection serviceconnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName arg0) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { iremoteInterface = IRemoteInterface.Stub.asInterface( service ); bt_2.setEnabled( true ); } }; @Override public void onClick( View view ) { // TODO Auto-generated method stub switch ( view.getId() ) { case R.id.button1: tv_service.setText( "Service starting! " ); bindService( new Intent("com.example.aidlservice.Aidl_Service"), serviceconnection, Context.BIND_AUTO_CREATE ); break; case R.id.button2: try { tv_service.setText( iremoteInterface.getValue() ); } catch (RemoteException e) { System.out.println("Error"); } break; default: break; } } } 客服端调用
很简单的一个例子,在客服端程序中有2个Button,1个TextView,点击bt_1绑定并启用服务,点击bt_2获取服务端实现的功能(返回一个字符串)。
实现可包装类(Parcelable)
Parcelable类主要是用来封装数据,便于传输,关于它的实用附上链接:http://blog.sina.com.cn/s/blog_78e3ae430100pxba.html,没什么太多好看的,书上提到了也就看了一下。
IntentService类
在程序设计中,你会需要处理很多高频率的请求,将这些需要周期性执行的任务放在一个工作队列中,会使得你的程序简单而高效,同时还可以避免创建一个完整的麻烦的Service,IntentService是一个简单的服务,它可以用Intent请求的方法来处理异步的任务,每个Intent都会被添加到与IntentService相关的工作队列中,然后序列化的进行处理,对于返回结果,你可以选择通过广播( sendBroadcast()方法 )向应用程序发送Intent对象,并使用应用程序中的广播接收器(BroadcastReceiver)来捕获这些结果。