Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓在“销毁后返回”按钮后防止意图恢复_Java_Android_Android Intent_Android Activity_Destroy - Fatal编程技术网

Java 安卓在“销毁后返回”按钮后防止意图恢复

Java 安卓在“销毁后返回”按钮后防止意图恢复,java,android,android-intent,android-activity,destroy,Java,Android,Android Intent,Android Activity,Destroy,我遇到了一个不愉快的问题,我不知道如何妥善解决 情景: MainActivity有一个handleIncomingIntent()方法 此方法解析传入意图(用于服务或广播接收器)中的额外内容,并基于意图数据打开子活动。 因此,当传入的意图具有类型A的数据时,它将启动Activity(ActivityA.class),如果是类型B,则启动Activity(ActivityB.class),如果没有数据,它将保留在MainActivity中 问题是当设备内存不足时,在ActivityA或Activi

我遇到了一个不愉快的问题,我不知道如何妥善解决

情景:

MainActivity有一个handleIncomingIntent()方法

此方法解析传入意图(用于服务或广播接收器)中的额外内容,并基于意图数据打开子活动。 因此,当传入的意图具有类型A的数据时,它将启动Activity(ActivityA.class),如果是类型B,则启动Activity(ActivityB.class),如果没有数据,它将保留在MainActivity中

问题是当设备内存不足时,在ActivityA或ActivityB中,MainActivity会被销毁

因此,当使用BackButton时,MainActivity将被还原,其传入的意图将以处理它之前的相同状态还原,尽管我正在执行handleIncomingIntent()方法末尾的incomingIntent.removeExtras(键)。所以结果是——它再次启动子活动,这是一个循环

我意识到我可以将一些ISContentConsumed标志存储到onDestroy()中的内存中,然后读取它restoreSavedState(),并使用它来消除意图,因为它已经被消耗了

我只是觉得一定有比我刚才描述的“绷带”更好的方法

亲切问候,, 帕维尔你说的是什么意思

问题是当设备内存不足时,MainActivity被破坏, 在活动A或活动B中时。 这是不清楚的,也不清楚

因此,当使用后退按钮时

我认为您正在谈论活动A或B上的后退按钮按下事件。如果是这种情况,我建议您在转到活动A或B后完成主要活动。然后在A/B活动中,您应该超越onBackPressed()方法,重新启动主活动并完成活动A/B


这样做可以从内存不足的情况下节省设备。顺便问一句,你们也在真实的设备上试用过吗?如果没有,请在真实设备上检查,并让我们知道。我希望它对您有用

如果停止的活动是由于系统约束而不是正常条件(用户按下后退键或活动本身完成)而被破坏的,则将调用saveInstanceState(Bundle savedInstanceState)上的方法。当用户导航回此类活动时,将调用onRestoreInstanceState(Bundle savedInstanceState),并将上一个保存的Bundle作为参数传递给onRestoreInstanceState()onCreate()


因此,如果
savedInstanceState!=null
您可以知道活动已重新创建。希望有帮助。

谢谢你的回复,是的。在实际设备上,有一个名为销毁非活动活动的开发人员选项。选中时,只要活动A/B完全覆盖我的主要活动,操作系统就会销毁后者。但正如您猜对的,当我单击A/B上的“后退”按钮时,将重新创建主视图。然而,打开的Main恢复到原始状态的意图,就好像这是第一次。我认为完成Main并从a/B重新创建它不是更好的模式,因为a/B可以由其他调用方打开,如C或D。。。因此,我最终会将调用方传递给child,并在“返回”按钮中管理所有类型的场景,而不是完成A/B并了解它的来源。也许有一种很好的方法可以阻止Android将意图重新创建为其不变的状态。我的工作很顺利,只是感觉不太对劲。我在intent中添加了一代时间戳millis,并将其保存到共享首选项中,以便稍后查看我是否使用了它,如果需要,则忽略它。我认为这是一种钻石问题:),但希望您能很快改进编码并满足自己。谢谢Terry,我今晚将尝试它,如果它起作用,我将进行投票。哇,太简单了。我没有想到这一点。谢谢你,特里。这是一个正确的答案answer@PavelKirillov)加油,玩得开心!