即使屏幕关闭也开始活动

Posted

技术标签:

【中文标题】即使屏幕关闭也开始活动【英文标题】:Start activity even when screen is turned off 【发布时间】:2018-07-14 09:03:43 【问题描述】:

我正在尝试使用警报开始一项活动。 PendingIntent 启动接收器,接收器启动活动。我当前的问题是活动在后台开始,无法听到警报声。 Oreo 和较新的设备不推荐使用旧 SO 问题中的大多数标志。有没有人有好的方法来处理这个问题?

提前谢谢你

警报创建:

alarmManager.setExact(AlarmManager.RTC_WAKEUP, intervalFinished, pendingIntent)

接收者

class OnAlarmReceiver : BroadcastReceiver() 

    override fun onReceive(context: Context, intent: Intent) 
        val intent = Intent(context, AlarmActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

        context.startActivity(intent)
    

活动:

private var wake: PowerManager.WakeLock? = null

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
    wake = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK
            or PowerManager.ACQUIRE_CAUSES_WAKEUP, "App:wakeuptag")
    wake?.acquire(10*60*1000L /*10 minutes*/)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) 
        setShowWhenLocked(true)
        setTurnScreenOn(true)
     else 
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                or WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                or WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                or WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON)
    
    setContentView(R.layout.activity_layout)


override fun onPause() 
    super.onPause()
    if(wake != null && wake!!.isHeld)
        wake!!.release()
    

【问题讨论】:

为什么不直接从待处理的意图开始活动?并将其传递给广播接收器 【参考方案1】:

你应该在你的 androidManifest.xml 中有

<activity
    android:name=".AlarmActivity"
    android:showOnLockScreen="true"
    android:turnScreenOn="true"/>

以下检查也应该在 setContentView() 之后。由于在您添加标志时没有可以使用它们的视图。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) 
    setShowWhenLocked(true)
    setTurnScreenOn(true)
 else 
    window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
           or WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
           or WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
           or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
           or WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON)

【讨论】:

我不知道为什么我之前的尝试没有成功,但这是正确的解决方案。非常感谢! 此代码在 API 24 及更低版本大约 30 秒后触发 onStop,因此仅在 API 25 及更高版本上正常工作。 当锁屏有密码时,这不起作用。

以上是关于即使屏幕关闭也开始活动的主要内容,如果未能解决你的问题,请参考以下文章

活动开始但在屏幕关闭或锁定时不可见

即使在线程关闭后,活动线程计数也不会减少

即使在应用关闭时,共享首选项也会永久传递给另一个活动

如何检测Android中的用户不活动

即使屏幕在Android中被锁定,也会启动活动屏幕

防止在关闭屏幕时重新创建 Android 活动