- 浏览: 909537 次
- 性别:
- 来自: 上海
最新评论
-
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 1173extern "C" { jint Jav ... -
Android ALMP 架设web服务器配置
2014-10-08 18:48 1405随着信息时代的发展,智能手机已经越来越普及。下面本文将带大家把 ... -
Android UiAutomator 自动化测试
2014-07-04 17:39 9852一、一个BUG引发的问题 ... -
Android XP MTP支持
2014-03-18 16:41 2205家里电脑是win7,连上直接豌豆荚装驱动就好了。但单位的XP却 ... -
Android Launcher2 icon大小修改
2012-08-16 19:12 5974不同分辨率、不同屏幕的不同设备,android 原生的Laun ... -
android 浏览器APN切换
2012-04-16 16:42 2248业务需求:有些链接需 ... -
android 浏览器全屏显示
2012-04-16 16:40 4813业务需求:浏览器设置中支持全屏显示的功能。 分析:只需要在 ... -
Android MD5校验码的生成与算法实现
2012-03-05 15:05 20289在Java中,java.security.MessageDi ... -
Android View的xml属性
2012-02-27 13:25 2776java.lang.Object andro ... -
Android Gallery3D源码学习总结(三)——Cache缓存及数据处理流程
2011-12-29 11:04 4627第一,在应用程序中有三个线程存在:主线程(随activity的 ... -
Android Gallery3d源码学习总结(二)——绘制流程drawThumbnails
2011-12-29 11:02 2855此函数控制相册表格页 ... -
Android Gallery 3D 特效精华
2011-12-29 10:45 5247Android Gallery 3D 特效精华 一、布 ... -
Android Gallery3d源码学习总结(一)——绘制流程drawFocusItems
2011-12-29 10:42 2662显示单张图片相关的输入变量 int selecte ... -
Android:AppWidget,PendingIntent,RemoteViews用法
2011-11-25 10:09 5795什么是AppWidget?AppWidget就是我们平常在 ... -
Android软件汉化/精简/去广告教程
2011-08-23 12:32 2852前言: 现在随处都可以找到功能强大的汉化工具,操作简 ... -
Android ListView页眉页脚效果
2011-07-06 14:07 2622大家都知道,在我们调用ListView的addFooterVi ... -
Android 获取设备信息
2011-06-22 21:09 7873)android 获取设备型号、OS版本号: imp ... -
Android 应用安装设置
2011-05-31 16:18 1827应用程序的默认安装位置以及是否可移动取决于该程序的开发者的配置 ... -
Android Activity去除标题栏和状态栏
2011-05-31 13:10 40401一、在代码中设置 public void onCreate( ... -
Android最佳实践之响应灵敏性
2011-05-16 14:44 1311Android最佳实践之响应灵敏性 可能会存在这样 ...
相关推荐
简化android跨进程调用,无需aidl、service、messenger等,只需定义任意接口,并实现接口即可。 利用此框架可以轻松实现跨进程调用。 使用方法: 1、项目中引入libray工程, 另请关注libray工程manifest中的配置信息 ...
主要介绍了Android实现在ServiceManager中加入自定义服务的方法,结合实例形式分析了Android开发中ServiceManager自定义服务的相关创建与使用方法,需要的朋友可以参考下
对Android中ServiceManager的详细介绍。
com_servicemanager:自定义Joomla组件,用于管理自定义项目
認識Android的ServiceManager
serviceManager,简单的android实用程序,帮助将后台服务用作作业,而无需进行硬更改。与Android O兼容。.zip
認識Android 的 天字第 1 號核心服務:ServiceManager By 高煥堂
android 系统隐藏类 直接调用包 ServiceManager和StatusBarManager,主要用来屏蔽通知栏下拉。
1.初探Android ...21.ServiceManager服务分析 22.packageMangerService服务分析 23.AndroidSensor简介 24.Android_Sensor框架 25.SensorManger分析 26.SensorService分析 27.SensorHal分析 28.Android_inpu
Android系统启动过程分析 本文主要介绍Android系统的启动过程,以Androidinit进程之后部分为主,init之前部分同标准...本文主要分析android部分的启动,涉及范围为servicemanager启动到android系统的Java部分的Service
AndroidFrameWork底层开发视频 主要内容如下: Android开发环境与编译...ServiceManager packageMangerService AndroidSensor SensorManger SensorService SensorHal Android_input Linux输入设备 Android浏览器等
zend-servicemanager, Zend框架中的ServiceManager组件 母版: 开发: 服务定位器设计 Pattern 是由 ZendServiceManager 组件实现的。 服务定位器是一个服务/对象定位器,任务是检索其他对象。在 ...
E04_HAL觀點_ServiceManager和IBinder扮演的角色_android
8.3 如何以Proxy Object整合Android Service 8.4 Long operations 的解析与实作细节 8.5 RemoteException 的解析与实作细节 8.6 Handler 与 Message 的解析与实作细节 8.7 Error Handling 9.专题探讨 9.1 整合...
#Native Service Demo 直接使用libhardware的Native Service,这个demo需要system权限或者更高权限。 关于如何使用一些Android SDK 中不存在的隐藏API,比如ServiceManager类。 你可以参考我 blogspot 的帖子:
通过ServiceManager.addService启动了ConnectivityService,在android系统里面我们常见的属于Connectivity的有 wifi,mobile,bluetooth,wimax,ethernet。 <framework/base/services/java/...
我们这里将以MediaService的例子来分析Binder的使用:l ServiceManager,这是Android OS的整个服务的管理程序l MediaService,这个程序里边注册了提供媒体播放的服务程序MediaPlayerService,我们最后只分析这个l ...
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 ...
Binder通信过程类似于TCP/IP服务连接过程binder四大架构Server(服务器),Client(客户端),ServiceManager(DNS)以及Binder驱动(路由器) 其中Server,Client,ServiceManager运行于用户空间,驱动运行于内核空间。这四...