0

起動時に空白のデフォルト画面を持つアプリに取り組んでいます。スプラッシュ画面を表示したいのですが、バックグラウンドでメインアクティビティを開始します。メイン アクティビティの一部のプロセスが完了したら (たとえば、webview が読み込まれる)、スプラッシュ スクリーンを強制終了し、メイン アクティビティを表示します。

スプラッシュスクリーンを実装する方法を検索しましたが、すべての例は、数秒間遅延してからメインアクティビティを開始することです。それらはすべて帰結的です。

作成と構築が完了するまで、メインのアクティビティをバックグラウンドで開始したいと考えています。


私の状況は次のとおりです。

  1. 私の MainActivity は、actionbar と pagerAdapter を使用してタブ フラグメントを実装します。
  2. 各フラグメントには、json などを解析するいくつかの webviews と asynctasks があります。
  3. アプリを起動すると、最初に白い画面にタイトル バー (アプリ アイコンとアプリ名) が表示されます。数秒後、実際のアクティビティ (タブ付き) に変わります。
  4. だから、白い画面がデフォルトのロード画面だと思います。
  5. 私が欲しいのは、白い画面を全画面画像に置き換えることです。
4

4 に答える 4

1

次のようなアプリの要件に応じて、スプラッシュ スクリーンを使用できます。

1.データをダウンロードして保存する。2.jsonなどの解析

このためにメイン アクティビティをバックグラウンドで実行する場合は、AsyncTask または Service を使用する必要があります。

例えば

public class SplashScreen extends Activity {

String now_playing, earned;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    /**
     * Showing splashscreen while making network calls to download necessary
     * data before launching the app Will use AsyncTask to make http call
     */
    new PrefetchData().execute();

}

/**
 * Async Task to make http call
 */
private class PrefetchData extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // before making http calls        

    }

    @Override
    protected Void doInBackground(Void... arg0) {
        /*
         * Will make http call here This call will download required data
         * before launching the app
         * example:
         * 1. Downloading and storing in SQLite
         * 2. Downloading images
         * 3. Fetching and parsing the xml / json
         * 4. Sending device information to server
         * 5. etc.,
         */
        JsonParser jsonParser = new JsonParser();
        String json = jsonParser
                .getJSONFromUrl("http://api.androidhive.info/game/game_stats.json");

        Log.e("Response: ", "> " + json);

        if (json != null) {
            try {
                JSONObject jObj = new JSONObject(json)
                        .getJSONObject("game_stat");
                now_playing = jObj.getString("now_playing");
                earned = jObj.getString("earned");

                Log.e("JSON", "> " + now_playing + earned);

            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        // After completing http call
        // will close this activity and lauch main activity
        Intent i = new Intent(SplashScreen.this, MainActivity.class);//Here Main activity is the splash screen.
        i.putExtra("now_playing", now_playing);
        i.putExtra("earned", earned);
        startActivity(i);

        // close this activity
        finish();
    }

}

}

詳細については、スプラッシュ スクリーンサービス、およびAsyncTaskで asynctask を使用する例を参照してください。

私があなたの要件を理解していれば、スプラッシュ画面で asynctask を使用する例を一度見てください。

上記のコーディングのプロセス:

  1. onCreate setContentView(R.layout.activity_splash); スプラッシュ画面を呼び出し、PrefetchData()が呼び出されます。
  2. prefetch()では、asynctask がバックグラウンド操作を実行し、ここで json が指定された URL から解析されます。
  3. onPostExecute()でMainActivity が呼び出されます。onPostExecute() は AsyncTask で使用され、バックグラウンド処理が終了したことを示すため、上記の例では、finish() 関数はスプラッシュ スクリーンの表示を終了します。

お役に立てば幸いです。

于 2013-08-06T04:57:50.003 に答える
0

アクティビティは画面です。バックグラウンドでアクティビティを実行することはできません。代わりにサービスまたはAsyncTasksを使用してください。

私はゲームを開発していないので、スプラッシュ スクリーンの経験はあまりありませんが、スプラッシュ スクリーンよりもローディング スクリーンを探しているようです。ただし、私の推測では、AsyncTask を開始し、「進行状況」などの変数を指定して、数秒ごとにチェックするようにタイマーを設定できます。

SO で「Loading Screen」をすばやく検索すると、さらに多くの結果が得られます。

于 2013-08-06T04:45:55.533 に答える
0

ハンドラーを使用して UI を更新できます。次のサンプル コードを参照してください。

public class ThreadsLifecycleActivity extends Activity {
  // Static so that the thread access the latest attribute
  private static ProgressDialog dialog;
  private static Bitmap downloadBitmap;
  private static Handler handler;
  private ImageView imageView;
  private Thread downloadThread;


/** Called when the activity is first created. */


  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // Create a handler to update the UI
    handler = new Handler() {
      @Override
      public void handleMessage(Message msg) {
        imageView.setImageBitmap(downloadBitmap);
        dialog.dismiss();
      }

    };
    // get the latest imageView after restart of the application
    imageView = (ImageView) findViewById(R.id.imageView1);
    Context context = imageView.getContext();
    System.out.println(context);
    // Did we already download the image?
    if (downloadBitmap != null) {
      imageView.setImageBitmap(downloadBitmap);
    }
    // Check if the thread is already running
    downloadThread = (Thread) getLastNonConfigurationInstance();
    if (downloadThread != null && downloadThread.isAlive()) {
      dialog = ProgressDialog.show(this, "Download", "downloading");
    }
  }

  public void resetPicture(View view) {
    if (downloadBitmap != null) {
      downloadBitmap = null;
    }
    imageView.setImageResource(R.drawable.icon);
  }

  public void downloadPicture(View view) {
    dialog = ProgressDialog.show(this, "Download", "downloading");
    downloadThread = new MyThread();
    downloadThread.start();
  }

  // Save the thread
  @Override
  public Object onRetainNonConfigurationInstance() {
    return downloadThread;
  }

  // dismiss dialog if activity is destroyed
  @Override
  protected void onDestroy() {
    if (dialog != null && dialog.isShowing()) {
      dialog.dismiss();
      dialog = null;
    }
    super.onDestroy();
  }

  // Utiliy method to download image from the internet
  static private Bitmap downloadBitmap(String url) throws IOException {
    HttpUriRequest request = new HttpGet(url);
    HttpClient httpClient = new DefaultHttpClient();
    HttpResponse response = httpClient.execute(request);

    StatusLine statusLine = response.getStatusLine();
    int statusCode = statusLine.getStatusCode();
    if (statusCode == 200) {
      HttpEntity entity = response.getEntity();
      byte[] bytes = EntityUtils.toByteArray(entity);

      Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0,
          bytes.length);
      return bitmap;
    } else {
      throw new IOException("Download failed, HTTP response code "
          + statusCode + " - " + statusLine.getReasonPhrase());
    }
  }

  static public class MyThread extends Thread {
    @Override
    public void run() {
      try {
        // Simulate a slow network
        try {
          new Thread().sleep(5000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        downloadBitmap = downloadBitmap("http://www.devoxx.com/download/attachments/4751369/DV11");
        // Updates the user interface
        handler.sendEmptyMessage(0);
      } catch (IOException e) {
        e.printStackTrace();
      } finally {

      }
    }
  }

} 
于 2013-08-06T04:52:53.443 に答える
0

AsyncTaskクラスを使用します。次のようなメソッドをオーバーライドします-

onPreExecute(); //For loading splash screen
doInBackground();//For loading content-
onPostExecute();//for close splash screen & start new activty.
于 2013-08-06T04:47:16.760 に答える