Android怎么实现在ServiceManager中加入自定义服务的方法

  介绍

这篇文章主要介绍了Android怎么实现在ServiceManager中加入自定义服务的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

具体如下:

当我们要使用安卓的系统服务时,一般都是使用<代码>上下文。getSystemService 方法,例如我们要获取AudioManager,我们可以:

AudioManager  am =, (AudioManager), getSystemService (Context.AUDIO_SERVICE);

获取的服务,其实是在ServiceManager中注册的粘结剂服务,然后进行封装后,提供给用户。

可以看ContextImpl。java中的实现:

static  {   ,,……   ,,,//,将AudioManager加入SYSTEM_SERVICE_MAP中,调用getSystemService时,   ,,,//,就会从SYSTEM_SERVICE_MAP得到AudioManager   ,,,registerService (AUDIO_SERVICE, new  ServiceFetcher (), {   ,,,,,,,public  Object  createService (ContextImpl  ctx), {   ,,,,,,,,,return  new  AudioManager (ctx);   ,,,,,,,}});   ,,……   }

AudioManager是对IAudioService的封装,实际操作都是使用IAudioService进行的,看AudioManager中的代码:

private  static  IAudioService  getService ()   {   ,,,if  (sService  !=, null), {   ,,,,,return  sService;   ,,,}   ,,,//,从ServiceManager中获取粘合剂   ,,,IBinder  b =, ServiceManager.getService (Context.AUDIO_SERVICE);   ,,,//,将粘结剂转化成IAudioService,方便调用   ,,,sService =, IAudioService.Stub.asInterface (b);   ,,,return  sService;   }

上面是android系统的使用方式。如果我们添加自己的服务,要如何做呢?

我们在eclipse中建3个测试工程:

1) MyServiceLib:这是个自由工程,需要在eclipse中勾选是图书馆。后面的两个工程,都需要将MyServiceLib添加到图书馆中。

2) MyService:用于在android开机时注册自定义服务进ServiceManager。因为ServiceManager被@hide隐藏了,所以要使用它需要自己手动添加sdk包,添加方式可参考<强>在eclipse中使用sdk中@hide函数的方法附加说明强。另外,添加服务,需要系统用户,所以清单文件中需要加上android: sharedUserId=癮ndroid.uid.system",并且要使用平台签名签名apk。

3) MyServiceTest:用于测试上面两个工程。

下面我们就来编码。

先在MyServiceLib工程中创建一个aidl文件,android编译工具会帮我们生成相应的java类,aidl文件如下

package  com.test.lib;   interface  IMyService  {   void 才能setValue (int  val);   int 才能getValue ();   }

定义了两个接口用于测试,setValue和getValue。
android编译工具会帮我们在创目录下生成一个IMyService java类的。

<强> 2。在MyService工程中创建MyService类强劲,这个类继承自IMyService。存根,实现了setValue和getValue接口,这就是一个服务。

package  com.test.myservice;   import  android.os.RemoteException;   import  com.test.lib.IMyService;   public  class  MyService  extends  IMyService.Stub  {   private 才能;int 价值;   @Override才能   public 才能;void  setValue (int  val), throws  RemoteException  {   ,,,this.value =, val;   ,,}   @Override才能   public 才能;int  getValue (), throws  RemoteException  {   ,,,return 价值;   ,,}   }

下面我们将把它加入至ServiceManager中。

<强> 3。在MyService工程中创建MyServiceApplication类

package  com.test.myservice;   import  android.app.Application;   import  android.os.ServiceManager;   public  class  MyServiceApplication  extends 应用程序{   @Override才能   public 才能;void  onCreate (), {   ,,,super.onCreate ();   ,,,ServiceManager.addService (“MYSERVICE",, new  MyService ());   ,,}   }

这是一个应用程序,我们希望android系统启动时,就创建这个应用程序,在onCreate方法中,创建MyService类,并加入到ServiceManager中。因此,我需要修改下清单文件

& lt;应用程序   ,,,android: name=?MyServiceApplication",,//指定应用程序为我们创建的MyServiceApplication   ,,,android: allowBackup=皌rue"   ,,,android:图标=癅drawable/ic_launcher"   ,,,android:持久=皌rue",,,,,,,//,加上持久=真正ActivityManager创建的时候,就会创建该应用的进程,并调用MyServiceApplication的onCreate方法   ,,,android:标签=癅string/app_name"   ,,,android:主题=癅style/AppTheme",在

Android怎么实现在ServiceManager中加入自定义服务的方法