如何添加一个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)


程序执行结果如下图:

更多相关文章

  1. Android断点续传学习
  2. android apk--程序发布前的准备
  3. Android中Tab类型主界面大总结一共5种方式
  4. [Android(安卓)L]Android(安卓)L RippleView 效果 低版本实现
  5. SharedPreferences存储数据及文件数据存储
  6. Android开发环境使用工具Android(安卓)Studio工程目录结构
  7. 【使用LeanCloud】在Android中添加一行数据
  8. Android中SeekBar和RatingBar用法实例分析
  9. ionic android 发布

随机推荐

  1. Android之场景桌面(一)
  2. Android 职业路上--只要还有一丝希望,不
  3. 两个Activity之间跳转问题之activity的四
  4. 安装应用android批量安装APK
  5. 【腾讯Bugly干货分享】Android(安卓)进程
  6. 20个经典Android游戏源码下载地址(持续更
  7. Android通讯录字母排序城市列表展示效果
  8. 实现Android(安卓)动态加载APK(Fragment o
  9. android中反射的应用
  10. Anroid音视频开发