消息机制及IPC机制实现(3)

2、Service中实现IDateTimeService.Stub
eg:
package com.myq.Android.MultiProcessTest;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
 
public class DateTimeService extends Service {
 
 public static final String DATETIME_SERVICE_ACTION = "com.myq.android.MultiProcessTest.DATETIMESERVICE_ACTION" ;
 
 private static final String TAG = "--------DateTimeService-------" ;
 
 private  SimpleDateFormat sdf ;
 
 private final IDateTimeService.Stub stub = new IDateTimeService.Stub()
 {
 
  public String getCurrentDateTime(String format) throws RemoteException {
   return getCurrentDateTimeString(format) ;
  }
 } ;
 
 private synchronized String getCurrentDateTimeString(String format)
 {
     sdf = new SimpleDateFormat(format) ;
     final String temp = sdf.format(new Date()) ;
   Log.i(TAG,"getCurrentDateTimeString--" + Thread.currentThread() + "--" + temp) ;
   return temp ;
 }
 
 public IBinder onBind(Intent arg0)
 {
  Log.i(TAG, "onBind--" + Thread.currentThread()) ;
  return stub;
 }
}

3、Client端代码实现
private ServiceConnection mServiceConn = new ServiceConnection()
 {
 
  public void onServiceConnected(ComponentName name, IBinder service) {
   mDateTimeService = IDateTimeService.Stub.asInterface(service) ;
  }
 
  public void onServiceDisconnected(ComponentName name) {
   mDateTimeService = null ;
  }
 } ;
 
说明:
网上的好多资料都没有涉及IPC调用的AIDL的具体说明!
它本质上是Server端和Client端都具有相同的AIDL文件,要位于相同的包下,即package的包名药一样,然后才能正确的通过proxy访问,否则client与server的aidl文件处于不同package会出错的。
 
aidl模型如下:
                |<--------------------aidl---------------------->|
 client端-->proxy  ----------parcel数据包-------- stub<---server端
从而proxy+parcel+stub构成了aidl.
只不过,proxy运行在客户进程,而stub运行在服务端进程。
当你通过aidl去访问服务端时,客户端会阻塞在proxy,服务端处理完后,通知proxy返回。
 
四、附件及说明
1、
附件是我测试所用的demo,我用的系统是Ubuntu9,Android2.2版本
基本功能:
可以根据用户选择的不同输出格式输出当前系统的时间。
2、
运行顺序:
先运行Server端:MultiProcessTest
再运行Client端:MultiProcessTestClient
 
3、
注意点:
Server和Client端的AIDL文件必须要位于同package下,否则会出错
安全性问题实现,权限控制--定义、配置、使用
异步处理问题--Handler

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwsfwg.html