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

Android实现在ServiceManager中加入自定义服务的方法详解,第1张

概述本文实例讲述了Android实现在ServiceManager中加入自定义服务的方法。分享给大家供大家参考,具体如下:

本文实例讲述了AndroID实现在ServiceManager中加入自定义服务的方法。分享给大家供大家参考,具体如下:

当我们要使用androID的系统服务时,一般都是使用Context.getSystemService方法。例如我们要获取AudioManager,我们可以:

AudioManager am = (AudioManager) getSystemService(Context.AUdio_SERVICE);

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

可以看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中获取Binder    IBinder b = ServiceManager.getService(Context.AUdio_SERVICE);    // 将Binder转化成IAudioService,方便调用    sService = IAudioService.Stub.asInterface(b);    return sService;}

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

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

1)MyServicelib:这是个lib工程,需要在eclipse中勾选Is library。后面的两个工程,都需要将MyServicelib添加到library中。

2) MyService: 用于在androID开机时注册自定义服务进ServiceManager。因为ServiceManager被@hIDe隐藏了,所以要使用它需要自己手动添加sdk包,添加方式可参考在Eclipse中使用SDK中@hIDe函数的方法附加说明。另外,添加服务,需要System用户,所以manifest文件中需要加上androID:sharedUserID="androID.uID.system",并且要使用platform签名签名apk。

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

下面我们就来编码。

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

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

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

2. 在MyService工程中创建MyService类,这个类继承自IMyService.Stub,实现了setValue和getValue接口,这就是一个Service。

package com.test.myservice;import androID.os.remoteexception;import com.test.lib.IMyService;public class MyService extends IMyService.Stub {  private int value;  @OverrIDe  public voID setValue(int val) throws remoteexception {    this.value = val;  }  @OverrIDe  public int getValue() throws remoteexception {    return value;  }}

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

3. 在MyService工程中创建MyServiceApplication类

package com.test.myservice;import androID.app.Application;import androID.os.ServiceManager;public class MyServiceApplication extends Application{  @OverrIDe  public voID onCreate() {    super.onCreate();    ServiceManager.addService("MYSERVICE",new MyService());  }}

这是一个Application,我们希望androID系统启动时,就创建这个Application,在onCreate方法中,创建MyService类,并加入到ServiceManager中。因此,我需要修改下manifest文件

<application    androID:name=".MyServiceApplication"  //指定Application为我们创建的MyServiceApplication    androID:allowBackup="true"    androID:icon="@drawable/ic_launcher"    androID:persistent="true"       // 加上persistent=ture,ActivityManager创建的时候,就会创建该应用的进程,并调用MyServiceApplication的onCreate方法    androID:label="@string/app_name"    androID:theme="@style/Apptheme" >

注意,这个应用需要system用户,并签名才可运行。

这样,服务端就好了,并且开机时,我们的服务就已经在ServiceManager中了。

4. 下面我们提供一个Manager类方便客户端使用。在MyServicelib中创建MyManager类:

package com.test.lib;import androID.os.remoteexception;import androID.os.ServiceManager;public class MyManager {  private static MyManager instance;  private IMyService myservice;  public static MyManager getInstance() {    if (instance == null) {      instance = new MyManager();    }    return instance;  }  private MyManager() {    // 从ServiceManager中获取服务    myservice = IMyService.Stub.asInterface(ServiceManager.getService("MYSERVICE"));  }  public voID setValue(int value) throws remoteexception {    myservice.setValue(value);  }  public int getValue() throws remoteexception {    return myservice.getValue();  }}

5. 在MyServiceTest工程中进行测试

通过MyManager.getInstance()可以很方便的获取服务的Manager,对远程服务进行调用。我们创建一个Activity来使用MyManager

package com.test.clIEnt;import java.util.Random;import androID.app.Activity;import androID.content.Context;import androID.media.AudioManager;import androID.os.Bundle;import androID.os.remoteexception;import androID.vIEw.VIEw;import androID.vIEw.VIEw.OnClickListener;import androID.Widget.button;import androID.Widget.TextVIEw;import androID.Widget.Toast;import com.test.binder.clIEnt.R;import com.test.lib.MyManager;public class MainActivity extends Activity implements OnClickListener {  MyManager myManager;  button btnSetValue;  button btnGetValue;  TextVIEw tvValue;  @OverrIDe  protected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    AudioManager am = (AudioManager) getSystemService(Context.AUdio_SERVICE);    setContentVIEw(R.layout.activity_main);    btnSetValue = (button) findVIEwByID(R.ID.btn_set_value);    btnGetValue = (button) findVIEwByID(R.ID.btn_get_value);    tvValue = (TextVIEw) findVIEwByID(R.ID.tv_value);    // 获取MyManager    myManager = MyManager.getInstance();  }  @OverrIDe  public voID onClick(VIEw vIEw) {    switch (vIEw.getID()) {    case R.ID.btn_set_value:      int value = new Random().nextInt();      try {        myManager.setValue(value);        Toast.makeText(this,"set value to "+value+ " success!",0).show();      } catch (remoteexception e) {        e.printstacktrace();        Toast.makeText(this,"set value fail!",0).show();      }      break;    case R.ID.btn_get_value:      try {        tvValue.setText("value:"+myManager.getValue());      } catch (remoteexception e) {        // Todo auto-generated catch block        e.printstacktrace();      }      break;    default:      break;    }  }}

附:在Eclipse中使用SDK中@hIDe函数的方法@H_301_99@

我们使用Eclipse进行androID开发时,使用的是ADT中提供的SDK,里面是不包含@hIDe函数和变量的。因为androID为了兼容、安全等原因,在提供SDK时,把这些函数给隐藏了。但是,很多时候,我们又需要使用这些函数,因此我们需要手动添加androID SDK。例如,当我们使用AudioManager时,当需要看某种streamType是否mute时,可以调用isstreamMute(int streamType)这个方法,但是因为它是@hIDe的,所以我们就需要引入自己的sdk,才能编译通过。

1. androID系统编译时,当编译“include $(BUILD_JAVA_liBRARY)”时,会在$ANDROID_SOURCE_BASE/out/target/common/obj/JAVA_liBRARIES生成中间文件,当我们需要使用某些类库时,可以从这里面找。

isstreamMute(int streamType)在framework.jar中,我们从out/target/common/obj/JAVA_liBRARIES/framework_intermediates中,将classes.jar拷贝到本地,并重命名为framework.jar。

2. 在eclipse中右键工程->PropertIEs->Java Build Path->librarIEs->Add External JAR

3. 点击Order and Export,将framework.jar 置顶

4. 现在,我们就可以使用AudioManager中的isstreamMute(int streamType)方法了

更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android基本组件用法总结》、《Android视图View技巧总结》、《Android资源 *** 作技巧汇总》、《Android *** 作json格式数据技巧总结》、《Android开发入门与进阶教程》、《Android编程之activity *** 作技巧总结》及《Android控件用法总结》

希望本文所述对大家AndroID程序设计有所帮助。

总结

以上是内存溢出为你收集整理的Android实现在ServiceManager中加入自定义服务的方法详解全部内容,希望文章能够帮你解决Android实现在ServiceManager中加入自定义服务的方法详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1144586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存