我的应用程序中有一个我无法弄清楚的错误。有三项活动: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);
现在这个过程可以无限重复,没有任何问题。但是,我有一个快捷方式,允许用户通过B
从C
开始A
向A
intent.putExtra("startTest", true);
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我真的迷失了。搜索hasen't真的没有给我任何东西,所以任何见解都会受到赞赏。
修改 以下是我认为活动的相关部分
答案 0 :(得分:3)
正如你做的正常情景复杂。如果您在活动中使用startActivityForResult()
和onActivityResult()
必要的标记和条件,那么上述问题永远不会发生..
<强>原因:强>
我怀疑当您按下B活动的后退按钮时,它会反复调用 HomeActivity protected void onBackendStarted()
并且您的活动B会继续重启..
<强>更新强>
一旦启动了活动B,您必须从Intent中删除 startTest 。所以下次它不会重复发射。
类似:
getIntent().removeExtra("startTest");
至onBackendStarted()
。
答案 1 :(得分:1)
试试这样..
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();
System.gc();
Intent I = new Intent(EditProfile.this, SettingActivity.class);
startActivity(I);
finish();
}