在Android中出现Splash屏幕之前的黑屏

我们知道,当应用程序做一些像从互联网上下载一些信息一样的长时间的过程,它可以显示一个启animation面,然后加载应用程序,当应用程序完全加载它将显示主页面。 在启动屏幕活动中,我们必须加载线程中的长进程,以避免在加载应用程序之前显示黑屏。 我已经完成了所有这些。 而且在显示应用程序之前出现黑屏。 这是我的闪屏活动的onCreate方法:

protected override void OnCreate (Bundle bundle) { try { base.OnCreate (bundle); //_dt = DateTime.Now.AddSeconds (_splashTime); SetContentView (Resource.Layout.Splash ); FirstLoadPB= FindViewById <ProgressBar >(Resource .Id.FirstLoadPB ); FirstLoadingInfo= FindViewById <TextView >(Resource .Id.FirstLoadInfo ); LoadApplication (); } catch (System.Exception ex) { Common.HandleException (ex); } } 

这是LoadApplication方法的代码:

 public void LoadApplication() { new System.Threading.Thread (new ThreadStart (() => { //Some Codes to load applications- Downloading from web and accessing the storage(Because was many codes - about 100 line- i was clear them. } ) ).Start (); } 

我不明白为什么黑屏出现,现在应该如何避免。 我有一些代码可以访问存储在我的应用程序类的oncreate。 也许这个问题的根源是从那里。因此,我分享了它的代码:

 public override void OnCreate () { try { base.OnCreate (); _typeOfShow = new MapViewType (); ListingTypes = new Dictionary<int,ListingTypeItem> (); OfflineMode =false; PropertyShowWasShown = false; MeasutingUnitsChanged =false; if(RplXmlSettings .Instance .getVal (AppConstants .XmlSettingShowOnCurrentLocationKey )== "True") typeOfShow .ShowOnCurrentLocation =true ; else typeOfShow .ShowOnCurrentLocation =false; //StorageClass .ctx = ApplicationContext ; FillDashboardOnResume =false; //initlize image loader ImageLoader = Com.Nostra13.Universalimageloader.Core.ImageLoader.Instance; Options = new DisplayImageOptions.Builder () .ShowImageForEmptyUri (Resource.Drawable.ic_tab_map) .CacheOnDisc () .CacheInMemory () .ImageScaleType (ImageScaleType.InSampleInt) .BitmapConfig (Bitmap.Config.Rgb565) .Displayer (new FadeInBitmapDisplayer (300)) .Build (); ImageLoaderConfiguration config; ImageLoaderConfiguration .Builder builder =new ImageLoaderConfiguration .Builder (ApplicationContext).ThreadPoolSize (3); if(RplXmlSettings .Instance .getVal (AppConstants .XmlSettingMemoryCacheKey )== "True") builder .ThreadPriority (4).MemoryCacheSize (1500000) ;// 1.5 Mb builder . DenyCacheImageMultipleSizesInMemory (). DiscCacheFileNameGenerator (new Md5FileNameGenerator ()). MemoryCache (new WeakMemoryCache()). DiscCacheSize (15000000); config = builder .Build (); ImageLoader.Init (config); } catch (Exception ex) { Common .HandleException (ex); } } 

好,长话短。现在的问题是这个 – 真的是什么是这个黑屏的根源。 这是从泼溅活动还是从应用程序类。 而我们如何解决它,避免forms显示呢?

在清单文件中添加一个带有背景的主题到应用程序标签,以防止黑屏被绘制。

theme.xml

 <resources> <!-- Base application theme is the default theme. --> <style name="Theme" parent="android:style/Theme" /> <style name="Theme.MyAppTheme" parent="Theme"> <item name="android:windowNoTitle">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowBackground">@drawable/my_app_background</item> </style> </resources> 

AndroidManifest.xml中

 .... <application android:name="@string/app_name" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.MyAppTheme" > .... 

阅读为什么这里有一个黑屏 在应用程序启动时,Android将显示一个简单的预览窗口(基于您的活动主题),作为对用户操作的即时响应。然后,预览窗口与您的实际UI交叉,一旦完全加载。为确保视觉平滑过渡,您的活动主题应尽可能与您的完整用户界面相匹配。下面的图片显示了如果处理不当,经验可能会如何震动。

您看到的这个初始屏幕称为“预览”屏幕。 你可以通过在主题中声明来完全禁用它:

 android:windowDisablePreview <style name="Theme.MyTheme" parent="android:style/Theme.Holo"> <!-- This disables the black preview screen --> <item name="android:windowDisablePreview">true</item> </style> 

如何处理这个屏幕的解释发布在这里: http : //cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous/

在你的AndroidManifest.xml添加这行到启动器活动:

android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen

如果在onCreate中调用一些“重码”,屏幕将显示为黑色,直到完成加载。 你可能会考虑使用AsyncTask,并使onCreate处理setContentView等,并使AsyncTask处理“沉重的代码”。

避免这个问题的更好的解决scheme是使用AsyncTask,下面是我在ListActivity中使用的示例代码:

  private class YoutubeTask extends AsyncTask<URL, Integer, String> { protected void onPreExecute() { super.onPreExecute(); mLoadingProgress.startAnimation(mDisappear); mLoadingProgress.setVisibility(View.GONE); showDialogProgress(); } protected String doInBackground(URL... url) { youtubeData = VersionParser.readFromUrl(url[0]);; try { JSONObject jsono = new JSONObject(youtubeData); JSONObject feed = jsono.getJSONObject("feed"); JSONArray entry = feed.getJSONArray("entry"); for(int i = 0 ; i < entry.length() ; i++ ){ JSONObject item = entry.getJSONObject(i); JSONArray AUTHOR = item.getJSONArray(TAG_AUTHOR); JSONObject Author = AUTHOR.getJSONObject(0); JSONObject author = Author.getJSONObject("name"); String author_name = author.getString(TAG_TITRE); JSONObject Statistics = item.getJSONObject("yt$statistics"); String Views = Statistics.getString(TAG_VIEWS); JSONObject Media = item.getJSONObject("media$group"); JSONObject MediaTitle = Media.getJSONObject("media$title"); String title = MediaTitle.getString(TAG_TITRE); JSONObject DURATION = Media.getJSONObject("yt$duration"); String duration = DURATION.getString(TAG_DURATION); JSONArray Thumbinail = Media.getJSONArray("media$thumbnail"); JSONObject IMAGE = Thumbinail.getJSONObject(0); String image = IMAGE.getString(TAG_CONTENT); String id = image.substring(22,33); map = new HashMap<String, String>(); map.put(TAG_TITRE , title ); map.put(TAG_ID , id ); map.put(TAG_DURATION , duration ); map.put(TAG_IMAGE , image); map.put(TAG_VIEWS , Views ); map.put(TAG_AUTHOR , author_name); CURRENCY.add(map); } } catch (JSONException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String result) { dismisDialogProgress(); mListView.setVisibility(View.VISIBLE); mListView.startAnimation(mAppear); mAdapter = new MAdapter(youtubeSearch.this , CURRENCY); mListView.setSelector(R.drawable.home_bg); mListView.setAdapter(mAdapter); } } 

并在onCreate Methode里面实现这个:

  @Override public void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT < 11) setTheme(android.R.style.Theme_Black_NoTitleBar); } super.onCreate(savedInstanceState); setContentView(R.layout.main); new YoutubeTask().execute(new URL("https://gdata.youtube.com/feeds/api/videos?q=Adele&max-results=15&v=2&alt=json")); } 

您可以通过将图像转换为画笔(颜色)来解决此错误。

像这样在可绘制文件夹中添加新文件xml(splash_bg.xml)文件。

 <?xml version="1.0" encoding="utf-8" ?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <color android:color="@color/splash_bg_color"/> </item> <item> <bitmap android:src="@drawable/splash_screen" android:tileMode="disabled" android:gravity="center"/> </item> </layer-list> 

现在添加一个新的样式,并应用splash_bg.xml作为背景颜色。

 <style name="Theme.SplashBg" parent="android:Theme"> <item name="android:windowBackground">@drawable/splash_bg</item> <item name="android:windowNoTitle">true</item> <item name="android:windowContentOverlay">@null</item> </style> 

将这个新的样式应用到主要的启动器活动或启animation面。

 [Activity(Label = "label", MainLauncher = true, Theme = "@style/Theme.SplashBg")] public class SplashScreenActivity : Activity 

这是一些思考的食物。 也许你的应用程序根本没有大的初始化延迟; 实际上,您可能正在等待即时运行服务

从我所经历的情况来看,这样做的症状是,你的应用程序在初始化的时候会显示一个冗长的黑屏,但是在debugging的时候,你发现你的Application / ActivityonCreate方法可见的时候还没有被调用