如何添加一个Application Framework Service(一)(without native code)
如何添加一个ApplicationFrameworkService(withoutnativecode)?
1、本文参照AlarmManagerService实现一个简单的ApplicationFrameworkService,取名为HelloWorldService,类图如下:
2、在目录frameworks/base/core/java/android/app/下添加aidl文件:
IHelloWorld.aidl:
packageandroid.app;
importjava.lang.String;
interfaceIHelloWorld
{
voidprintHelloWorld();
voidprintString(Stringstring);
}
需要注意:
(1)该文件的package声明应为:packageandroid.app;
3、在目录frameworks/base/services/java/com/android/server/下添加文件:
HelloWorldService.java:
packagecom.android.server;
importandroid.app.IHelloWorld;
importandroid.content.Context;
importandroid.os.RemoteException;
importandroid.util.Log;
publicclassHelloWorldServiceextendsIHelloWorld.Stub
{
privatestaticfinalStringTAG="HelloWorldService";
privateContextmContext=null;
publicHelloWorldService(Contextcontext)
{
mContext=context;
}
@Override
publicvoidprintHelloWorld()throwsRemoteException
{
//TODOAuto-generatedmethodstub
Log.d(TAG,"HelloWorld!");
}
@Override
publicvoidprintString(Stringstring)throwsRemoteException
{
//TODOAuto-generatedmethodstub
Log.d(TAG,string);
}
}
需要注意:
(1)该文件的package声明应为:packagecom.android.server;
(2)该文件中添加语句:importandroid.app.IHelloWorld;
4、在目录frameworks/base/core/java/android/app/下添加文件:
HelloWorldManager.java:
packageandroid.app;
importandroid.os.RemoteException;
publicclassHelloWorldManager
{
privatestaticfinalStringTAG="HelloWorldManager";
privateIHelloWorldmService=null;
HelloWorldManager(IHelloWorldservice)
{
mService=service;
}
publicvoidprintHelloWorld()
{
try
{
mService.printHelloWorld();
}
catch(RemoteExceptione)
{
e.printStackTrace();
}
}
publicvoidprintString(Stringstring)
{
try
{
mService.printString(string);
}
catch(RemoteExceptione)
{
e.printStackTrace();
}
}
}
需要注意:
(1)该文件的package声明应为:packageandroid.app,需要与aidl文件中的package声明保持一致;
5、修改frameworks/base/下的Android.mk文件:
在“LOCAL_SRC_FILES+=\”中,参照IAlarmManager的添加方式:
core/java/android/app/IAlarmManager.aidl\
在“LOCAL_SRC_FILES+=\”的最后面添加:
core/java/android/app/IHelloWorld.aidl,
需要注意:
(1)在core/java/android/app/IHelloWorld.aidl上面一行的最后面,还需要添加“\”;
6、修改frameworks/base/core/java/android/content/下的Context.java文件:
参照ALARM_SERVICE的添加方式:
publicstaticfinalStringALARM_SERVICE="alarm";
为Context类添加成员变量:
publicstaticfinalStringHELLOWORLD_SERVICE="helloworld";
7、修改frameworks/base/services/java/com/android/server/下的SystemServer.java文件:
参照AlarmManagerService的注册方式:
AlarmManagerServicealarm=null;
Slog.i(TAG,"AlarmManager");
alarm=newAlarmManagerService(context);
ServiceManager.addService(Context.ALARM_SERVICE,alarm);
将HelloWorldService注册到ServiceManager中:
HelloWorldServicehelloworld=null;
Slog.i(TAG,"HelloWorldManager");
helloworld=newHelloWorldService(context);
ServiceManager.addService(Context.HELLOWORLD_SERVICE,helloworld);
8、修改frameworks/base/core/java/android/app/下的ContextImpl.java文件:
Android4.0ICS系统的注册方式:
参照ALARM_SERVICE的注册方式:
registerService(ALARM_SERVICE,newStaticServiceFetcher()
{
publicObjectcreateStaticService()
{
IBinderb=ServiceManager.getService(ALARM_SERVICE);
IAlarmManagerservice=IAlarmManager.Stub.asInterface(b);
returnnewAlarmManager(service);
}
}
);
注册HELLOWORLD_SERVICE:
registerService(HELLOWORLD_SERVICE,newStaticServiceFetcher()
{
publicObjectcreateStaticService()
{
IBinderb=ServiceManager.getService(HELLOWORLD_SERVICE);
IHelloWorldservice=IHelloWorld.Stub.asInterface(b);
returnnewHelloWorldManager(service);
}
}
);
Android2.3gingerbread系统的注册方式:
参照ALARM_SERVICE的注册方式:
privatestaticAlarmManagersAlarmManager;
privateAlarmManagergetAlarmManager()
{
synchronized(sSync)
{
if(sAlarmManager==null)
{
IBinderb=ServiceManager.getService(ALARM_SERVICE);
IAlarmManagerservice=IAlarmManager.Stub.asInterface(b);
sAlarmManager=newAlarmManager(service);
}
}
returnsAlarmManager;
}
elseif(ALARM_SERVICE.equals(name))
{
returngetAlarmManager();
}
注册HELLOWORLD_SERVICE:
privatestaticHelloWorldManagersHelloWorldManager;
privateHelloWorldManagergetHelloWorldManager()
{
synchronized(sSync)
{
if(sHelloWorldManager==null)
{
IBinderb=ServiceManager.getService(HELLOWORLD_SERVICE);
IHelloWorldservice=IHelloWorld.Stub.asInterface(b);
sHelloWorldManager=newHelloWorldManager(service);
}
}
returnsHelloWorldManager;
}
elseif(HELLOWORLD_SERVICE.equals(name))
{
returngetHelloWorldManager();
}
9、如果Service中不涉及到JNI操作,ApplicationFrameworkServiceHelloWorldService就添加完成,
然后就可以直接在 Application中像使用AlarmManager一样使用HelloWorldManager进行操作,
示例如下:
HelloWorldServiceTest.java
packagecom.android.example;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.app.HelloWorldManager;
importandroid.content.Context;
publicclassHelloWorldServiceTestextendsActivity
{
privatestaticfinalStringTAG="HelloWorldServiceTest";
privateHelloWorldManagermHelloWorldManager=null;
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mHelloWorldManager=(HelloWorldManager)getSystemService(Context.HELLOWORLD_SERVICE);
Log.d(TAG,"******************************");
mHelloWorldManager.printHelloWorld();
Log.d(TAG,"******************************");
mHelloWorldManager.printString("Isucceed!");
Log.d(TAG,"******************************");
}
}
Android.mk
LOCAL_PATH:=$(callmy-dir)
include$(CLEAR_VARS)
LOCAL_MODULE_TAGS:=optional
LOCAL_SRC_FILES:=$(callall-java-files-under,src)
LOCAL_PACKAGE_NAME:=HelloWorldServiceTest
include$(BUILD_PACKAGE)
程序执行结果如下图:
更多相关文章
- Android断点续传学习
- android apk--程序发布前的准备
- Android中Tab类型主界面大总结一共5种方式
- [Android(安卓)L]Android(安卓)L RippleView 效果 低版本实现
- SharedPreferences存储数据及文件数据存储
- Android开发环境使用工具Android(安卓)Studio工程目录结构
- 【使用LeanCloud】在Android中添加一行数据
- Android中SeekBar和RatingBar用法实例分析
- ionic android 发布