Android 12+ 中使用 WallpaperManager 的奇怪行为

Auc*_*Auc 7 android android-wallpaper wallpapermanager

这是最新版本 Android 中的 WallpaperManager 的错误吗?

设置壁纸时,会自动销毁并重新加载当前activity。

此行为似乎仅影响 Android 12 及更高版本。用 Kotlin 编写代码非常容易复制:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val randomResourceList = arrayListOf(R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4, R.drawable.image5)
    val randomValue = (0 until randomResourceList.size).random()
    val wallpaper = randomResourceList[randomValue]

    val bmp = BitmapFactory.decodeResource(resources, wallpaper)
    val wallpaperManager = WallpaperManager.getInstance(this)
    wallpaperManager.setBitmap(bmp, null, true)
}

override fun onDestroy() {
    super.onDestroy()
    Log.d("tag", "Destroyed.")
}
Run Code Online (Sandbox Code Playgroud)

添加一些图像(包括几张,因为如果壁纸图像与上一个相同,则不会设置壁纸,因此是随机的)

然后,您应该看到活动被销毁并在一个周期中重新加载。不会引发任何错误,并且壁纸实际上每次都会更改。

在我的特定情况下,在前台服务中的计时器上设置壁纸时,这会造成严重破坏。如果更换壁纸时用户恰好在屏幕上进行活动,则该活动将会被破坏。

Jas*_*hil 0

您可以使用onSaveInstanceState()onRestoreInstanceState()方法来执行此操作。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val randomResourceList = arrayListOf(R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4, R.drawable.image5)
    val randomValue = (0 until randomResourceList.size).random()
    val wallpaper = randomResourceList[randomValue]

    val bmp = BitmapFactory.decodeResource(resources, wallpaper)
    val wallpaperManager = WallpaperManager.getInstance(this)

    // Save the state of the activity.
    val savedState = saveState()

    // Set the wallpaper.
    wallpaperManager.setBitmap(bmp, null, true)

    // Restore the state of the activity.
    restoreState(savedState)
}

override fun onDestroy() {
    super.onDestroy()
    Log.d("tag", "Destroyed.")
}
Run Code Online (Sandbox Code Playgroud)