Reputation: 5462
We know that when the app do some long process like downloading some information from internet it could show a splash screen before loading the application and when the app is loaded completely it will display the main page. In splash screen activity we must load long processes in threads to avoid showing black screen before loading app. I had done all of them. but also the black screen appears before showing app. This is my onCreate method of the splash screen activity:
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);
}
}
and this is the code of LoadApplication
method:
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 ();
}
I don't understand why the black screen appears and how should to avoid from this now. I have some code that access to storage in oncreate of my application class. Maybe the issue's root cause be from there.There fore i shared its code:
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);
}
}
OK.Long story short.Now the question is this-- Really what is the root cause of this black screen. Is this from splash activity or from application class. And How we can solve it and avoid form showing this?
Upvotes: 33
Views: 41072
Reputation: 1
The white screen is a preview that displays as the application starts. All you need to do is disable it.
Step 1: Locate your themes.xml file, and open the file. The files should be located under the following directory: res\values\themes
Step 2: Add the line below with the the other "items" listed. It doesn't matter where, as long as it is placed within the and .
// true
Step 3(if applicable): Open the themes.xml(night) file and paste the same line into the same section.
Upvotes: 0
Reputation: 8112
For those using Splash Screen API (The ApI is available starting from Android 12 ) you can make use of installSplashScreen().setKeepOnScreenCondition {}
to fix this issue.
installSplashScreen()
creates a SplashScreen instance associated with the Activity.
Through setKeepOnScreenCondition{}
SplashScreen API provides a way to control the transition from SplashScreen to the next screen.
This is what docs say about setKeepOnScreenCondition()
Sets the condition to keep the splash screen visible. The splash will stay visible until the condition isn't met anymore. The condition is evaluated before each request to draw the application, so it needs to be fast to avoid blocking the UI.
Therefore, to fix the blank screen (Black or White depending on the Theme) you can set a simple condition to observe whether your app is ready to transition from SplashScreen to say, HomeScreen.
For instance, if you are loading data from a background process, you want splash to last a little bit longer and only transition to home screen when the data is ready for display.
You can use such a simple logic:
class MainActivity : ComponentActivity() {
//dynamic variable declared on MainActivity to easily hook-up with your Nav SetUp.
private var keepSplashScreen = true
//onCreate()
override fun onCreate() { ...
//from Splash API
installSplashScreen().setKeepOnScreenCondition {
keepSplashScreen
}
.... }
The keepSplashScreen
is a dynamic variable that can be modified to false
say, in the HomeScreen composable when the data has already been loaded in the background. i.e.
//Launched Effect to control splash screen
LaunchedEffect(key1 = data, block = {
//when diaries are not loading
if (data !is RequestState.Loading) {
//call a function on your Nav SetUp to capture when data is loaded state (keepSplashScreen is private)
keepSplashScreen = false
}
})
Be sure to handle a case when HomeScreen is not the initial screen invoked after SplashScreen.
Upvotes: 0
Reputation: 31
This happens only when you use an activity as a Splash screen, if your app does not do any background operation like calling a api and stuff like that then use @maulikparmar method for standard splash screen(google recommended Way). But for activity method I only wrote a annotation in My splash screen activity , this worked for me very well
@SuppressLint("CustomSplashScreen")
public class SplashScreen extends AppCompatActivity {}
and also do android:windowDisablePreview = true in your theme (style.xml) of splash screen activity.
<item name="android:windowDisablePreview">true</item>
Upvotes: 0
Reputation: 4262
Here's some food for thought; maybe you don't have a sizeable initialization delay in your application at all; you might in fact, be waiting for the instant run service.
From what I've experienced, the symptoms of this are that your application shows a lengthy black screen whilst initializing, but upon debugging you find that none of your Application
/Activity
's onCreate
methods have yet to even be called whilst it's visible.
Upvotes: 0
Reputation: 882
You can solve this bug by converting image as a brush(color).
Add new file xml(splash_bg.xml) file in the drawable folder, like this.
<?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>
Now add a new style, and apply splash_bg.xml as a background color.
<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>
Apply this new style to your main launcher activity or splash screen.
[Activity(Label = "label", MainLauncher = true, Theme = "@style/Theme.SplashBg")]
public class SplashScreenActivity : Activity
Upvotes: 2
Reputation: 21
the better solution to avoid this problem is using AsyncTask, here is a sample code that i use in one of my 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);
}
}
and inside the onCreate Methode implement this:
@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"));
}
Upvotes: 1
Reputation: 133
Add this line in your AndroidManifest.xml
to the Launcher Activity:
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen
Upvotes: 9
Reputation: 6492
Add a theme with the background you are using to your application tag in the manifest file to prevent the black screen to be drawn.
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"
>
....
Read why there is a black screen here
Upvotes: 69
Reputation: 2012
This initial screen that you see is called the "Preview" screen. You can disable this completely by declaring this in your theme:
android:windowDisablePreview
<style name="Theme.MyTheme" parent="android:style/Theme.Holo">
<!-- This disables the black preview screen -->
<item name="android:windowDisablePreview">true</item>
</style>
An explanation of how to handle this screen is posted here: http://cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous/
Upvotes: 52
Reputation: 508
If you call some "heavy code" in onCreate the screen will appear black until it is done loading. You might consider using AsyncTask and make the onCreate handle setContentView etc, and make the AsyncTask handle "the heavy code".
Upvotes: 2