后退按钮重启活动而不是返回上一页。

3
我是一名有用的助手,可以翻译文本。
我的应用程序中出现了一个错误,我无法解决。有三个活动:HomeActivity - A,TestActivity - B 和 ResultActivity - C
活动 A 以正常方式启动 B
Intent intent = new Intent(this, TestActivity.class);
startActivity(intent);

然后活动 B 以相同的方式启动 C。当 C 完成时,它会像这样返回到 A 并清除堆栈。

Intent intent = new Intent(this, HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

现在这个过程可以无限重复,没有任何问题。然而,我有一个快捷方式,让用户通过向 A 发送参数 intent.putExtra("startTest", true);C 开始 B,然后 A 使用该参数启动 B。现在的情况是,如果我在活动 B 中按下返回按钮,活动会重新启动,而不是返回到 A
根据 adb shell dumpsys activity,活动堆栈似乎完全正常:
Activity stack:
* TaskRecord{408276f0 #60 A com.company.app}
clearOnBackground=false numActivities=3 rootWasReset=true
affinity=com.company.app
intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.company.app/.LoginActivity bnds=[120,241][240,391]}
realActivity=com.company.app/.LoginActivity
lastActiveTime=756688148 (inactive for 6s)
* Hist #12: HistoryRecord{40ab2248 com.company.app/.TestActivity}
    packageName=com.company.app processName=com.company.app
    launchedFromUid=10109 app=ProcessRecord{4089aed0 16527:com.company.app/10109}
    Intent { cmp=com.company.app/.TestActivity }
    frontOfTask=false task=TaskRecord{408276f0 #60 A com.company.app}
    taskAffinity=com.company.app
    realActivity=com.company.app/.TestActivity
    base=/data/app/com.company.app-1.apk/data/app/com.company.app-1.apk data=/data/data/com.company.app
    labelRes=0x0 icon=0x7f02000b theme=0x103000d
    stateNotNeeded=false componentSpecified=true isHomeActivity=false
    configuration={ scale=1.0 imsi=242/1 loc=nb_NO touch=3 keys=1/1/2 nav=1/1 orien=1 layout=34 uiMode=17 seq=22}
    launchFailed=false haveState=false icicle=null
    state=RESUMED stopped=false delayedResume=false finishing=false
    keysPaused=false inHistory=true launchMode=0
    fullscreen=true visible=true frozenBeforeDestroy=false thumbnailNeeded=false idle=true
    waitingVisible=false nowVisible=true
* Hist #11: HistoryRecord{40a548e8 com.company.app/.HomeActivity}
    packageName=com.company.app processName=com.company.app
    launchedFromUid=10109 app=ProcessRecord{4089aed0 16527:com.company.app/10109}
    Intent { flg=0x4000000 cmp=com.company.app/.HomeActivity }
    frontOfTask=false task=TaskRecord{408276f0 #60 A com.company.app}
    taskAffinity=com.company.app
    realActivity=com.company.app/.HomeActivity
    base=/data/app/com.company.app-1.apk/data/app/com.company.app-1.apk data=/data/data/com.company.app
    labelRes=0x0 icon=0x7f02000b theme=0x103000d
    stateNotNeeded=false componentSpecified=true isHomeActivity=false
    configuration={ scale=1.0 imsi=242/1 loc=nb_NO touch=3 keys=1/1/2 nav=1/1 orien=1 layout=34 uiMode=17 seq=22}
    launchFailed=false haveState=true icicle=Bundle[mParcelledData.dataSize=1192]
    state=STOPPED stopped=true delayedResume=false finishing=false
    keysPaused=false inHistory=true launchMode=0
    fullscreen=true visible=false frozenBeforeDestroy=false thumbnailNeeded=false idle=true

无论我按返回按钮多少次都没有关系。堆栈保持不变,活动B不断重启。
现在来到更奇怪的部分:如果我双击返回按钮,它确实会遍历回到堆栈,给我活动A。
我没有对返回按钮进行任何特殊处理,因为它在情况1中运行良好,但在情况2中不行,所以我真的迷失了。搜索并没有给我带来什么,所以任何见解都将不胜感激。
编辑 以下是我认为与活动相关的重要部分

你能发布一些包含所有三个Activity的代码片段吗? - Bhavesh Patadiya
是的,请发布更多代码,特别是与“通过向A发送参数,使用户可以从C启动B”的快捷方式实现相关的代码。 - Stan
添加了一些代码。请注意ResultActivity中的 doStartTest() - Jørgen R
2个回答

3

如果您在活动中使用了 startActivityForResult()onActivityResult() 并在这些活动中使用了必要的标志和条件,则可以避免出现上述问题。

原因:

当您从 B Activity 按下返回按钮时,会重复调用 protected void onBackendStarted() 方法,并且您的 Activity B 会不断重新启动。

更新:

一旦 Activity B 开始运行,您必须从 Intent 中删除 startTest。这样下次它就不会反复启动了。

类似于:

onBackendStarted() 中使用 getIntent().removeExtra("startTest");


当您从B Activity按下返回按钮时,它会重复调用HomeActivity的protected void onBackendStarted()方法,导致您的B Activity不断重新启动,这让我感到困惑。 - user370305
е¤ҒеӨҢдғ†пәЃењЁHomeActivityзљ„onBackendStarted()дё­еЉ е…Ө getIntent().removeExtra("startTest");еђҺпәЊе®ѓж€ђеЉџењ°ж‰“з өдғ†еңҒзҺҮ。如жһњж‚Ёз›ёеғ”ењ°зә–иң‘ж‚Ёзљ„з­”жҰ€пәЊж€‘дәљжҺӨеЏ—е®ѓ :) - Jørgen R

0

试试这样做...

@Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        super.onBackPressed();
        System.gc();
        Intent I = new Intent(EditProfile.this, SettingActivity.class);
        startActivity(I);
        finish();
    }

1
在哪个活动中?这是System.gc()的一部分吗?super.onBackPressed()已经调用了finish(),所以那部分不应该是必要的。 - Jørgen R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接