[안드로이드] 스플래시(로딩) 화면 띄우기

안드로이드(android) 앱이 실행되면서 스플래시(splash, 로딩) 화면을 띄우는 소스입니다.

여러가지 방법이 있겠지만 제가 사용하는 방법은 아래와 같습니다.

AndroidManifest.xml

<!– 메인 액티비티 –>
<activity android:name=”MainActivity” android:label=”@string/app_name”>
        <intent-filter>
            <action android:name=”android.intent.action.MAIN” />
            <category android:name=”android.intent.category.LAUNCHER” />
        </intent-filter>
</activity>
       
<!– 스플래시(로딩) 액티비티 –>
<activity android:name=”SplashActivity“/>

MainActivity .java

public class MainActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        // 스플래시 화면 띄우기
        startActivity(new Intent(this, SplashActivity.class));

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        initialize();  // 시간이 걸리는 작업 처리
    }

    /**
     * 스플래시 표시하는 것과 초기화를 동시에 진행시키기 위하여 쓰레드 처리
     *
     */
    private void initialize()
    {
        InitializationRunnable init = new InitializationRunnable();
        new Thread(init).start();
    }

    /**
     * 초기화 작업 처리
     *
     */
    class InitializationRunnable implements Runnable
    {
        public void run()
        {
            // 여기서부터 초기화 작업 처리
            // do_something
        }
    }
}

SplashActivity.java

public class SplashActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);

        initialize();
    }

    private void initialize()
    {
        Handler handler =    new Handler()
                                     {
                                         @Override
                                         public void handleMessage(Message msg)
                                         {
                                             finish();    // 액티비티 종료
                                         }
                                     };

        handler.sendEmptyMessageDelayed(0, 3000);    // ms, 3초후 종료시킴
    }
}

* 화면을 가로/세로 모드로 전환할 경우 스플래쉬 액티비티가 보이는 문제가 발생할 경우 대처
– 여러가지 방법이 있겠지만 아래처럼 처리하면 됩니다.(2010/10/27 추가)

AndroidManifest.xml

<!– 메인 액티비티 –>
<activity android:name=”MainActivity” android:label=”@string/app_name” android:configChanges=”keyboardHidden|orientation”>
        <intent-filter>
            <action android:name=”android.intent.action.MAIN” />
            <category android:name=”android.intent.category.LAUNCHER” />
        </intent-filter>
</activity>

<!– 스플래시(로딩) 액티비티 –>
<activity android:name=”SplashActivity“/>

예제 다운로드:
1080351452.zip

This Post Has 49 Comments

  1. 화면 rotation시에 계속 스플래쉬 액티비티가 보이는 문제가 있네요..

    1. 본문에 처리 방안 관련하여 내용 추가하였습니다.
      고맙습니다.

  2. 큰 도움 됐습니다. FLAG를 이용해서 어찌할까 생각해봤는데 이 방법이 훨씬 간단하네요 ^^

    1. 도움이 되었다니 저도 기쁩니다^^

  3. 와우~^^ 감사합니다.
    막 어제밤에 삽질하고 있었는데.. 이런방법이 있군요^^
    감사합니다. ^^ 자주 놀러와야겟네여 ㅎㅎ

    1. 안드로이드 관련 팁은 달랑 이거 하나 밖에 없네요^^

  4. 시작부터 감이 좋습니다 ^^.. 착한 자료 감사합니다//

  5. 어떻게 하는지 잘모르겠어요 ㅠ 관련예제 하나 올려주시면 안될까여? ㅠㅠ 전체 소스로요

    1. 위에 있는 소스는 완전한 프로젝트 파일은 아니지만 필요한 부분은 다 나와 있습니다.
      이 소스와 관계없이 일단 액티비티 두 개 있는 앱을 하나 만들어 보시면 어떻게 적용해야 될지 감이 올거라 생각됩니다.

  6. 이렇게 하는거랑 로딩화면 부터 띄우고 x초시 이동시키는거랑 다른점이 있나요?;;

    1. 이렇게 하면 로딩 화면이 표시되는 동안에 특정 작업을 할 수 있습니다.
      예를 들면 로딩에 시간이 걸리는 작업이 있을 경우 스플래시 화면이 표시되는 동안에 처리하는 거죠..
      그리고, 또 다른 점은 시작 액티비티가 다르다는 것이죠..
      로딩 화면 후 이동시키는 방식은 이동된 액티비티에서 뒤로 가기 버튼을 누르면 로딩 화면으로 돌아오게 되겠죠.. 이런 현상을 방지하려면 또 뭔가 작업을 해줘야 되겠구요..

    2. 흠… 로딩화면부터 띄우는 거랑 같은 것 같은데..

      SplashActivity 먼저 띄우고 3초뒤 MainActivity를

      StartActivity 하면서 finish 하는 것과 동일해 보이네요 ^^;;

    3. 일반적으로 사용하는데는 크게 차이가 없습니다…
      편한 방법으로 사용하면 됩니다.
      말씀하신 방법으로 할 경우에는 MainActivity에서 어떤 작업을 시키고자 할 경우 앱 실행 후 3초 후부터 가능하겠죠..

  7. 로딩문제 때문에 다양한 방법을 써봤는데 이게 가장 깔끔하고 좋은것 같네요
    덕분에 한시름 덜게 된듯합니다. ㅎㅎ 유용한 정보 감사드립니다.

    1. 도움이 되었다니 저도 기쁩니다.
      ^_____________^

  8. 질문있습니다 이 방법처럼 해서 잘되는데 문제는 어플을 종료후 다시 에뮬레이터로 마우스 클릭으로 실행을하니
    Application is not installed on your phone 이렇게 뜨면서 실행이 안됩니다
    근데 또 에뮬 다시켜서 자동실행 되도록 나두면 또 실행은 되구요 왜이런 현상이 생기나요…해결방법좀 알려주세요 ㅠㅠ

    1. 구성하신 AndroidManifest.xml과 스플래시 화면 띄우는 부분의 소스를 올려주시면 확인해겠습니다.
      설치된 앱을 삭제한 후에 다시 테스트 해보아도 동일한 문제가 발생하는지요?

  9. Main.java 소스
    package kr.ac.ys;

    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.drawable.AnimationDrawable;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    public class Main extends Activity {
    AnimationDrawable frameAnimation;

    public void onWindowFocusChanged(boolean hasFocus) {
    if(hasFocus) frameAnimation.start();
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ImageView imgView = (ImageView) findViewById(R.id.animationImage);
    imgView.setVisibility(ImageView.VISIBLE);
    imgView.setBackgroundResource(R.anim.simple_animation);
    frameAnimation = (AnimationDrawable) imgView.getBackground();

    //frameAnimation.stop();

    Button b = (Button) findViewById(R.id.button3);
    Button e = (Button) findViewById(R.id.button2);
    Button f = (Button) findViewById(R.id.button1);
    Button g = (Button) findViewById(R.id.button4);
    Button h = (Button) findViewById(R.id.button5);

    e.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
    Intent intent = new Intent(Main.this, help.class);
    startActivity(intent);
    overridePendingTransition(R.anim.fade, R.anim.hold);
    finish();
    }
    });
    f.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
    Intent intent = new Intent(Main.this, DB1.class);
    startActivity(intent);
    overridePendingTransition(R.anim.fade, R.anim.hold);
    finish();
    }
    });
    g.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
    Intent intent = new Intent(Main.this, sang.class);
    startActivity(intent);
    overridePendingTransition(R.anim.fade, R.anim.hold);
    finish();
    }
    });

    b.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
    Intent intent = new Intent(Main.this, option.class);
    startActivity(intent);
    overridePendingTransition(R.anim.fade, R.anim.hold);
    finish();
    }
    });
    h.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
    finish();
    }
    });

    }

    }

    Main manifest 소스
    < ?xml version="1.0" encoding="utf-8"?>














    해결방법좀 부탁드려요 아! 앱을 삭제해봤늗네 그래도 똑같아요 ㅠㅠ

  10. 이건 spl.java 소스입니다

    package kr.ac.ys;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.Handler;

    public class spl extends Activity{
    public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.spll);
    Handler z = new Handler();
    z.postDelayed(new splashhandler(), 5000);

    }
    class splashhandler implements Runnable{
    public void run(){
    startActivity(
    new Intent(getApplication(),Main.class));
    spl.this.finish();
    }
    }
    }

    이건 Main.java 소스입니다
    package kr.ac.ys;

    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.drawable.AnimationDrawable;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    public class Main extends Activity {
    AnimationDrawable frameAnimation;

    public void onWindowFocusChanged(boolean hasFocus) {
    if(hasFocus) frameAnimation.start();
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ImageView imgView = (ImageView) findViewById(R.id.animationImage);
    imgView.setVisibility(ImageView.VISIBLE);
    imgView.setBackgroundResource(R.anim.simple_animation);
    frameAnimation = (AnimationDrawable) imgView.getBackground();

    //frameAnimation.stop();

    Button b = (Button) findViewById(R.id.button3);
    Button e = (Button) findViewById(R.id.button2);
    Button f = (Button) findViewById(R.id.button1);
    Button g = (Button) findViewById(R.id.button4);
    Button h = (Button) findViewById(R.id.button5);

    e.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
    Intent intent = new Intent(Main.this, help.class);
    startActivity(intent);
    overridePendingTransition(R.anim.fade, R.anim.hold);
    finish();
    }
    });
    f.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
    Intent intent = new Intent(Main.this, DB1.class);
    startActivity(intent);
    overridePendingTransition(R.anim.fade, R.anim.hold);
    finish();
    }
    });
    g.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
    Intent intent = new Intent(Main.this, sang.class);
    startActivity(intent);
    overridePendingTransition(R.anim.fade, R.anim.hold);
    finish();
    }
    });

    b.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
    Intent intent = new Intent(Main.this, option.class);
    startActivity(intent);
    overridePendingTransition(R.anim.fade, R.anim.hold);
    finish();
    }
    });
    h.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
    finish();
    }
    });

    }

    }

    Main manifest소스입니다
    < ?xml version="1.0" encoding="utf-8"?>














    해결방법좀 알려주세요 에뮬상에서 어플 지웠다가 다시해도 안되네요 ㅠㅠ

    1. 남겨주신 코드 상에는 별 문제가 없는 거 같습니다.
      spl 클래스만 있으면 실행에는 문제가 없어야 되는데요..
      저도 원인을 모르겠네요.

  11. 안드로이드 사진 하나로 움직이게 하고싶거든요
    하고싶은건 새(사진)가 왼쪽에서 오른쪽으로 계속 반복되며 움직이게 하고싶은데
    전혀 초보라 구현 방법을 모르겠네요…………ㅠㅠ

    1. 정확히 어떤 것을 원하시는지 모르겠네요..
      일반적으로 특정 객체를 움직일 때는 Animation을 이용하면 편리합니다.
      이동에는 TransitionAnimation 클래스를 이용하면 되겠네요.
      Animation으로 원하는 것이 안될 경우에는 Canvas에 직접 그려야 되겠죠..

  12. 텍스트입력 창을 띄워서 거기에 값을 넣으면 디비에 저장하고 싶은데
    텍스트 입력 창 띄우는 방법 좁 알려주세요!

    1. 간단한 입력 창은 AlertDialog에 EditText 하나 올리면 되구요.
      AlertDialog.Builder alert = new AlertDialog.Builder(context);
      alert.setView(editText);
      AlertDialog로 검색해보세요. 많이 나옵니다.

      좀 복잡하다면 그냥 Layout 구성해서 Activity 하나 만드는 게 좋겠죠..

  13. 시간걸리는 작업 처리하는 부분에서 오래걸리는 작업을 수행하면, 그 작업을 전부 수행할 때 까지 로딩화면을 안띄우다가, 다 끝나고 나서야 로딩화면을 띄우고, 3초 후에 메인화면을 띄우네요…. 또 화면을 돌리면 다시 로딩화면부터하구요.. 왜그런가요?

    1. 위에 설명을 수정하였습니다.
      초기화 작업을 위해서는 쓰레드처리를 해야 됩니다.
      처음 글 작성 시 이 부분을 언급하려다 귀찮아서 안했습니다.
      화면 돌리면 다시 로딩되는 부분은 글 마지막 부분의 AndroidManifest.xml 부분을 다시 확인해보세요.

      예제 프로젝트도 첨부하였습니다.

  14. 인트로띄우고나서 로그인띄우려고 합니다.
    handleMessage부분에 fisnish()하고 startActivity(로그인)했거든요.
    별 이상은 없는데, 인트로뜨고 로그인뜨기전에 바로 백버튼눌러서 종료했는데
    2초후에 로그인이 뜨네요. 이러면안될것같은데요.
    이처럼 액티비티들의 실행을 보통 어떻게 구현을 하나요?

    1. 인트로 액티비티에서 백버튼 누르는 것을 검사하여 무시하도록 하거나, 백버튼 눌렀을 경우 특정 변수 값을 설정하여 startActivity(로그인)이 호출되지 않도록 처리하면 될것 같습니다.

  15. 유용한글 감사합니다. 인토로가 1개가 아니고 2개인 경우에는 어떻게 하나요?
    지금 알려주신 방법은 인트로에서 메인화면으로 넘어가는 방법인데 제가 하고싶은 방법은 인트로1에서 인토로2로 넘어가고 다시 인트로2에서 메인으로 넘어가는걸 원하는데 어떻게하는게 좋을까요?

    1. SplashActivity.java의 handleMessage() 부분에서
      finish() 하기 전에 두 번째 인트로 액티비티를 띄우면 되겠죠..
      두 번째 인트로 액티비티는 첫 번째 인트로인 SplashActivity와 동일하게 하면 되겠죠..

  16. 블로그에 댓글 잘 안남기는데.. 너무나 깔끔한 자료에 감사한 마음 갖고 갑니다 ^^

    1. 예.. 고맙습니다^^

  17. 샘플소스 깔금하게 잘보고갑니다. 그런데 동영상파일로 로딩은 불가능 한건가요?

    1. 시도해보지는 않았지만 SplashActivity에 동영상 플레이어 구현하면 문제 없을 거 같은데요..

  18. 소스 그대로 사용했는데 처음 켜자마자 force close 뜨네요.
    nullpointerException이라는데 저같은분 안계신가요? 잘 안되서 힘드네요 ㅠ

    1. 프로젝트 클린한 다음에 다시 해보세요..
      아직까지 문제 있다는 얘기는 못 들어봤습니다.
      어느 라인에서 에러가 발생하는지 알려주시지 않아서.. 도움을 드릴 수가 없네요..

  19. 글 잘보았습니다! 몇가지 질문이 있습니다..
    스플래시엑티비티를 실행시킬때 쓰레드를 만들어서 다른 작업을 할 수 있다고 하셨는데
    그 작업을 어느 위치에 작성 해야 하는 건가요..?
    그리고 플래시파일로도 로딩화면을 할 수 있나요??

    1. 스플래시 액티비티 표시 중에 다른 작업을 처리하려면
      MainActivity .java의 아래 주석이 있는 부분에 코드를 작성하면 됩니다.

      // 여기서부터 초기화 작업 처리
      // do_something

      해당 부분이 쓰레드 처리되어 있으니 그냥 그 부분에 코드를 작성하면 됩니다. 주의하실 사항으로는 UI 관련 작업이면 핸들러 등을 사용하여 메인 쓰레드에서 동작되게 처리해야 됩니다.

      그리고, 로딩 화면에 플래시를 표시하는 것은 기본으로 안되는 것으로 알고 있습니다. 플래시 뷰어가 설치되지 않은 장치에서는 표시가 안되겠죠.

  20. 참고하여 작업을 쉽게 할 수 있었습니다.
    여기서 질문이 있는데요, 저렇게 처리 하면 즉 splash이미지가 로딩 되는 동안
    다른 스레드 작업으로 db파일을 불러오는 등 미리 준비 할 수 있다는 것인가요?
    이 db데이터로부터 UI작업까지 처리까지 가능한가요?

    1. 예.. 맞습니다.
      스플래시 화면이 표시되는 동안 InitializationRunnable에서 DB 로딩이나 UI 작업 등을 처리하면 됩니다.
      UI 업데이트 등의 작업의 경우 메인쓰레드에서 이루어져야 되니 runOnUiThread나 핸들러 등을 이용하면 됩니다.

  21. [2013년 6월 27일 9시 51분 32초 – SplashDemo] 장치 ‘에뮬레이터 5556에 SplashDemo.apk를 설치하지 못했습니다!
    [2013년 6월 27일 9시 51분 32초 – SplashDemo] (NULL)
    [2013년 6월 27일 9시 51분 32초 – SplashDemo]는 장치 ‘에뮬레이터 5556’에 SplashDemo.apk를 설치하지 못했습니다 : 장치를 찾을 수 없습니다
    [2013년 6월 27일 9시 51분 32초 – SplashDemo] com.android.ddmlib.InstallException : 장치를 찾을 수 없습니다
    [2013년 6월 27일 9시 51분 32초 – SplashDemo] 취소 시작!

    이렇게 에러가 뜹니다. 무슨말인지 모르겠어요 ~~ㅜ_ㅜ

    1. 에뮬레이터에 연결되지 않는 것 같습니다.
      안드로이드 SDK가 설치된 폴더의 하위 폴더인 platform-tools에 들어가서 아래 명령을 내린 후 해보세요.
      adb kill-server
      adb devices

  22. 질문 댓글 다신 분들께서 너무 쉽게 답을 찾으시려고 하는게 아닌가 생각되네요.
    Java/안드로이드 책이나 API 문서를 보시고 하나씩 해결하다가 정말 문제가 막막해야 물어보는게 맞지 않나 생각됩니다.

    1. 그러게요..
      그래도 여기 댓글 정도는 괜찮습니다.
      메일로 마켓에 올려진 앱의 소스를 요청하는 경우도 있어요..

  23. 안녕하세요. 소스 적용 중에 문제가 생겨서 질문드리는데

    class InitializationRunnable implements Runnable
    {
    public void run()
    {

    이 소스 안에

    private Bitmap LoadImage1(String $lot1)
    {
    InputStream inputStream = OpenHttpConnection1($lot1);
    Bitmap bm1 = BitmapFactory.decodeStream(inputStream);

    return bm1;
    }

    private InputStream OpenHttpConnection1(String $lot1)
    {
    InputStream stream1 = null;

    try
    {
    URL url1 = new URL($lot1);
    HttpURLConnection urlConnection = (HttpURLConnection) url1.openConnection();
    urlConnection.setRequestMethod(“GET”);
    urlConnection.connect();

    if(urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK)
    {
    stream1 = urlConnection.getInputStream();
    }
    }

    catch (MalformedURLException e)
    {
    e.printStackTrace();
    }

    catch (IOException e)
    {
    e.printStackTrace();
    }

    return stream1;
    }

    서버에서 사진을 가지고오는 이 소스를 적용시키고 싶은데 어떻게 해야되나요?

    1. 아래처럼 하면 되지 않을까 싶습니다.
      실제로 돌려본 코드는 아닙니다.

      class InitializationRunnable implements Runnable
      {
      public void run()
      {
      // 여기서부터 초기화 작업 처리
      // do_something

      final Bitmap bitmap = LoadImage1("https://isulnara.com/banner.gif");
      runOnUiThread(
      new Runnable()
      {
      @Override
      public void run()
      {
      ImageView ivPhoto = (ImageView)findViewById(R.id.ivPhoto);
      ivPhoto.setImageBitmap(bitmap);
      }
      }
      );
      }

      private Bitmap LoadImage1(String $lot1)
      {
      ...
      }

      private InputStream OpenHttpConnection1(String $lot1)
      {
      ...
      }

      }

  24. Very Good Idea.~~perfect…. Thank you..

  25. 스플래쉬 화면 전에 고객에게 권한에 대한 필수 권한 동의를 받고싶은데요 이미지에 권한 설명과 수락 거절 버튼이 있고 거절이 되면 앱이 꺼지고 수락을 하면 앱이 스플래쉬 하면으로 이동하도록 하고싶은데 ㅠ 혹시 조언을 얻을 수 있을까요?

    1. 위 예에서는 런처 액티비티로 MainActivity를 설정했는데요.
      필수 권한 동의를 받는 액티비티를 하나 만드시고, 그 액티비티를 런처 액티비티로 설정하세요.
      그리고, 거절 버튼 누르면 그냥 finish()하면 되고, 수락을 누르면 MainActivity를 띄우고 finish()하면 됩니다.

댓글 남기기

Close Menu
%d 블로거가 이것을 좋아합니다: