iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android怎么实现在ServiceManager中加入自定义服务的方法
  • 832
分享到

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

androidservicemanager 2023-05-30 21:05:00 832人浏览 安东尼
摘要

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

这篇文章主要介绍了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函数的方法

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

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。

在eclipse中右键工程->Properties->Java Build Path->Libraries->Add External JAR

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

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

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

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

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

感谢你能够认真阅读完这篇文章,希望小编分享的“Android怎么实现在ServiceManager中加入自定义服务的方法”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Android怎么实现在ServiceManager中加入自定义服务的方法

本文链接: https://www.lsjlt.com/news/221378.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android怎么实现在ServiceManager中加入自定义服务的方法
    这篇文章主要介绍了Android怎么实现在ServiceManager中加入自定义服务的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:当我们要使用android...
    99+
    2023-05-30
    android servicemanager
  • 在Android开发中怎么实现一个自定义输入法功能
    在Android开发中怎么实现一个自定义输入法功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前面两个输入框使用了自定义的输入法:第三个输入框没有进行任何设置...
    99+
    2023-05-31
    android roi
  • 怎么在android中自定义一个PagerAdapter方法
    这篇文章给大家介绍怎么在android中自定义一个PagerAdapter方法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先,如果继承pageradapter,至少必须重写下面的四个方法  &n...
    99+
    2023-05-30
    android pageradapter
  • ContentProvider怎么在Android应用中实现自定义
    这篇文章给大家介绍ContentProvider怎么在Android应用中实现自定义,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1,创建一个数据库帮助类,归根结底都是它在操作数据库。代码如下:package com....
    99+
    2023-05-31
    android contentprovider roi
  • 怎么在Android中实现一个自定义控件
    今天就跟大家聊聊有关怎么在Android中实现一个自定义控件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先定义一个layout实现按钮内部布局:<xml vers...
    99+
    2023-05-31
    android
  • Android怎么实现自定义密码输入框
    本篇内容主要讲解“Android怎么实现自定义密码输入框”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android怎么实现自定义密码输入框”吧!一、实现效果及方案预期效果图:如上图所示,要实现...
    99+
    2023-06-25
  • jQuery中怎么添加自定义方法
    本文小编为大家详细介绍“jQuery中怎么添加自定义方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“jQuery中怎么添加自定义方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、什么是jQuery自定义方...
    99+
    2023-07-06
  • Android自定义View实现LayoutParams的方法详解
    目录第一层理解第二层理解第三层理解这一期我们来讲一讲LayoutParams这个玩意儿。Android入门的第一行代码就牵扯到这个东西,然而,你真的理解够了吗? 第一层理解 <...
    99+
    2023-02-02
    Android自定义View实现LayoutParams Android实现LayoutParams Android LayoutParams
  • Android自定义验证码输入框的方法实例
    目录实践过程总结实践过程 前面我们学完了EditText和TextView两个组件,但是,光学不练没意思。 所以今天我们趁热打铁,利用两个组件实现个自定义验证码输入框。 思路前瞻:...
    99+
    2024-04-02
  • Android自定义View实现圆形加载进度条效果的方法
    这篇文章将为大家详细讲解有关Android自定义View实现圆形加载进度条效果的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。View仿华为圆形加载进度条效果图实现思路可以看出该View可分为三个部分...
    99+
    2023-05-30
    android view 进度条
  • Android开发中怎么样实现自定义toast
    这篇文章将为大家详细讲解有关Android开发中怎么样实现自定义toast,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体方法如下://自定义布局的toastcustomViewToast...
    99+
    2023-05-31
    android roi toast
  • OutputFormat在java 中怎么实现自定义
    本篇文章给大家分享的是有关OutputFormat在java 中怎么实现自定义,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。java 中 自定义OutputFormat实例代码...
    99+
    2023-05-31
    java outputformat fo
  • Android 中怎么在有序广播中添加自定义权限
    这篇文章给大家介绍Android 中怎么在有序广播中添加自定义权限,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android 中在有序广播中添加自定义权限的实例有序广播说明:有序广播因为要处理消息的处理结果,所以要复...
    99+
    2023-05-30
    android
  • Android怎么自定义View实现球形动态加速球
    这篇文章主要讲解了“Android怎么自定义View实现球形动态加速球”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android怎么自定义View实现球形动态加速球”吧!利用贝塞尔曲线画波...
    99+
    2023-07-02
  • Vue3 中自定义插件的实现方法
    目录1. Vue 插件2. 自定义插件2.1 基本用法2.2 加入组件2.3 加入指令2.4 provide & inject3. 小结最近在录 TienChin 项目,项目...
    99+
    2022-11-13
    Vue自定义插件 Vue3自定义插件
  • Android怎么实现自定义圆角输入框和按钮
    这篇文章主要介绍“Android怎么实现自定义圆角输入框和按钮”,在日常操作中,相信很多人在Android怎么实现自定义圆角输入框和按钮问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android怎么实现自定...
    99+
    2023-06-25
  • Android自定义View实现体重表盘的方法是什么
    本篇内容介绍了“Android自定义View实现体重表盘的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果视频分析起始角度如下图...
    99+
    2023-06-25
  • 怎么在Java中实现自定义注解
    怎么在Java中实现自定义注解?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。注解是什么?①、引用自维基百科的内容:Java注解又称Java标注,是JDK5.0版本开始支持加入源...
    99+
    2023-06-14
  • 怎么在Vue3中实现自定义指令
    这篇文章主要介绍“怎么在Vue3中实现自定义指令”,在日常操作中,相信很多人在怎么在Vue3中实现自定义指令问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在Vue3中实现自定义指令”的疑惑有所帮助!接下来...
    99+
    2023-07-02
  • Android中怎么通过自定义view实现进度条加载效果
    Android中怎么通过自定义view实现进度条加载效果,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。分析图:代码如下:package com.example.d...
    99+
    2023-05-30
    android view
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作