簡體   English   中英

Android上的啟動畫面無法正常工作

[英]Splash Screen on Android not working

我正在開發一款Android應用。 應用程序應在啟動時顯示啟動畫面,同時檢查文件是否已更新。 如果文件未更新,則會啟動異步任務以更新文件。 問題是,啟動畫面的圖像僅顯示文件實際需要更新的時間。 否則,執行檢查時會顯示黑屏。

我的SplashScreen活動:

    public class SplashActivity extends Activity
{
    private final static String placesFile = "places";
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_splash);
    }

    @Override
    protected void onResume()
    {
        super.onResume();

        if(!isFileUpdated()){
            new PlacesService(this).execute();
        }else{
            intentAndFinish();
        }

    }
    private void intentAndFinish() {
        finish();
        Intent mainIntent = new Intent(this, MainActivity.class);
        startActivity(mainIntent);  
    }

    /**
     * 
     * @return false if Places Data is too old
     */
    private boolean isFileUpdated() {
        int daysOld = 0;
        File f = new File(this.getFilesDir().getAbsolutePath() +"/"+placesFile);
        if(f.exists()){
            System.out.println("existe");
        }
        Date d = new Date();
        Date currentDate = new Date(System.currentTimeMillis());
        d.setTime(f.lastModified());
        if(currentDate.compareTo(d)>0)
            daysOld = determineDifferenceInDays(d, currentDate);
        return daysOld < Consts.PLACES_DAYS_OLD_QTY_PERMITTED?true:false;
    }
    private static int determineDifferenceInDays(Date date1, Date date2) {
        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(date1);
        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTime(date2);
        long diffInMillis = calendar2.getTimeInMillis() - calendar1.getTimeInMillis();
        return (int) (diffInMillis / (24* 1000 * 60 * 60));
    }

    public void onResultFromAsyncTask(boolean finished) {
        if(finished){
            intentAndFinish();
        }
    }
}

activity_splash.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">

    <ImageView android:src="@drawable/splash_es"
               android:layout_width="fill_parent"
               android:layout_height="fill_parent"
               />
</LinearLayout>

你在飛濺之前就殺了他的Splash。 因為你在onResume方法中殺了它。 看看這篇文檔:

活動的前景生命周期發生在對onResume()的調用之間,直到對onPause()的相應調用。 在此期間,活動位於所有其他活動之前並與用戶交互。 活動可以經常在恢復和暫停狀態之間進行 - 例如,當設備進入休眠狀態,交付活動結果時,何時傳遞新意圖 - 因此這些方法中的代碼應該相當輕量級。

你可以使用一個處理程序,它比Thread更優雅來解決這個問題,但主要的ideia與@sheetal相同。

on onCreate方法:

 handler = new Handler();

on onResume方法:

   handler.postDelayed(new Runnable() {
    public void run() {
      if(!isFileUpdated()){
        new PlacesService(this).execute();
      }else{
        intentAndFinish();
      }
    }
}, 1000);

如果您的文件已更新您正在關閉onResume中的活動並切換到主要活動,並且該過程將花費幾分之一毫秒才能完成。因此,您很可能永遠不會看到您的spash屏幕。如果您想要,可以采用

  private void intentAndFinish() {
     Thread.sleep(10000)
    finish();
    Intent mainIntent = new Intent(this, MainActivity.class);
    startActivity(mainIntent);  
}

只是為了趕上你的splashScreen。

看@bruno的帖子......我們應該使用一個處理程序

你調用isFileUpdated()需要時間把它放在后台你asyntask應該是這樣的

    public class PlacesService extends Asynctask<Void,Void,Void>{
    boolean flag=false
    public Void doInBackground(){
    flag=isFileUpdated()
    if (!flag){
    return
    }else {
    // Do your file update
    }
    return 

    }

public onPostExcecute(){
intentAndFinish();

}
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM