Android TileService 使用

Android TileService 使用,第1张

A TileService provides the user a tile that can be added to Quick Settings. Quick Settings is a space provided that allows the user to change settings and take quick actions without leaving the context of their current app.

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中添加代码:

五。测试代码


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11587216.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存