android - Android:每次重启后如何重新启用无障碍服务?
问题描述
我们所说的设备是一个带有外部 USB 键盘的 Android 8 主机。好吧,我需要为这个键盘的功能键分配一些任务,例如启动某些应用程序。比如说,F4
可以启动媒体播放器、F5
导航应用等。Automate或AutoInput Tasker 插件都可以用于此目的,但所有此类应用程序都使用辅助功能服务与物理 HID 设备进行交互。
这里最大的问题是,这个特定的 Android 设备会在(热)重启时定期终止可访问性服务。尝试了一切,从禁用省电模式到将 Automate 等标记为设备管理应用程序,没有任何帮助。所以我已经辞职,现在我正在考虑另一种方法来重新启用适当的辅助功能服务,因为系统在重新启动后由于未知原因禁用了它。
如果设备已植根,我想有一种简单的方法可以通过 shell 命令或其他方式重新启动可访问性服务(只是猜测,我是 Android 的初学者)。但显然我想尽可能避免生根。理想的情况是在每次重新启动时(自动)启动一个 shell 命令/应用程序/前台服务/任何东西——这将具有足够的管理权限来重新启用系统在重新启动期间刚刚禁用的可访问性服务。当然,所有这些东西都不需要生根设备。但我不确定这是否可以在 Android 上完成(在 Windows 上,在系统帐户中运行的服务就足够了,但 Android 是另一回事)。
一个公平的解决方案可能是
- 根设备,
- 安装 shell 命令(应用程序、前台服务等),用于在每次重新启动后重新启动辅助功能服务,并且
- 取消设备根目录(以SuperSU为例)以保护用户并且不使保修失效。
有人能告诉我上述解决方案是否可以达到预期的效果吗?如果可以的话,我是否可以提供一些指导方针来做到这一点?
解决方案
为了达到您的目的,您应该使用BroadcastReceiver和jobIntentService
首先创建一个引导接收器
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
MyService.enqueueWork(context, new Intent());
}
}
}
将其添加到manifest
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
<service android:name=".MyService"
android:permission="android.permission.BIND_JOB_SERVICE"/>
现在你必须定义你的 jobIntent
public class MyService extends JobIntentService {
public static final int JOB_ID = 0x01;
public static void enqueueWork(Context context, Intent work) {
enqueueWork(context, MyService.class, JOB_ID, work);
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
// your code
}
}
就是这样。这将直接启动服务(在 pre-O 平台上运行时)或将其作为作业排入队列(在 O 和更高版本上运行时)。不管是什么平台,你在 enqueueWork 中传递的所有东西最终都会出现在 onHandleWork 中。
推荐阅读
- javascript - 如何在 Vue3 中为根组件提供道具
- swift - 可视化指针 - Swift 中的 LinkedList
- php - Laravel 本地化不显示文本
- python - virtualenvwrapper,来自 python 脚本的 add2virtualenv
- sql - Oracle order by query 使用 select case
- mysql - Sequelize 显示错误:位置 0 处 JSON 中的意外标记 u
- xdebug - Xdebug 在没有错误的情况下启动与客户端的连接
- json - 使用 JsonSerializer.Deserialize (.net core) 反序列化不带引号的属性名称的 json
- azure-devops - MSTest 多个框架目标 (net45;net5.0) - 无法从构建服务器上的 NET5.0 测试源加载类型
- html - 如果同级 div 元素单独存在,则 HTML div 元素不会分配新行