添加一个Application Framework Service
如何添加一个Application Framework Service(without native code)?
1、本文参照AlarmManagerService实现一个简单的Application Framework Service,取名为HelloWorldService,类图如下:

2、在目录frameworks/base/core/java/android/app/下添加aidl文件:
IHelloWorld.aidl:
package android.app;
import java.lang.String;
interface IHelloWorld
{
void printHelloWorld();
void printString(String string);
}
需要注意:
(1) 该文件的package声明应为:package android.app;
3、在目录frameworks/base/services/java/com/android/server/下添加文件:
HelloWorldService.java:
package com.android.server;
import android.app.IHelloWorld;
import android.content.Context;
import android.os.RemoteException;
import android.util.Log;
public class HelloWorldService extends IHelloWorld.Stub
{
private static final String TAG = "HelloWorldService";
private Context mContext = null;
public HelloWorldService(Context context)
{
mContext = context;
}
@Override
public void printHelloWorld() throws RemoteException
{
// TODO Auto-generated method stub
Log.d(TAG, "Hello World!");
}
@Override
public void printString(String string) throws RemoteException
{
// TODO Auto-generated method stub
Log.d(TAG, string);
}
}
需要注意:
(1)该文件的package声明应为:package com.android.server;
(2)该文件中添加语句:import android.app.IHelloWorld;
4、在目录frameworks/base/core/java/android/app/下添加文件:
HelloWorldManager.java:
package android.app;
import android.os.RemoteException;
public class HelloWorldManager
{
private static final String TAG = "HelloWorldManager";
private IHelloWorld mService = null;
HelloWorldManager(IHelloWorld service)
{
mService = service;
}
public void printHelloWorld()
{
try
{
mService.printHelloWorld();
}
catch(RemoteException e)
{
e.printStackTrace();
}
}
public void printString(String string)
{
try
{
mService.printString(string);
}
catch(RemoteException e)
{
e.printStackTrace();
}
}
}
需要注意:
(1)该文件的package声明应为:package android.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的添加方式:
public static final String ALARM_SERVICE = "alarm";
为Context 类添加成员变量:
public static final String HELLOWORLD_SERVICE = "helloworld";
7、修改frameworks/base/services/java/com/android/server/下的SystemServer.java文件:
参照AlarmManagerService的注册方式:
AlarmManagerService alarm = null;
Slog.i(TAG, "Alarm Manager");
alarm = new AlarmManagerService(context);
ServiceManager.addService(Context.ALARM_SERVICE, alarm);
将HelloWorldService注册到ServiceManager中:
HelloWorldService helloworld = null;
Slog.i(TAG, "HelloWorld Manager");
helloworld = new HelloWorldService(context);
ServiceManager.addService(Context.HELLOWORLD_SERVICE, helloworld);
8、修改frameworks/base/core/java/android/app/下的ContextImpl.java文件:
Android 4.0 ICS系统的注册方式:
参照ALARM_SERVICE的注册方式:
registerService(ALARM_SERVICE, new StaticServiceFetcher()
{
public Object createStaticService()
{
IBinder b = ServiceManager.getService(ALARM_SERVICE);
IAlarmManager service = IAlarmManager.Stub.asInterface(b);
return new AlarmManager(service);
}
}
);
注册HELLOWORLD_SERVICE:
registerService(HELLOWORLD_SERVICE, new StaticServiceFetcher()
{
public Object createStaticService()
{
IBinder b = ServiceManager.getService(HELLOWORLD_SERVICE);
IHelloWorld service = IHelloWorld.Stub.asInterface(b);
return new HelloWorldManager(service);
}
}
);
Android 2.3 gingerbread系统的注册方式:
参照ALARM_SERVICE的注册方式:
private static AlarmManager sAlarmManager;
private AlarmManager getAlarmManager()
{
synchronized (sSync)
{
if (sAlarmManager == null)
{
IBinder b = ServiceManager.getService(ALARM_SERVICE);
IAlarmManager service = IAlarmManager.Stub.asInterface(b);
sAlarmManager = new AlarmManager(service);
}
}
return sAlarmManager;
}
else if (ALARM_SERVICE.equals(name))
{
return getAlarmManager();
}
注册HELLOWORLD_SERVICE:
private static HelloWorldManager sHelloWorldManager;
private HelloWorldManager getHelloWorldManager()
{
synchronized (sSync)
{
if (sHelloWorldManager == null)
{
IBinder b = ServiceManager.getService(HELLOWORLD_SERVICE);
IHelloWorld service = IHelloWorld.Stub.asInterface(b);
sHelloWorldManager = new HelloWorldManager(service);
}
}
return sHelloWorldManager;
}
else if (HELLOWORLD_SERVICE.equals(name))
{
return getHelloWorldManager();
}
9、如果Service中不涉及到JNI操作,Application Framework Service HelloWorldService就添加完成,
然后就可以直接在 Application中像使用AlarmManager一样使用HelloWorldManager进行操作,
示例如下:
HelloWorldServiceTest.java
package com.android.example;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.app.HelloWorldManager;
import android.content.Context;
public class HelloWorldServiceTest extends Activity
{
private static final String TAG = "HelloWorldServiceTest";
private HelloWorldManager mHelloWorldManager = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mHelloWorldManager = (HelloWorldManager)getSystemService(Context.HELLOWORLD_SERVICE);
Log.d(TAG, "******************************");
mHelloWorldManager.printHelloWorld();
Log.d(TAG, "******************************");
mHelloWorldManager.printString("I succeed!");
Log.d(TAG, "******************************");
}
}
Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := HelloWorldServiceTest
include $(BUILD_PACKAGE)
程序执行结果如下图:

添加一个Application Framework Service的更多相关文章
- 如何创建一个AJAX-Enabled WCF Service
原创地址:http://www.cnblogs.com/jfzhu/p/4041638.html 转载请注明出处 前面的文章中介绍过<Step by Step 创建一个WCF Servi ...
- Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作
Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...
- Xcode7.2中如何添加一个Empty Application模板
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Xcode 6.0正式版之后已经没有所谓的Empty Appl ...
- OpenCASCADE Application Framework Data Framework Services
OpenCASCADE Application Framework Data Framework Services eryar@163.com 一.概述Overview OpenCASCADE的数据框 ...
- 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】
Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...
- 012.Adding a New Field --【添加一个新字段】
Adding a New Field 添加一个新字段 2016-10-14 3 分钟阅读时长 作者 By Rick Anderson In this section you'll use Entity ...
- 添加一个Android框架层的系统服务与实现服务的回调
2017-10-09 概述 所谓Android系统服务其本质就是一个通过AIDL跨进程通信的小Demo的延伸而已.按照 AIDL 跨进程通信的标准创建一套程序,将服务端通过系统进程来运行实现永驻内存, ...
- 译:3.消费一个RESTful Web Service
这节课我们根据官网教程学习如何去消费(调用)一个 RESTful Web Service . 原文链接 https://spring.io/guides/gs/consuming-rest/ 本指南将 ...
- Android Framework中的Application Framework层介绍
Android的四层架构相比大家都很清楚,老生常谈的说一下分别为:Linux2.6内核层,核心库层,应用框架层,应用层.我今天重点介绍一下应用框架层Framework,其实也是我自己的学习心得. Fr ...
随机推荐
- ESFramework ——可堪重任的网络通信框架
ESFramework是一套性能卓越.稳定可靠.强大易用的跨平台通信框架,支持应用服务器集群.其内置了消息的收发与自定义处理(支持同步/异步模型).消息广播.P2P通道.文件传送(支持断点续传).心跳 ...
- Java ZIP打包
File zipFile = IOUtil.createTempFile("zip"); ZipOutputStream zipout = new ZipOutputStream( ...
- VS2010编译以前版本工程时 ERROR CVT1100:duplicate resource,type:MANIFEST解决办法
1.将 Resource Files 里面的 *.exe.manifest 文件删除 2.右键选择 *.rc 文件,选择 view code,查找并删除所有引用 *.exe.manifest 文件的代 ...
- PHP ServerPush (推送) 技术
用来代替ajax的请求 转自:http://blog.163.com/bailin_li/blog/static/17449017920124811524364/ 需求: 我想做个会员站内通知的功能. ...
- 动态得到WCF的代理类并生成代码
Uri uri = new Uri("http://localhost:6580/Service1.svc?wsdl"); MetadataExchange ...
- sqlserver 经典入门基础书籍
1.SQLServer2005T-SQL数据库设计 作者:胡百敬等著 ISBN:10位[7121053632]13位[9787121053634] 出版社:电子工业出版社 出版日期:2008-1-1 ...
- hosts etc css-js
http://laod.cn http://tool.css-js.com/rgba.html
- Orace内置函数大全[转:http://www.cnblogs.com/lfx0692/articles/2395950.html]
NewProgramer Oracle SQL 内置函数大全(转) SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数;SQL> select ascii('A') A,a ...
- 第三十一节,time时间模块
模块简介 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...
- 利用朴素贝叶斯算法进行分类-Java代码实现
http://www.crocro.cn/post/286.html 利用朴素贝叶斯算法进行分类-Java代码实现 鳄鱼 3个月前 (12-14) 分类:机器学习 阅读(44) 评论(0) ...