这篇文章主要介绍了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中加入自定义服务的方法