2010-02-25 4 views
0

사용자가 '활동'을 선택할 때 표시되는 '정보'화면 (활동) 기본 활동에서 옵션 메뉴의 '정보'항목을 클릭하십시오. '정보'화면에는 '닫기'라는 버튼이 있습니다.하위 활동이 setResult() 및 finish()를 실행하더라도 기본 활동의 onActivityResult가 호출되지 않음

내가 원하는 동작은 사용자가 '닫기'버튼을 클릭하면 이전 활동 (정보 활동이 시작된 활동)으로 이동해야한다는 것입니다. 이를 위해 startActivityForResult();을 사용하여 주 활동 (TFT) 정보 활동 (TFTAbout)을 시작한 다음 에 setResult()finish()을 호출합니다. 그러면 '닫기'를 클릭하면 기본 활동에서 onActivityResult()이 호출됩니다.

'Close (닫기)'를 클릭하면 주 활동 (TFT)이 호출되지 않습니다.

로그에서 활동 TFTAbout은 setResult()finish()을 실행하는 것으로 보입니다. 그러나 바로이 시점에서 onDestroy는 주 활동을 위해 호출됩니다. 그래서, 내 생각 엔 돌아 오는 시작 활동이 없기 때문에 onActivityResult()이 호출되지 않습니다. 맞습니까?


(더 나은 readabiliy에 대한 타임 스탬프없이) 아래에 출력을 로그 캣를 참조하십시오

DEBUG/TFT(816): onOptionsItemSelected: 'About' item selected. 

INFO/ActivityManager(563): Starting activity: Intent { action=android.intent.action.GET_CONTENT type=text/plain comp={com.wirel.tft/com.wirel.tft.TFTAbout} } 

DEBUG/TFTAbout(816): onCreate: START 

DEBUG/TFTAbout(816): onCreate: END 

INFO/ActivityManager(563): Displayed activity com.wirel.tft/.TFTAbout: 3880 ms 

DEBUG/TFT(816): onDestroy: BEGIN 

DEBUG/TFT(816): onDestroy: END 

DEBUG/dalvikvm(606): GC freed 672 objects/36656 bytes in 90ms 

DEBUG/TFTAbout(816): onClick: 'Close' button pressed... Returning to calling activity. 

WARN/ActivityManager(563): Activity pause timeout for HistoryRecord{4370efe0 {com.wirel.tft/com.wirel.tft.TFTAbout}} 

WARN/ActivityManager(563): Activity destroy timeout for HistoryRecord{4370efe0 {com.wirel.tft/com.wirel.tft.TFTAbout}} 

DEBUG/TFTAbout(816): onClick: Activity is finishing? true 
런칭 활동의

코드 (TFT)의

@Override 
public boolean onOptionsItemSelected(MenuItem mi) 
{ 
    int item_id = mi.getItemId(); 
    switch (item_id) 
    { 
     case R.id.mi_about: 
     { 
      Log.d(LOG_TAG, "onOptionsItemSelected: 'About' selected."); 
      /* Start the activity to display the About page. */ 
      Intent i = new Intent(Intent.ACTION_GET_CONTENT, 
            TFTMetadata.ABOUT_TEXT_URI); 
      i.setType("text/plain"); 

      startActivityForResult(i, 0); 
      break; 
     } 
     .... 
} 


@Override 
    protected void onActivityResult 
     (int request_code, int result_code, Intent i) 
{ 
    Log.d(LOG_TAG, "onActivityResult: START."); 

    super.onActivityResult(request_code, result_code, i); 

    /* Use the request code to select between multiple child activities we may have started. Here there is only one thing we launch. */ 

    if (request_code == Activity.RESULT_FIRST_USER) 
    { 
     Log.d(LOG_TAG, "onActivityResult: 'About' activity has returned."); 
    } 
} 

코드 개시 활동 (TFTAbout) :

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    Log.d(LOG_TAG, "onCreate: START"); 

    super.onCreate(savedInstanceState); 

    /* Set what to do when the user presses a key but the key press is 
    not handled by the application. */ 
    setDefaultKeyMode(DEFAULT_KEYS_DISABLE); 

    /* Connect the appropriate resource to this activity. */ 
    setContentView(R.layout.about); 

    /* Define the click listener for the Close button. */ 
    Button b = (Button) findViewById(R.id.bt_close); 
    b.setOnClickListener(this);  
} 


public void onClick(View v) 
{ 
    Log.d(LOG_TAG, "onClick: 'Close' button pressed... Returning to calling activity."); 
    setResult(RESULT_OK, (new Intent()).setAction("About activity has finished!")); 

    finish(); 

    ComponentName cn = this.getCallingActivity(); 
    if (cn != null) 
    { 
     Log.d(LOG_TAG, "onClick: calling activity = " + cn.getClassName()); 
    } 
    Log.d(LOG_TAG, "onClick: Activity is finishing? " + String.valueOf(this.isFinishing())); 

    return; 
} 

제게 누군가 내 주요 활동이 왜 파괴되고 있는지, 그리고 제가하고있는 일이 올바른지 설명해주십시오.

+0

추가 활동을 대신 간단한 대화 상자로 바꾸기로했습니다. 이것은 새로운 활동을 다루지 않고도 제 목적을 완벽하게 지원합니다. 나는 이것을 처음 시도했을 것입니다. 어쨌든, 고마워, . 의견이 있으면 누구나 의견을 남기십시오. –

답변

관련 문제