多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Android DPMS学习之一——setLockTaskPackages

Android DPMS学习之一——setLockTaskPackages 今日工作中涉及到了对LockTask模式相关方法的答疑故此整理一个学习记录。void setLockTaskPackages (ComponentName admin, String[] packages)这个方法的根本目的是指定哪些应用程序包Package被允许进入锁定任务模式。一旦一个应用被设置为允许设备所有者或相关管理员就可以通过调用startLockTask()方法让该应用强制锁定在前台。在这种模式下用户无法退出这个应用系统的导航栏返回、主页、最近任务也会被屏蔽或受限直到应用调用stopLockTask()或被管理员清除。void setLockTaskFeatures (ComponentName admin, int flags)设置设备在锁定任务模式下运行时启用哪些系统特性。当锁定任务模式处于非活动状态时此方法不会影响功能。在调用此方法时未包含在标志中的任何系统特性都将隐式禁用。默认情况下只启用LOCK_TASK_FEATURE_GLOBAL_ACTIONS所有其他功能都被禁用。那么如上两个方法调用好之后应用就可以进入LockTask模式了吗显然No。上述两个方法只是完成了 LockTask 模式的“授权”和“功能配置”进入LockTask模式需要应用自行触发。void startLockTask()这是在Activity.java中的通用方法。调用这个方法后会发生什么完全取决于你的应用是否被设备管理员Device Owner / Profile Owner授权。若应用已被授权则当前任务会直接切换到锁定模式不会弹出任何用户确认对话框。并且setLockTaskFeatures配置的功能限制会立即生效。只有你的应用调用stopLockTask()或者由设备管理员清除允许列表并关闭相关任务才能退出。若应用未被授权则系统会弹出一个对话框请求用户确认是否固定此应用。用户可以通过长按“返回”和“概览”按钮或按系统提示操作来随时退出固定模式。应用本身调用stopLockTask()也会结束这个“屏幕固定”状态。然后衍生问题来了如果目标应用没有调用startLockTask能力或者期望在特定场景下被动、静默进入LockTask模式能实现吗答案当然是OK的啦。当A应用被激活为DeviceOwner应用后A应用便可以启动B应用进入LockTask模式。而在查阅setLockTaskFeatures方法参数定义时有如下发现// frameworks/base/core/java/android/app/admin/DevicePolicyManager.java public static final int LOCK_TASK_FEATURE_SYSTEM_INFO 1; public static final int LOCK_TASK_FEATURE_NOTIFICATIONS 1 1; public static final int LOCK_TASK_FEATURE_HOME 1 2; public static final int LOCK_TASK_FEATURE_OVERVIEW 1 3; public static final int LOCK_TASK_FEATURE_GLOBAL_ACTIONS 1 4; public static final int LOCK_TASK_FEATURE_KEYGUARD 1 5; public static final int LOCK_TASK_FEATURE_BLOCK_ACTIVITY_START_IN_TASK 1 6;上述代码中标志位按照 左移位运算符 格式表示有没有人像我一样起初并没有明白这么设计的原因为什么不用简单易懂的递增int数值表示呢其实1n 并不只是一个数值而是一个定义清晰的常量用来表示一个独立的、可组合的功能位。其次利用二进制位可以方便地进行与位运算。在 Android 源码里看到1n时本质上就是在说“请让我使用一个 int 整数的第 n 位来代表一个独立的开关。”例如int features 1 | 2 | 4;实际上是...00000001 | ...00000010 | ...00000100 ...00000111。系统通过检查与运算特定的位就能知道你同时开启了“显示状态栏信息”、“允许通知”和“允许返回桌面”这三个功能。而无法用 2、3、4、5、6 这些递增数字做“与”运算因为它们在二进制中会相互重叠你没办法区分“我单独开启了功能A”和“我同时开启了功能A和功能B”。那么在配置锁定时的功能时传入的features可以按如下方式设置int features DevicePolicyManager.LOCK_TASK_FEATURE_SYSTEM_INFO | DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS;至此暂梳理完结。下一篇再见
返回列表