tileService Api 从Android N 开始提供,用来设置app快捷设置按钮。 如下图示:
这个服务不需要程序开启,系统默认能够识别,并调用,这是一个特殊的Service,在Android 7 加的,在低系统上,则不会触发添加这个 *** 作开关。
菜单栏中会自动添加此Tile,直接将 Tile 拖动到顶部设置栏中即可:
Google 原生系统手机是支持的,samsung OS 比较接近原生了,应该支持, MIUI 目前高版本OS也支持自定义快捷按钮,onePlus OS 也是支持的。
这是 android N 新功能Quick Settings Tile(快速设置图块), 理论上各大系统厂商应该是均支持此 api 的。
参考:
1、 撰写一个aidl文件,定义服务的接口,将在编译过程中通过aidl工具生成对应的java接口。一般系统服务的aidl文件都放在framework\base\core\java\android\os目录中。以我所写的IMyTool.aidl为例。在.aidl中定义自己需要加入的方法,编写规则和java接口差不多,这里不多说。
2、 将aidl文件名添加到frameworks\base\目录下的Android.mk编译脚本文件中。
如:
LOCAL_SRC_FILES += \
core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl\
…\
core/java/android/os/IMyTool.aidl\
…
IMyTool.aidl即我加进去的aidl文件,加入后才能在make过程中编译到,否则将在后面的SystemServer添加系统服务时会报错提示找不到对应类。
3、 编写真正工作的服务类,继承IMyTool.Stub类(AIDL文件名.Stub,aidl生成的接口中的内部类,是一个Binder)。
服务类一般都放在framework\base\services\java\com\android\server目录中。
例如:
public class MyToolService extends IMyTool.Stub {
实现IMyTool.aidl中定义的接口。
}
4、 将自定义服务注册到SystemServer,使得开机过程中被添加。
在framework\base\services\java\com\android\server目录中的SystemServer中启动服务代码处加入:
try {
Slog.i(TAG, "MyToolService")
ServiceManager.addService(Context.MY_TOOL_SERVICE,new MyToolService(context))// MyToolService构造函数自己定义,一般都会用到Context
} catch(Throwable e) {
Slog.e(TAG, "Failure startingMyToolService", e)
}
上面代码中Context.MY_TOOL_SERVICE是自己在Context类中定义的常量,也就是给服务定义的名字,使用常量方便获取服务,而不需要记住注册服务时用的名字,且想换名字时只需改一个常量的值。
说明:本次说的系统服务,是指捆绑在system_process进程中的服务。
仔细阅读源码可以发现,在frameworks/base/services/java/com/android/server/SystemServer.java中添加了很多服务,什么熵信息、电量、wife等等服务,这些服务启动都在launcher之前,一般要继承Binder或者继承一个AIDL。下面试着来添加一个简单系统服务
一。在frameworks/base/core/java/android/os/ 增加一个aidl文件,最后用aidl工具生产一个Java文件,这样可以方便后面:
然后在修改/frameworks/base/Android.mk,在LOCAL_SRC_FILES里添加一行:core/java/android/os/IYtTtsService.aidl \
不确定补充:把AIDL文件写在这个地方似乎可以避免加@hide
二 。在frameworks/base/services/java/com/android/server/ 新建要增加的service,继承上面aidl生产的java:
三。在frameworks/base/services/java/com/android/server/SystemServer.java, ServerThread中run()方法中增加代码:
5.在/frameworks/base/core/java/cn/youngtone/tts建一个YtTtsManager类,用于管理YtTtsService:
四。 在ContextImpl getSystemService中添加代码:
五。测试代码
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)