[android] Android SplashScreen

기본적으로 응용 프로그램 자체를 시작할 때 많은 데이터를 다운로드하여 ListActivity에 표시하는 응용 프로그램을 개발 중입니다. 내가 할 계획은 데이터가로드 될 때까지 스플래시 화면을 표시하는 것입니다.

지금까지 나의 모든 시도는 헛된 것이었다. anddev.org에서 언급 한 방법을 시도했지만 내 문제는 주요 활동이 시작되어야하지만 ListActivity를 채울 때까지 스플래시 화면이 표시되어야한다는 것입니다. 간단히 말해서 다음 단계를 거쳐야합니다.

  1. 내 주요 활동을 시작하십시오.
  2. 스플래시 화면을 표시합니다.
  3. 백그라운드에서 프로세스를 계속 실행하십시오.
  4. 처리가 완료되면 스플래시 화면을 종료하고 기본 목록을 표시합니다.

그것이 어떤 것인지 이해하기를 바랍니다 ….



답변

문제는 수행중인 모든 작업과 동일한 스레드에서 스플래시 화면 ( 내가 생각 하는 ProgressDialog 와 같은 일종의 대화 상자)을 실행하고있을 가능성이 큽니다 . 이렇게하면 스플래시 화면보기가 업데이트되지 않고 화면에 표시되지 않을 수도 있습니다. 시작 화면을 표시하고 AsyncTask 인스턴스를 시작하여 모든 데이터를 다운로드 한 다음 작업이 완료되면 시작 화면을 숨겨야합니다.

따라서 Activity의 onCreate () 메서드는 단순히 ProgressDialog를 만들고 표시합니다. 그런 다음 AsyncTask를 만들고 시작합니다. AsyncTask를 기본 Activity의 내부 클래스로 만들어서 Activity의 일부 변수에 다운로드 한 데이터를 저장하고 onPostExecute () 메서드에서 ProgressDialog를 닫을 수 있습니다.

코드를 보여주지 않고 더 이상 정교하게 만드는 방법을 모르기 때문에 여기에 있습니다.

public class MyActivity extends Activity {
    private ProgressDialog pd = null;
    private Object data = null;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Show the ProgressDialog on this thread
        this.pd = ProgressDialog.show(this, "Working..", "Downloading Data...", true, false);

        // Start a new thread that will download all the data
        new DownloadTask().execute("Any parameters my download task needs here");
    }

    private class DownloadTask extends AsyncTask<String, Void, Object> {
         protected Object doInBackground(String... args) {
             Log.i("MyApp", "Background thread starting");

             // This is where you would do all the work of downloading your data

             return "replace this with your data object";
         }

         protected void onPostExecute(Object result) {
             // Pass the result data back to the main activity
             MyActivity.this.data = result;

             if (MyActivity.this.pd != null) {
                 MyActivity.this.pd.dismiss();
             }
         }
    }
}

분명히 거기에 채워야 할 몇 가지 부분이 있지만이 코드가 실행되고 좋은 시작점을 제공해야합니다 (코드 오류가있는 경우 용서해주세요. 입력 할 때 Android SDK에 액세스 할 수 없습니다. 현재).

Android의 AsyncTasks 주제에 대한 더 많은 좋은 자료는 여기여기 에서 찾을 수 있습니다 .


답변

참고로 이것이 스플래시 화면을 만드는 가장 좋은 방법입니다.
http://android-developers.blogspot.de/2009/03/window-backgrounds-ui-speed.html

나는 이것을 안드로이드 문서에서 꽤 오랫동안 찾고 있었다. 검은 화면을 피하고 싶다면 windowBackground로 테마를 만들어야한다.

<resources>
    <style name="Theme.Shelves" parent="android:Theme">
        <item name="android:windowBackground">@drawable/background_shelf</item>
        <item name="android:windowNoTitle">true</item>
    </style>
</resources>

그리고이 테마를 주요 활동의 테마로 설정하십시오 … TADA, 처음부터 시작 화면.

채우기 위해 늘어나는 이미지뿐만 아니라 복잡한 배경을 원할 경우 Drawables를 사용할 수 있습니다. 다음은 로고를 검은 색 배경으로 중앙에 유지하는 레이어 목록의 예입니다.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:drawable="@color/black">
    </item>
    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/logo"
            android:tileMode="disabled" >
        </bitmap>
    </item>
</layer-list>


답변

스플래시 화면 예 :

public class MainActivity extends Activity {
    private ImageView splashImageView;
    boolean splashloading = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        splashImageView = new ImageView(this);
        splashImageView.setScaleType(ScaleType.FIT_XY);
        splashImageView.setImageResource(R.drawable.ic_launcher);
        setContentView(splashImageView);
        splashloading = true;
        Handler h = new Handler();
        h.postDelayed(new Runnable() {
            public void run() {
                splashloading = false;
                setContentView(R.layout.activity_main);
            }

        }, 3000);

    }

}


답변

  1. 내 주요 활동을 시작하십시오.
  2. 스플래시 화면을 표시합니다.
  3. 백그라운드에서 프로세스를 계속 실행하십시오.
  4. 처리가 완료되면 스플래시 화면을 종료하고 기본 목록을 표시합니다.

이런 식으로 시도했지만 문제는 다음과 같습니다. 스플래시 화면 활동을 시작하기 전에 주요 활동이 표시됩니다.

나는 이렇게 만들었다.

  1. 스플래시 화면 시작
  2. 프로세스가 완료되면 “주 활동”을 시작합니다.
  3. 뒤로 버튼을 처리하는 것을 잊지 마십시오. 앱을 닫아야합니다. 메인 활동에서 눌려 질 것입니다. 그렇지 않으면 스플래시 화면으로 돌아갑니다 (루프).

내 문제는 메뉴 버튼을 눌러 “스플래시 화면 활동의 메뉴 표시”를 비활성화하는 방법입니다.

편집하다:

표시 메뉴 비활성화 :

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // getMenuInflater().inflate(R.menu.activity_main, menu);
    return false;
}

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    // return super.onMenuItemSelected(featureId, item);
    return false;
}


답변