`
quanminchaoren
  • 浏览: 932263 次
  • 性别: 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获取系统隐藏服务实现锁屏

    Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class); IBinder binder = (IBinder) method.invoke(null, new Object[]{Context.DEVICE_POLICY_SERVICE}); ...

    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硬件抽象层的...

    android403隐藏statusbar.doc

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

    android源码开发实战14.10.zip

    4. **应用程序框架**:这部分主要涉及Android应用程序的构建,如Intent、BroadcastReceiver、Service、ContentResolver等。开发者可以通过源码学习如何优化应用启动速度,理解数据同步和事件广播的实现。 5. **预装...

Global site tag (gtag.js) - Google Analytics