Android Activity 在 ondestroy 后似乎并没有被销毁

问题描述 投票:0回答:1

我正在开发一个应用程序,每 10 秒询问一次我在做什么,为此我创建了一个创建多项选择的“对话活动”,代码如下:


import android.app.AlertDialog
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.work.OneTimeWorkRequest
import androidx.work.WorkManager
import java.util.concurrent.TimeUnit

class DialogActivity : AppCompatActivity() {
    override fun onStop() {
        super.onStop()
        Log.d("DialogActivity", "onStop")
        // Votre code personnalisé ici
    }
    override fun onDestroy() {
        super.onDestroy()
        Log.d("DialogActivity", "onDestroy")

    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val builder = AlertDialog.Builder(this)
        builder.setTitle("Que fais-tu ?")

        val items = arrayOf("Activité 1", "Activité 2", "Activité 3")
        val checkedItems = BooleanArray(items.size) { false }
        builder.setMultiChoiceItems(items, checkedItems) { _, which, isChecked ->
            checkedItems[which] = isChecked
        }

        builder.setPositiveButton("OK") { _, _ ->
            val selectedItems = items.filterIndexed { index, _ -> checkedItems[index] }
            Log.d("DialogActivity", "L'utilisateur a sélectionné : $selectedItems")
            //planNextWorker()
            finishAffinity()
        }

        builder.setNegativeButton("Annuler") { dialog, _ ->
            dialog.cancel()
            //planNextWorker()
            finishAffinity()
        }

        builder.setOnCancelListener {
            //planNextWorker()
            finishAffinity()
        }

        // Afficher le dialogue APRÈS avoir défini tous les écouteurs et les boutons.
        builder.show()
    }

    private fun planNextWorker() {
        val followUpRequest = OneTimeWorkRequest.Builder(UserActivityAskingWorker::class.java)
            .setInitialDelay(10, TimeUnit.SECONDS)
            .build()
        WorkManager.getInstance(this).enqueue(followUpRequest)
    }
}

它由 MainActivity 调用:

package com.treehousetutorial.controll_app_0_2

import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.work.OneTimeWorkRequest
import androidx.work.WorkManager
import androidx.work.Worker
import androidx.work.WorkerParameters
import com.treehousetutorial.controll_app_0_2.ui.theme.Controll_app_0_2Theme
import java.util.concurrent.TimeUnit

class MainActivity : ComponentActivity() {
    private val overlayPermissionLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
        // Gérez le résultat ici si nécessaire
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Demander la permission SYSTEM_ALERT_WINDOW
        if (!Settings.canDrawOverlays(this)) {
            val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:$packageName"))
            overlayPermissionLauncher.launch(intent)
        }

        setContent {
            Controll_app_0_2Theme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Greeting("Android")
                }
            }
        }

        // Commencer le Worker
        startOneTimeWork()
    }

    private fun startOneTimeWork() {
        val oneTimeRequest = OneTimeWorkRequest.Builder(UserActivityAskingWorker::class.java)
            .setInitialDelay(10, TimeUnit.SECONDS)
            .build()

        WorkManager.getInstance(this).enqueue(oneTimeRequest)
    }

    companion object {
        const val OVERLAY_PERMISSION_REQ_CODE = 1001
    }
}

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Text(
        text = "Hello $name!",
        modifier = modifier
    )
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    Controll_app_0_2Theme {
        Greeting("Android")
    }
}

class UserActivityAskingWorker(appContext: Context, workerParams: WorkerParameters): Worker(appContext, workerParams) {

    override fun doWork(): Result {
        val intent = Intent(applicationContext, DialogActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
        applicationContext.startActivity(intent)

        return Result.success()
    }
}

问题是,即使在我选择了我正在做的事情并按下“确定”之后,对话框也会消失,但它仍然在后台,正如您在此图中看到的那样

[![在此处输入图像描述][1]][1]

如果我愿意,我可以重新打开它。那么有人知道如何真正杀死它吗? (我已经检查过并调用了 ondestroy)(我使用 Miui 14.0.1,我认为它位于 android 12 上) [1]:https://i.stack.imgur.com/OQkED.jpg

android kotlin android-activity kill
1个回答
0
投票

您可以通过添加来解决此问题

android:excludeFromRecents="true">

AndroidManifest.xml 中的 DialogActivity 部分

© www.soinside.com 2019 - 2024. All rights reserved.