Android上的启动画面无法正常工作

Posted

技术标签:

【中文标题】Android上的启动画面无法正常工作【英文标题】:Splash Screen on Android not working 【发布时间】:2013-03-18 14:37:17 【问题描述】:

我正在开发一个 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_
              android:layout_>

    <ImageView android:src="@drawable/splash_es"
               android:layout_
               android:layout_
               />
</LinearLayout>

【问题讨论】:

如果文件在 onResume 中被激活,我认为你正在关闭你的活动 请在单独的类中创建异步任务,不要在同一个活动类中同步 删除您的XML 并发布您的AsyncTask 检查实际需要多长时间?如果你把finish();在我们的 intentAndFinish() 中的 startActivity(mainintent) 之后? @DavidOlsson 他的计算是使用 Date 类的时间进行所有比较,这不会花费足够长的时间对人眼可见..在低端手机中,时间甚至比启动所需的时间还要少应用 【参考方案1】:

你正在杀死你的飞溅,然后它出现在屏幕上。因为您在 onResume 方法中杀死了它。看这段文档:

活动的前台生存期发生在调用 onResume() 到相应调用 onPause() 之间。在此期间,活动位于所有其他活动之前并与用户交互。 Activity 经常会在恢复状态和暂停状态之间切换——例如,当设备进入睡眠状态、传递 Activity 结果时、传递新 Intent 时——因此这些方法中的代码应该是相当轻量级的。

你可以使用handler,它比Thread更优雅地解决这个问题,但主要思想与@sheetal相同。

关于 onCreate 方法:

 handler = new Handler();

关于 onResume 方法:

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

【讨论】:

谢谢@Bruno。您不仅提供了答案,还提供了有关活动生命周期的说明。【参考方案2】:

如果您的文件已更新您正在 onResume 中关闭您的活动并切换到主要活动,该过程将花费几毫秒的时间来执行此操作..所以很有可能您永远不会看到您的闪屏..如果您希望你可以使用

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

只是为了赶上你的闪屏。

查看@bruno 的帖子...我们应该使用处理程序

【讨论】:

不应在 ui 线程上使用 thread.sleep,因为这很可能会导致 ANR。 @DavidOlsson ohkk 但是他的代码很不错..他永远不会那样看到他的 SplashScreen..在简历中只有他在切换活动..Okk 比使用 Handler 可能是一个好方法 我不想让用户什么都不等。我的意思是在后台执行某些操作时显示启动画面。【参考方案3】:

你调用 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();


    

【讨论】:

以上是关于Android上的启动画面无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Android 启动画面不适用于 Cordova 5.0.0

Flutter PlayStore Distribution APK 无法正常工作,无法加载,卡在启动画面

加载phonegap网站后在android上隐藏启动画面

主窗口前的PyQt5启动画面[重复]

ios 9,白色启动画面而不是启动图像,以前工作正常,似乎没有任何改变导致它

PWA 不显示 IOS 启动画面