如何添加一个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的更多相关文章

  1. 如何创建一个AJAX-Enabled WCF Service

      原创地址:http://www.cnblogs.com/jfzhu/p/4041638.html 转载请注明出处   前面的文章中介绍过<Step by Step 创建一个WCF Servi ...

  2. Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作

    Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...

  3. Xcode7.2中如何添加一个Empty Application模板

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Xcode 6.0正式版之后已经没有所谓的Empty Appl ...

  4. OpenCASCADE Application Framework Data Framework Services

    OpenCASCADE Application Framework Data Framework Services eryar@163.com 一.概述Overview OpenCASCADE的数据框 ...

  5. 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. ...

  6. 012.Adding a New Field --【添加一个新字段】

    Adding a New Field 添加一个新字段 2016-10-14 3 分钟阅读时长 作者 By Rick Anderson In this section you'll use Entity ...

  7. 添加一个Android框架层的系统服务与实现服务的回调

    2017-10-09 概述 所谓Android系统服务其本质就是一个通过AIDL跨进程通信的小Demo的延伸而已.按照 AIDL 跨进程通信的标准创建一套程序,将服务端通过系统进程来运行实现永驻内存, ...

  8. 译:3.消费一个RESTful Web Service

    这节课我们根据官网教程学习如何去消费(调用)一个 RESTful Web Service . 原文链接 https://spring.io/guides/gs/consuming-rest/ 本指南将 ...

  9. Android Framework中的Application Framework层介绍

    Android的四层架构相比大家都很清楚,老生常谈的说一下分别为:Linux2.6内核层,核心库层,应用框架层,应用层.我今天重点介绍一下应用框架层Framework,其实也是我自己的学习心得. Fr ...

随机推荐

  1. 对低、高频系数直接重构upcoef2

    此函数可对原图低.高频系数(或处理后的系数)进行重构 clear all;close all;clc; I=imread('C:\Users\Jv\Desktop\wenli.jpg'); gray= ...

  2. MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化

    上篇文章中 我们已经创建了EF4.1基于code first的例子  有了数据库 并初始化了一些数据  今天这里写基础的增删改查和持久对象的生命周期变化 学习下原文先把运行好的原图贴来上~~ 一.创建 ...

  3. 关于jquery选择器中:first和:first-child和:first-of-type的区别及:nth-child()和:nth-of-type()的区别

    :first:选择第一个出现符合的元素 :first-child:选择限制条件中的第一个元素,并且必须和冒号前面的标签一致 :first-of-type:选择所有限制条件下的第一个冒号前面的标签元素, ...

  4. NOIP2014-普及组复赛-第一题-珠心算测验

    题目描述 Description 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术.珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及. 某学校的珠心算老师 ...

  5. UISwitch 开关控件

    UISwitch iOS中的开关控件,只有两种状态,打开或关闭. aSwitch.tintColor = [UIColor redColor]; //关闭状态下的渲染颜色 aSwitch.onTint ...

  6. UIScrollView 加载多个view view还可以交换顺序(2)

    在上的代码中 UIview都在一个页面 要是每一个view对应一个页面 操作每一个view代码都在viewcontroller里面就会很乱,那么我们就将view重新做一下 创建想要的页面继承与view ...

  7. 设计模式--静态工厂设计模式在android中的使用

    今天看到这篇文章:http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html public c ...

  8. shape的使用

    android在布局边缘位置处理圆角的两个办法: 1),一个是直接让美工切一张带有圆角的图片. 2),使用shape来解决. 第一种不在赘述,主要讲一下第二中方法来实现. 上边缘出现圆角,下边缘正常的 ...

  9. 如何在VS2013中显示代码行号

    http://jingyan.baidu.com/article/af9f5a2d2e193543140a4533.html

  10. 第十四章:使用CSS3进行增强

    1.为不支持某些属性的浏览器使用polyfill:如果想弥合较弱的浏览器和较强的浏览器之间的功能差异,可以使用polyfill(通常又称作垫片),通常用js实现.但是有些较弱的浏览器运行JS的速度要慢 ...