2016-06-09 10 views
1

다른 활동을 호출 할 때 현재 활동에 저장 한 변수가 반환 될 때이를 확인할 수 있습니까? 위의 코드 활동 상태 저장 및 복원

new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapter, View item, int pos, long id) { 
     Intent i = new Intent(Activity1.this, Activity2.class); 
     i.putExtra("position", pos); // 1 
     position = pos; // 2 
     startActivityForResult(i, REQUEST_CODE); // brings up the edit item activity 
    } 
}); 

, I는 현재 활동 인스턴스 필드에 저장하여 (2)를 사용하거나, I (1)은 그 값을 복구 onActivityResult()getIntExtra()을 사용하여 값을 전달해야 하는가?

+1

'새로운 의도 (Activity1.this'는'새로운 의도 (item.getContext()' – petey

답변

1

Activity1에 상태를 저장하는 것이 가장 이상적입니다. 그렇게하면 Activity2을 통해 변수를 전달한 다음 Activity1에 결과 (정확하게는 Activity2에서 수행 된 결과가 아님)를 전달해야합니다. Activity1position의 값을 저장하려면, 당신은 당신의 Activity의 내부에서 다음을 수행해야합니다

private static final String KEY_ARG_POSITION = "KEY_ARG_POSITION"; 

    private int position; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Do whatever you are doing in onCreate already... 

     if (savedInstanceState != null) { 
      position = savedInstanceState.getInt(KEY_ARG_POSITION); 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     outState.putInt(KEY_ARG_POSITION, position); 
    } 

이것은 또한 관련 해당 값이 화면 방향 변경 또는 OS의 명을 처치 해 다시 시작을 잃고 싶지 않는 경우 당신의 활동.

마지막으로, 당신이 Activity2position의 값을 사용할 필요가없는 코드를 조직 유지를 위해, 나는 그것을 관리 할 필요가없는 데이터에 Activity2를 노출하지 않는 것이 좋습니다 것입니다.당신은 큰 응용 프로그램에서 작업하는 경우, 사물의 이러한 종류의 최대 추가하고 신속하게 지저분한 얻을 수 있습니다.

+0

내가 onSaveInstanceState()가'가의 일부가 아니지만'onRestoreInstanceState()'과 균형을 맞추도록 할 필요가'읽었 활동 수명주기 및 예를 들어'onPause()'도 호출하지 않습니다. – Laurent

+0

@JohnDifool을'onSaveInstanceState()'WI 활동이 죽으면 호출됩니다. 'onCreate()'는 Activity가 복원 될 때 호출됩니다. 액티비티가 복원되는 경우,'에서 onCreate'에서 savedInstanceState'()'당신이 그것에 저장된 모든 변수를 복원 할 수 있습니다 즉, 동일한 null이되지 않습니다. 나는 규칙없이이 패턴을 사용한다. 그것을 시험해 볼 기회를 얻었습니까? – jch000

0

startActivityForResult를 사용하면 ... onActivityResult 메소드에서 반환 될 요청 코드를 제공하고 있습니다. 거기에서 당신은 당신이 시작 활동에서 설정할 수있는 요청 코드뿐만 아니라 결과 코드 (성공, 실패, 등뿐만 아니라 의도 된 데이터를 얻을 것이다

을 그래서 당신이 할 수 있습니다.

Intent i = new Intent(Activity1.this, Activity2.class); 
i.putExtra("position", pos); 
startActivityForResult(i, REQUEST_CODE); 

다음 activity2에 클래스에

Intent intent = new Intent(); 
intent.putExtras(getIntent().getExtra("position")); 
setResult(RESULT_OK, intent); 
finish(); 

귀하의 첫 번째 활동에서 호출되는 :

onActivityResult(int requestCode, int resultCode, Intent data) { 
//Check it's your requestCode, 
//Check resultCode == RESULT_OK or whatever you need 
//Grab your position from the data intent 
} 

은 당신이 그렇게 필요가 getIntExtra를 사용하지하는 activity1에로 돌아 가면

+0

) 이것은 내가 다른 활동으로 전환 할 때마다 내가 할 수없는 모든 비 휘발성 필드를 저장해야한다는 것을 전제로합니다 원래 활동에서 다시 나는, 다시 호출 할 때 그것을 다시 전달 맞죠? – Laurent

0

내 충고 : 관심있는 데이터 항목을 고유하게 식별하기에 충분한 정보를 Intent에 전달하십시오. 항목의 순서가 변경되거나 다른 항목이 목록에서 추가/제거되는 경우 위치가 변경 될 수 있기 때문에 위치를 전달하지 마십시오. 위치 2를 Activity2으로 전달하는 시나리오를 생각해보십시오. 그러나 Activity2이 가동되는 동안 Activity1은 데이터를 다시로드하고 위치 2는 이제 다른 일부 항목이됩니다.

또한 호출하는 Activity의 인스턴스 멤버 (예 : position = pos 코드)에 의존하지 않습니다. Activity1은 다른 활동이 즉각적인 전경 활동 인 동안 살해 될 수 있습니다. 이 시나리오에서는 결과가 Activity1으로 반환 될 때 재생성되지만 Activity1의 새 ​​인스턴스가되므로 인스턴스 멤버 position에 이전에 설정 한 데이터가 없습니다.

+0

하지만 바로, 당신의 논리를 따른다면, 내가 직렬화하고 두 번째 활동 전체 배열을 전달해야? 저장하는 것이 합리적이다? – Laurent

+0

@ JohnDifool 당신이 항목에 자신을 식별하는 대신 무언가의 항목의 위치를 ​​필요합니까 왜. 무엇을하고 있는지 달려있다? – Karakuri