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();
'앱 만들기 > 안드로이드 study' 카테고리의 다른 글
안드로이드의 기술 # 기본 다이얼로그 (2) | 2020.09.23 |
---|---|
안드로이드의 기술 # String 리소스 String 형으로 저장하기 (2) | 2020.09.22 |
1인 개발자가 꼭 알아야할 안드로이드의 기술 #데이터 저장하기 (8) | 2020.09.15 |
안드로이드의 기술 # 버튼 이벤트 처리. (4) | 2020.09.11 |
안드로이드의 기술 #Fragment 백키 처리하기. (6) | 2020.09.08 |
댓글