我有一个特殊的情况,当他启动打印机服务时,我需要向用户询问一些问题。
因此,从onStartPrinterDiscovery(即一项服务)开始,我将启动一个活动以显示对话框,并在完成操作后发送一个新的意图,该意图调用了finish()
和onDestoy()
。
不幸的是,当我按下“应用程序历史记录”按钮时,我仍然在后面看到活动的屏幕:
您能告诉我为什么以及如何解决它吗?
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)
答案 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()
。