Android Activity doesn't seem do be destroyed after ondestroy

70 Views Asked by At

I'm doing an app that asks every 10 seconds what i'm doing and to do that i've made a "dialog activity" that creates a multiple choice, here is the code:


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

it's called by the 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()
    }
}

the problem is that even after i've selected what i was doing and that i've pressed OK the dialog disapears but it's still in the background as you can see in this image

[![enter image description here][1]][1]

and i can reopen it if i want to. So does someone know how to really kill it? (i've checked and ondestroy is called) (i use Miui 14.0.1 which is on android 12 i think) [1]: https://i.stack.imgur.com/OQkED.jpg

1

There are 1 best solutions below

0
Jakub Kalinowski On

You can fix this by adding

android:excludeFromRecents="true">

to DialogActivity section inside your AndroidManifest.xml