关闭 android 功能,例如 qs 磁贴、音量面板和导航

shutting down android functionality like qs tiles, volume panel and navigation's

我正在开发一款健康应用程序,可以让您的 phone 关闭一段时间(例如 30 分钟、1 小时、1.5 小时)

在此状态下,用户只能看到带有剩余时间的屏幕,而不能

类似于Oneplus的东西 Zen mode

我想到的事情

我该如何解决这个问题?有什么想法吗?

使应用程序成为 phone 的默认启动器是对您要实现的目标更实用的解决方案。我之前在一个 Flutter 应用程序中完成了此操作,该应用程序将安装在自助服务终端设备上以获取客户的订单并且运行良好。让它工作有点棘手,而且有很多事情要做。这是我当时所做的事情的清单:

  1. 使用 FLAG_SHOW_WHEN_LOCKED 标志到 window 绕过锁定屏幕。

  2. onResume 内部添加 FLAG_FULLSCREEN 标志以隐藏状态栏。

  3. 通过在 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>
    
  4. 监听 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()
      }
    }
    
  5. 我也在检查我的应用程序是否是默认启动器。

    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)
    }
    
  6. 并且您需要使用 MethodChannel 在 Flutter 和平台之间进行通信以启用和禁用强制模式并获取应用程序的状态。