完成后活动屏幕仍在此处

时间:2018-07-12 08:27:01

标签: android android-activity

我有一个特殊的情况,当他启动打印机服务时,我需要向用户询问一些问题。 因此,从onStartPrinterDiscovery(即一项服务)开始,我将启动一个活动以显示对话框,并在完成操作后发送一个新的意图,该意图调用了finish()onDestoy()。 不幸的是,当我按下“应用程序历史记录”按钮时,我仍然在后面看到活动的屏幕: Activity'ss screen

您能告诉我为什么以及如何解决它吗?

androidManifest.xml:

    <activity
        android:name=".DialogActivity"
        android:noHistory="true"
        android:theme="@android:style/Theme.Dialog"
        android:launchMode="singleTop">
    </activity>

DialogActivity:

Class DialogActivity:Activity(){         var activity:Activity = this

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

        requestWindowFeature(Window.FEATURE_NO_TITLE)
        setContentView(R.layout.floatingactivity)
        setFinishOnTouchOutside(false)

        onNewIntent(intent)
    }

    override fun onDestroy() {
        super.onDestroy()
        isDisplayed = false
    }

    override fun onNewIntent(intent: Intent) {
        val extras = intent.extras
        val action = extras.getString("action")

        when (action) {
            "showDialog" -> {
                if (!isDisplayed) {
                    tvMessage.text = getString(R.string.ask_for_action)
                    isDisplayed = true
                }
            }
            "showErrorDialog" -> {
                if (!isDisplayed) {
                    tvMessage.text = getString(R.string.error_action)
                    isDisplayed = true
                }
            }
            "dismissDialog" -> { activity.finish() }
            else -> {}
        }

        if (isDisplayed) {
            btCancel.setOnClickListener {
                activity.finish()
            }
        }
    }

    companion object {
        var isDisplayed = false
    }
}

编辑,由于一个可能是解决方案的答案,我添加了当前创建Intent的方式:

    val intent = Intent(applicationContext, DialogActivity::class.java)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
    intent.putExtra("action","showDialog")
    startActivity(intent)

2 个答案:

答案 0 :(得分:0)

android:excludeFromRecents添加到您的活动属性中,如下所示:

<activity
    android:name=".DialogActivity"
    android:theme="@android:style/Theme.Dialog"
    android:excludeFromRecents="true"
    android:launchMode="singleTop">
</activity>

这来自android:excludeFromRecents的文档:

  

此活动启动的任务是否应该从最近使用的应用程序列表(概览屏幕)中排除。也就是说,当此活动是新任务的根活动时,此属性确定该任务是否不应出现在最新应用程序的列表中。如果任务应从列表中排除,则设置为“ true”;如果应将其设置为“ false”。默认值为“ false”。


android:noHistory="true"用于不同的目的。这来自android:noHistory的文档:

  

值“ true”表示该活动将不会留下历史痕迹。它不会保留在任务的活动堆栈中,因此用户将无法返回到该任务。在这种情况下,如果您为该活动的结果启动另一个活动,则永远不会调用onActivityResult()。

答案 1 :(得分:0)

尝试一下:-

    Intent i = new Intent(this,YourFirstActivity.Class);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    finish();

使用适用于> = API 16的finishAffinity()