我已经为展示器模式创建了一个单独的活动
主要思路是从其他活动中执行此任务,并始终将锁定任务保持在堆栈的根部
View.post(...)
和类似的神奇延迟对我不起作用
onResume()
方法并检查 isFinishing()
运行良好,但请注意清除任务标志
<style name="AppTheme.Transparent" parent="android:style/Theme.Translucent.NoTitleBar.Fullscreen">
<item name="android:colorPrimary">@color/colorPrimary</item>
<item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="android:colorAccent">@color/colorAccent</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
class LockActivity : Activity() {
private lateinit var adminManager: AdminManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
adminManager = AdminManager(applicationContext)
}
override fun onStart() {
super.onStart()
when (activityManager.lockTaskModeState) {
ActivityManager.LOCK_TASK_MODE_NONE -> {
if (true) {
if (adminManager.setKioskMode(true)) {
return
} else {
}
}
launchActivity()
finish()
}
ActivityManager.LOCK_TASK_MODE_LOCKED -> {
if (false) {
if (adminManager.setKioskMode(false)) {
stopLockTask()
launchActivity()
finish()
return
} else {
}
}
launchActivity()
}
else -> finishAffinity()
}
}
override fun onResume() {
super.onResume()
if (!isFinishing) {
if (activityManager.lockTaskModeState == ActivityManager.LOCK_TASK_MODE_NONE) {
startLockTask()
launchActivity()
}
}
}
private fun launchActivity() {
}
override fun onBackPressed() {}
}
class AdminManager(context: Context) {
private val adminComponent = ComponentName(context, AdminReceiver::class.java)
private val deviceManager = context.devicePolicyManager
private val packageName = context.packageName
@Suppress("unused")
val isAdmin: Boolean
get() = deviceManager.isAdminActive(adminComponent)
val isDeviceOwner: Boolean
get() = deviceManager.isDeviceOwnerApp(packageName)
fun setKioskMode(enable: Boolean): Boolean {
if (isDeviceOwner) {
setRestrictions(enable)
deviceManager.setKeyguardDisabled(adminComponent, enable)
setLockTask(enable)
return true
}
return false
}
private fun setRestrictions(enable: Boolean) {
arrayOf(
UserManager.DISALLOW_FACTORY_RESET,
UserManager.DISALLOW_SAFE_BOOT,
UserManager.DISALLOW_ADD_USER
).forEach {
if (enable) {
deviceManager.addUserRestriction(adminComponent, it)
} else {
deviceManager.clearUserRestriction(adminComponent, it)
}
}
}
private fun setLockTask(enable: Boolean) {
if (enable) {
deviceManager.setLockTaskPackages(adminComponent, arrayOf(packageName))
} else {
deviceManager.setLockTaskPackages(adminComponent, arrayOf())
}
}
}
ActivityManagerService
中使用mFocusedActivity
似乎意味着onWindowFocusChanged(true)
确实是正确的位置来执行此操作。免责声明:我尚未尝试使用任务锁定功能。 - j__mfinish()
调用中获取onStop()
之前退出。有了这个澄清,我无法想象一个更有序的重启过程。 - j__m