关闭 android 功能,例如 qs 磁贴、音量面板和导航
shutting down android functionality like qs tiles, volume panel and navigation's
我正在开发一款健康应用程序,可以让您的 phone 关闭一段时间(例如 30 分钟、1 小时、1.5 小时)
在此状态下,用户只能看到带有剩余时间的屏幕,而不能
- 访问 QS 磁贴
- 访问音量面板
- 导航出 Activity
类似于Oneplus的东西
Zen mode
我想到的事情
正在终止 SystemUI 进程。(通过这样做 QS 和音量面板
很可能会得到处理,也许需要 root 权限?
SystemUI也会自动重启,相当固执)
动态地使应用程序成为启动器?(从技术上讲,您无法导航
从启动器中退出并在重新启动时你会回到它)
我该如何解决这个问题?有什么想法吗?
使应用程序成为 phone 的默认启动器是对您要实现的目标更实用的解决方案。我之前在一个 Flutter 应用程序中完成了此操作,该应用程序将安装在自助服务终端设备上以获取客户的订单并且运行良好。让它工作有点棘手,而且有很多事情要做。这是我当时所做的事情的清单:
使用 FLAG_SHOW_WHEN_LOCKED
标志到 window 绕过锁定屏幕。
在 onResume
内部添加 FLAG_FULLSCREEN
标志以隐藏状态栏。
通过在 AndroidManifest.xml
中添加 LAUNCHER
类别来制作您的 MainActivity
启动器。您还可以添加我使用的其他属性(如果您不知道它们应该做什么,请搜索它们)。
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:excludeFromRecents="true"
android:hardwareAccelerated="true"
android:launchMode="singleInstance"
android:showOnLockScreen="true"
android:showWhenLocked="true"
android:theme="@style/LaunchTheme"
android:turnScreenOn="true"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
监听 window 焦点在您的 MainActivity
中的变化,如果您的应用程序失去焦点,则将其置于最前面。
private fun moveToFront() {
val closeDialog = Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
sendBroadcast(closeDialog)
(activity.applicationContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager)
.moveTaskToFront(activity.taskId, ActivityManager.MOVE_TASK_WITH_HOME)
window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (!hasFocus) {
moveToFront()
}
}
我也在检查我的应用程序是否是默认启动器。
private fun isAppDefault(): Boolean {
val intent = Intent(Intent.ACTION_MAIN)
intent.addCategory(Intent.CATEGORY_HOME)
val res: ResolveInfo = packageManager.resolveActivity(intent, 0)
return res.activityInfo != null && (packageName
== res.activityInfo.packageName)
}
并且您需要使用 MethodChannel
在 Flutter 和平台之间进行通信以启用和禁用强制模式并获取应用程序的状态。
我正在开发一款健康应用程序,可以让您的 phone 关闭一段时间(例如 30 分钟、1 小时、1.5 小时)
在此状态下,用户只能看到带有剩余时间的屏幕,而不能
- 访问 QS 磁贴
- 访问音量面板
- 导航出 Activity
类似于Oneplus的东西 Zen mode
我想到的事情
正在终止 SystemUI 进程。(通过这样做 QS 和音量面板 很可能会得到处理,也许需要 root 权限? SystemUI也会自动重启,相当固执)
动态地使应用程序成为启动器?(从技术上讲,您无法导航 从启动器中退出并在重新启动时你会回到它)
我该如何解决这个问题?有什么想法吗?
使应用程序成为 phone 的默认启动器是对您要实现的目标更实用的解决方案。我之前在一个 Flutter 应用程序中完成了此操作,该应用程序将安装在自助服务终端设备上以获取客户的订单并且运行良好。让它工作有点棘手,而且有很多事情要做。这是我当时所做的事情的清单:
使用
FLAG_SHOW_WHEN_LOCKED
标志到 window 绕过锁定屏幕。在
onResume
内部添加FLAG_FULLSCREEN
标志以隐藏状态栏。通过在
AndroidManifest.xml
中添加LAUNCHER
类别来制作您的MainActivity
启动器。您还可以添加我使用的其他属性(如果您不知道它们应该做什么,请搜索它们)。<activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:excludeFromRecents="true" android:hardwareAccelerated="true" android:launchMode="singleInstance" android:showOnLockScreen="true" android:showWhenLocked="true" android:theme="@style/LaunchTheme" android:turnScreenOn="true" android:windowSoftInputMode="adjustResize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
监听 window 焦点在您的
MainActivity
中的变化,如果您的应用程序失去焦点,则将其置于最前面。private fun moveToFront() { val closeDialog = Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS) sendBroadcast(closeDialog) (activity.applicationContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager) .moveTaskToFront(activity.taskId, ActivityManager.MOVE_TASK_WITH_HOME) window.setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) if (!hasFocus) { moveToFront() } }
我也在检查我的应用程序是否是默认启动器。
private fun isAppDefault(): Boolean { val intent = Intent(Intent.ACTION_MAIN) intent.addCategory(Intent.CATEGORY_HOME) val res: ResolveInfo = packageManager.resolveActivity(intent, 0) return res.activityInfo != null && (packageName == res.activityInfo.packageName) }
并且您需要使用
MethodChannel
在 Flutter 和平台之间进行通信以启用和禁用强制模式并获取应用程序的状态。