사실 로딩이 필요없는 부분인데, 그럴 듯한 연출을 위해 어플리케이션 처음 시작 시 로딩화면을 보여 준뒤 어떤 작업을 하고 싶습니다.
대충 A 라는 액티비티로 시작한다고하면
A-> B 에서 B를 4초간 보여준 뒤, A 에서 특정 조건에 따라 C로 바로 넘어가거나 , A의 나머지 부분을 실행합니다.
지금은 구현을
A 액티비티의 onCreate에 맨 처음에 startActivity(new Intent(Danger.this, splash.class)); 를 호출하고
splash 액티비티는
public class splash extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initialize();
}
private void initialize()
{
Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
finish();
}
};
handler.sendEmptyMessageDelayed(0, 3000);
}
}
이런 구성입니다.
난관에 봉착하였는데, 그것은 앞서 말한 특정 조건에 부합하지 않아 A의 액티비티를 수행하게 될 때는 3초간 잘 로딩을 하는데
C 로 넘어가는 케이스에는 이 splash 가 잘 작동하지 않더라구요... 게다가 더 큰 문제는
나중에 C 액티비티를 종료(finish()) 하고나서 A로 돌아가지 않고 바로 꺼지는 것을 원해서 A에서 C를 호출 할 때 finish()를 했는데 이렇게 하니까 제대로 종료가 되지 않고 C가 종료되면서 A로 돌아오고 다시 Splash 를 하게 되더라구요 .... 이런상황 어떻게 대처해야하나 감이 오질 않아 질문드립니다.
두번째 문제의 경우 해결 방법은 activity or package task(네이버에서 android launchmode로 검색해보세요~) 를 사용하시거나 액티비티 라이프 사이클을 이용해 startActivityForResult(스펠링 맞나 ㅡㅡ;;;) 를 사용하시거나 액티비티 관리자 클래스를 하나만들어 액티비티마다 boolean값을 주어져 관리 하는 방법이 있습니다만...
더 이상의 액티비티가 없다는 가정하에 가장 쉬운방법을 말씀드리면. a와 b에서 인텐트시 context를 넘겨주시고 c에서 모두 받습니다.
C에서 OnBackPressed() 를 오버라이드하시고 받아온 context를 그 안에다가
(Activity)context.finsih() // a에서받아온 context와 b에서 받아온 context 모두 이런식으로 종료
finsih() // c 자기 자신 종료..
위처럼 하시면됩니다..
하지만 위의 방법은 매우 비효율적이고 C를 보여줄 때 a와 b자체가 stack에서 사라지는게 좋기때문에 launchmode를 사용하시거나,
복잡한 액티비티 스택구조의 경우에는 manager class를 하나 따로 두어 static boolean으로 관리를 하시는걸 추천드립니다..




이러한 문제들이 자주 발생하기도 하고, 의외로 난해한 면이 있습니다. 어느분이 비슷한 문제에 댓글을 다시는 걸 봤는데.. 격하게 공감하는 문장 중 하나가
' 액티비티 라이프 사이클에 의존해서 여러층의 액티비티 스택을 관리하지 말아라!?' 라는 것이었습니다.
관련 게시글은 액티비티 생성주기 등등으로 게시판 검색해보시면 좀 나올 것 같구요.
본론으로 돌아가서 첫번째 문제같은 경우는 접근 방식을 좀 바꾸시면 쉽게 해결하실 수 있을 겁니다.
case 1 : A -> B(4초 로딩) -> A 나머지부분
case 2 : A -> B(4초 로딩) -> C
위를 원하시는 것 같은데..
case1의 경우 B(splash)의 경우 구현코드를 보면 3초 delaymessage를 통해서 handle받으면 바로 finsih()를 하여 A로 돌아가도록 구현되 있습니다.
이와 마찬가지로 case2의 경우도 특정 조건에 해당하면 finish()가아닌 C로 인텐트를 하도록 구현해야합니다.
A 에서 반드시 조건을 검색해야한다면.. 그 조건의 결과를 변수로 담아서 putExtra로 넘겨주시고
B의 public void handleMessage(Message msg) 안에서 인텐트로 넘어온 조건값을 get으로 받아 인텐트로 C로 가던지 finish로 A로 가던지 분기시켜야 합니다.