即使屏幕关闭也能启动活动

5
我正在尝试通过闹钟启动一个活动。PendingIntent启动一个接收器,接收器再启动活动。我目前遇到的问题是,活动在后台启动,无法听到闹钟声音。 大多数旧SO问题中的标志对于Oreo和更新的设备已经过时。有没有人有一个好的方法来处理这个问题?
提前感谢您。
闹钟创建:
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()
    }
}

为什么不直接从PendingIntent启动Activity并将其传递给BroadcastReceiver? - seyed Jafari
1个回答

10

你的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)
}

我不知道为什么之前的尝试没有成功,但这是正确的解决方案。非常感谢! - carvaq
1
该代码会在约30秒后触发onStop事件,仅适用于API 25及更高版本,对于API 24及以下版本可能存在问题。 - Jim Clermonts
1
当锁屏有密码时,这个功能无法使用。 - hasan_shaikh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接