앱 만들기/안드로이드

안드로이드의 기술 # 다른 Activity 변수,함수 호출하기.

나도 처음이야 2020. 9. 18.

1인 개발자가 꼭 알아야 할 다른 Activity 변수, 함수 호출하기 입니다.

여기서 다른 Activity 라 함은, 현재 Activity 혹은 현재 쓰레드 동작과 연관된 Activity 를 이야기 합니다.

하기 코드로 살펴보겠습니다.

1
2
3
4
5
6
7
8
9
// 재 시도 버튼
    public void onRetryButton(View view){
        //((GameMainActivity)GameMainActivity.context_main).retryGame();
        // finish();
 
         GameMainActivity test = new GameMainActivity();
         test.retryGame();
         finish();
    }
cs

 

필자는, 구현 한 앱 중 retry 기능이 필요했습니다.

이 retry 기능을 담고 있는 Activity 는 결과 액티비티로, 등록된 onRetryButton() 함수를 실행하게 되면

게임 진행을 담당하고 있던 GameMainActivity 로 백 이동을 하게 만들어 보려고 합니다.

액티비티 스택 구조상 GameMainActivity -> GameResultActivity 가 쌓여 있는 상태겠죠?

그런데, 저는 여기서 단지 finish() 로 GameMainActivity 로 돌아가는 것 이외에

게임 데이터를 초기화 하고 싶습니다.

그러기 위해서, GameMainActivity 의 retryGame() 이라는 retry 기능 함수를 호출하고 싶습니다.

바로 오늘 포스팅의 주제이죠.

그럼 어떻게 해야 할까요? 먼저 정답은 하기와 같습니다.

 

((GameMainActivity)GameMainActivity.context_main).retryGame();

 

위 코드를 호출시, 정상적으로 GameMainActivity의 retryGame() 함수를 호출할 수 있습니다.

즉, GameMainActivity 의 context 에 접근한 뒤 GameMainActivity 로 형변환을 해서 

해당 Activity 의 함수 및 변수를 호출할 수 있는 것입니다.

 

그렇다면, GameMainActivity 에서도 Context 를 설정하는 부분이 있어야 겠죠?

바로 이 코드입니다.

 

[ GameMainActivity .java ]

public static Context context_main;

protected void onCreate(Bundle savedInstanceState) {

     ...

    context_main = this;

}

 

위와 같이 context 변수를 static 변수로 만들어 두어서, 새롭게 객체 인스턴스를 통하지 않고도

해당 Activity 에 접근 하도록 만들어 둔 것입니다.

 

그럼, 여기서.... 잠깐.

그냥 인스턴스 객체를 만들어서 접근 해보면 어떨지 궁금합니다. 해보죠.

 

 GameMainActivity test = new GameMainActivity();

 test.retryGame();

 finish();

 

필자의 코드에서는 위 처럼 구현을 하면 바로 죽어버립니다.

왜냐면 retryGame() 이라는 함수 안에서는 이전 Activity 로 부터 받은 intent 값을 설정하는 부분이 있습니다.

즉, 새롭게 GameMainActivity 객체를 생성해서 접근을 하게되면, 하기 area 정보가 없기에

죽는 것입니다.

public void retryGame(){

// 게임정보 초기화
if(area.equals("NorthAmerica"))

time = 35;
else if(area.equals("SouthAmerica") || area.equals("Oceania") )

time = 20;

...

 

물론 테스트로 아무런 기능을 하지 않는 함수를 호출한다면 죽지는 않겠죠.

하지만, 신규 인스턴스 변수는 다른 쓰레드에서 동작을 합니다.

즉, 나를 호출해주었던 그 Activity 가 아니기에 내가 원하는 동작을 완벽히 해내기에 무리 수가 있죠.

그렇기때문에

나를 호출해준 나와 연관된 쓰레드에서 동작하던 액티비티의 변수 및 함수를 호출하기 위해서는

하기 방법을 사용해야 됩니다. 감사합니다.

 

((GameMainActivity)GameMainActivity.context_main).retryGame();

반응형

댓글