[英]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.