2013-01-11 10 views
3

알아볼 수없는 응용 프로그램에 버그가 있습니다. HomeActivity - A, TestActivity - B 및 ResultActivity - C의 세 가지 활동이 있습니다.돌아가는 대신 뒤로 버튼이 작업을 다시 시작합니다.

활동 A

Intent intent = new Intent(this, TestActivity.class); 
startActivity(intent); 

이 그런 활동 B이 같은 방법으로 C 시작 정상적인 방법으로 B를 시작합니다. C이 완료되면 그것은 어떤 문제없이,이

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

이제 프로세스가 반복 될 수 무한히 같은 스택을 삭제 A로 돌아갑니다. 그러나 AAAB을 시작하는 데 사용하는 Aintent.putExtra("startTest", true);에 매개 변수를 보내 사용자가 C을 통해 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는 아니기 때문에 나는 정말로 잃어버린다. 검색은 정말 아무것도 나에게 가져다주지 않으므로 어떤 통찰력도 인정 될 것입니다. 여기에 편집

은 내가 생각하는이 같은 시도 활동

+0

세 가지 활동 모두에 대해 일부 코드 스 니펫을 게시 할 수 있습니까? –

+0

예, 특히 "사용자가 매개 변수를 A로 보내 A를 통해 C에서 B를 시작할 수있는 바로 가기"와 관련된 더 많은 코드를 게시하십시오. – Stan

+0

일부 코드가 추가되었습니다. ResultActivity의 doStartTest()에주의하십시오. – jurgemaister

답변

3

일반 시나리오를 작성한대로 복잡합니다. 그런 다음 문제가 위의 활동에 startActivityForResult()onActivityResult()필요한 플래그 약관를 사용하는 경우 절대 .. 발생하지

이유 :

당신이 B 활동의 통화에서 뒤로 버튼 누를 때 나는 의심의 여지가로 반복적으로 protected void onBackendStarted()HomeActivity 귀하의 활동 B가 계속 다시 시작됩니다.

업데이트 :

당신은 활동 B가 시작되면 의도에서 startTest를 제거해야합니다. 다음 번에 반복해서 시작하지 않습니다. 같은

뭔가 :

getIntent().removeExtra("startTest");onBackendStarted()합니다.

+0

B 액티비티에서 Back Button을 누를 때 HomeActivity의 protected void onBackendStarted()를 반복적으로 호출하면 액티비티 B가 다시 시작될 수 있습니다. – user370305

+0

실제로 작동했습니다. HomeActivity에서'getIntent(). removeExtra ("startTest");를'onBackendStarted()'에 추가함으로써 루프를 깨뜨렸다. 그에 따라 답변을 편집하면 받아 들일 것입니다. – jurgemaister

+0

@jurgemaister - 답변을 업데이트했습니다. – user370305

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(); 
    } 
+1

어떤 활동이 있습니까? 그리고'System.gc()'부분입니까? 'super.onBackPressed()'는 이미'finish()'를 호출하므로 파트가 필요하지 않습니다. – jurgemaister

관련 문제