- 浏览: 924296 次
- 性别:
- 来自: 上海
最新评论
-
liu149339750:
我勒个去,搜到你的博客了,关注!
Android make脚本简记 -
ihopethatwell:
楼主,这个修改时间有个问题,退出修改界面就不保存设置的时间了, ...
Android中如何修改系统时间(应用程序获得系统权限) -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
taowayi:
推荐android一键反编译神器 apkdec
Android apk反编译
当我们要使用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;
}
}
}
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;
}
}
}
发表评论
-
Android JNI 编程常见小问题
2015-09-08 11:31 1224extern "C" { jint Jav ... -
Android ALMP 架设web服务器配置
2014-10-08 18:48 1487随着信息时代的发展,智能手机已经越来越普及。下面本文将带大家把 ... -
Android UiAutomator 自动化测试
2014-07-04 17:39 10002一、一个BUG引发的问题 ... -
Android XP MTP支持
2014-03-18 16:41 2317家里电脑是win7,连上直接豌豆荚装驱动就好了。但单位的XP却 ... -
Android Launcher2 icon大小修改
2012-08-16 19:12 6055不同分辨率、不同屏幕的不同设备,android 原生的Laun ... -
android 浏览器APN切换
2012-04-16 16:42 2338业务需求:有些链接需 ... -
android 浏览器全屏显示
2012-04-16 16:40 4913业务需求:浏览器设置中支持全屏显示的功能。 分析:只需要在 ... -
Android MD5校验码的生成与算法实现
2012-03-05 15:05 20362在Java中,java.security.MessageDi ... -
Android View的xml属性
2012-02-27 13:25 2831java.lang.Object andro ... -
Android Gallery3D源码学习总结(三)——Cache缓存及数据处理流程
2011-12-29 11:04 4697第一,在应用程序中有三个线程存在:主线程(随activity的 ... -
Android Gallery3d源码学习总结(二)——绘制流程drawThumbnails
2011-12-29 11:02 2924此函数控制相册表格页 ... -
Android Gallery 3D 特效精华
2011-12-29 10:45 5334Android Gallery 3D 特效精华 一、布 ... -
Android Gallery3d源码学习总结(一)——绘制流程drawFocusItems
2011-12-29 10:42 2734显示单张图片相关的输入变量 int selecte ... -
Android:AppWidget,PendingIntent,RemoteViews用法
2011-11-25 10:09 5916什么是AppWidget?AppWidget就是我们平常在 ... -
Android软件汉化/精简/去广告教程
2011-08-23 12:32 2920前言: 现在随处都可以找到功能强大的汉化工具,操作简 ... -
Android ListView页眉页脚效果
2011-07-06 14:07 2681大家都知道,在我们调用ListView的addFooterVi ... -
Android 获取设备信息
2011-06-22 21:09 7958)android 获取设备型号、OS版本号: imp ... -
Android 应用安装设置
2011-05-31 16:18 1901应用程序的默认安装位置以及是否可移动取决于该程序的开发者的配置 ... -
Android Activity去除标题栏和状态栏
2011-05-31 13:10 40481一、在代码中设置 public void onCreate( ... -
Android最佳实践之响应灵敏性
2011-05-16 14:44 1361Android最佳实践之响应灵敏性 可能会存在这样 ...
相关推荐
【serviceManager】是一款针对Android平台的开源实用工具库,它主要设计用来简化后台服务的管理和使用,特别是针对Android O及以上版本的系统。在Android O之后,Google引入了严格的后台执行限制,以改善电池寿命和...
在`SystemServer.java`中,我们可以看到启动BatteryService的代码行`ServiceManager.addService("battery", battery);`。 BatteryService通过JNI(Java Native Interface)与C++层的`...
`SystemServer`是Android服务框架的中心,它在`SystemServer.java`中初始化并创建了一系列的系统服务,如`ActivityManagerService`、`PackageManagerService`等,并将它们注册到`servicemanager`中,供其他组件调用...
ServiceManager是Android系统中管理服务注册和查找的关键组件。在zygote启动后,ServiceManager服务会被创建并注册到系统中。它使得其他服务可以向系统注册,让其他组件能够通过名字查找并交互。 总结,高通LA.1.1...
Class<?> clazz = Class.forName("android.os.ServiceManager"); Method method = clazz.getMethod("getService", String.class); IBinder binder = (IBinder) method.invoke(null, "phone"); ITelephony ...
Android IPC通信机制的源码分析深入剖析了Binder的工作原理,包括ServiceManager注册、客户端获取服务、Kernel通信等阶段。多客户端Service的设计和总结提供了进一步的实践指导。 多媒体架构部分,OpenCore是...
- **ServiceManager**:负责管理整个系统中的所有`Service`实例,提供统一的注册与查找接口。 - **Binder**:Android平台上的进程间通信机制,通过共享内存的方式实现跨进程对象的引用和方法调用。 #### 实现原理...
通过调用ServiceManager的addService和getService方法,客户端可以注册服务或查找已注册的服务。 3.4 客户端与服务端通信过程 客户端通过Binder对象发送请求到服务端,服务端在收到请求后执行相应操作,并将结果...
- **service_manager.c**:在`Frameworks\base\cmds\servicemanager\service_manager.c`中的`main`函数,是ServiceManager服务的起点,负责初始化服务注册表并监听请求。 - **main_runtime.cpp**:可能是关于运行...
在 Android 开发中,Service 是一个用于在后台长时间运行的任务,即使用户与应用程序交互界面脱离,服务仍然可以继续运行。ServiceManager 提供了一种更加优雅的方式来创建、启动、绑定和管理这些服务。 Kotlin 是...
IBinder binder = ServiceManager.getService("com.example.aidldemo.AIDL_SERVICE"); IAidlInterface aidlInterface = IAidlInterface.Stub.asInterface(binder); // 调用服务的方法 aidlInterface.simpleMethod...
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硬件抽象层的...
许多核心服务,如Activity Manager Service (AMS)、Window Manager Service (WMS)等,以及自定义服务都需要依赖Binder进行跨进程通信。 #### 二、MediaService剖析 本部分将通过具体的MediaService示例来详细解析...
通过`ServiceManager.getService(Context.WINDOW_SERVICE)`可以获取到这个服务的代理对象。 2. **canStatusBarHide方法**: 在代码中,`wm.canStatusBarHide()`用于检查当前设备是否支持隐藏状态栏。如果返回`true...