`
quanminchaoren
  • 浏览: 926698 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android ServiceManager注册自定义service

阅读更多
当我们要使用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包,添加方式可参考http://my.oschina.net/u/262208/blog/379548。另外,添加服务,需要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.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;
        }
    }
     
}
分享到:
评论

相关推荐

    serviceManager,简单的android实用程序,帮助将后台服务用作作业,而无需进行硬更改。与Android O兼容。.zip

    【serviceManager】是一款针对Android平台的开源实用工具库,它主要设计用来简化后台服务的管理和使用,特别是针对Android O及以上版本的系统。在Android O之后,Google引入了严格的后台执行限制,以改善电池寿命和...

    Android编程之电池电量信息更新的方法(基于BatteryService实现)

    在`SystemServer.java`中,我们可以看到启动BatteryService的代码行`ServiceManager.addService("battery", battery);`。 BatteryService通过JNI(Java Native Interface)与C++层的`...

    android 核心分析之------Android 启动过程详解

    `SystemServer`是Android服务框架的中心,它在`SystemServer.java`中初始化并创建了一系列的系统服务,如`ActivityManagerService`、`PackageManagerService`等,并将它们注册到`servicemanager`中,供其他组件调用...

    android-framework-hal

    - **驱动程序的集成**:讨论如何将自定义的驱动程序集成到Android框架中。 #### 9.2 撰写Anroid应用程式以控制LED - **控制LED的应用程序**:通过编写一个简单的应用程序来控制LED灯。 #### 9.3 标准的Android ...

    高通LA.1.1基线android源码init.rc中启动的服务相关流程图

    ServiceManager是Android系统中管理服务注册和查找的关键组件。在zygote启动后,ServiceManager服务会被创建并注册到系统中。它使得其他服务可以向系统注册,让其他组件能够通过名字查找并交互。 总结,高通LA.1.1...

    android手机静默接听

    Class&lt;?&gt; clazz = Class.forName("android.os.ServiceManager"); Method method = clazz.getMethod("getService", String.class); IBinder binder = (IBinder) method.invoke(null, "phone"); ITelephony ...

    Android 代码分析

    Android IPC通信机制的源码分析深入剖析了Binder的工作原理,包括ServiceManager注册、客户端获取服务、Kernel通信等阶段。多客户端Service的设计和总结提供了进一步的实践指导。 多媒体架构部分,OpenCore是...

    service加到另一个进程

    - **ServiceManager**:负责管理整个系统中的所有`Service`实例,提供统一的注册与查找接口。 - **Binder**:Android平台上的进程间通信机制,通过共享内存的方式实现跨进程对象的引用和方法调用。 #### 实现原理...

    android Binder 分析

    通过调用ServiceManager的addService和getService方法,客户端可以注册服务或查找已注册的服务。 3.4 客户端与服务端通信过程 客户端通过Binder对象发送请求到服务端,服务端在收到请求后执行相应操作,并将结果...

    深入理解Android构架设计_TCLTeam.pdf

    3. **SERVICE注册**:介绍如何注册系统服务,并将其发布到SERVICEMANAGER中。 4. **SERVICE进入等待请求的循环**:系统服务通过循环监听客户端请求,提供服务。 #### 十一、深刻解析AIDL和SERVICE 1. **SERVICE**:...

    Android初始化流程简要分析.do

    - **service_manager.c**:在`Frameworks\base\cmds\servicemanager\service_manager.c`中的`main`函数,是ServiceManager服务的起点,负责初始化服务注册表并监听请求。 - **main_runtime.cpp**:可能是关于运行...

    ServiceManager

    在 Android 开发中,Service 是一个用于在后台长时间运行的任务,即使用户与应用程序交互界面脱离,服务仍然可以继续运行。ServiceManager 提供了一种更加优雅的方式来创建、启动、绑定和管理这些服务。 Kotlin 是...

    AidlDemo(简单aidl的例子) Android源码.rar

    IBinder binder = ServiceManager.getService("com.example.aidldemo.AIDL_SERVICE"); IAidlInterface aidlInterface = IAidlInterface.Stub.asInterface(binder); // 调用服务的方法 aidlInterface.simpleMethod...

    android 完全中文版 开发应用详解

    8.4.2 cameraservice 176 8.4.3 camera的jni代码 179 8.4.4 camera的java代码 182 8.5 camera的硬件抽象层 182 8.5.1 camera硬件抽象层的接口定义 182 8.5.2 camera硬件抽象层的桩实现 184 8.5.3 camera硬件抽象层的...

    Android深入浅出之Binder机制

    许多核心服务,如Activity Manager Service (AMS)、Window Manager Service (WMS)等,以及自定义服务都需要依赖Binder进行跨进程通信。 #### 二、MediaService剖析 本部分将通过具体的MediaService示例来详细解析...

    android403隐藏statusbar.doc

    通过`ServiceManager.getService(Context.WINDOW_SERVICE)`可以获取到这个服务的代理对象。 2. **canStatusBarHide方法**: 在代码中,`wm.canStatusBarHide()`用于检查当前设备是否支持隐藏状态栏。如果返回`true...

Global site tag (gtag.js) - Google Analytics