Run App Twice To Work
android, java
Solution
Here is good explanation how app lifecycle flows. onStart() can be executed many times. You can keep counter how many times you had entered this method and act differently on each time:
static int counter=0;
public void onStart()
{
counter++;
Log.i("MyApp", "onStart() run "+counter);
switch (counter){
case 1: break; // first run
case 2: break; // second run
default: break;// other runs
}
}
To be more clear about life cycle and why your onStart() method is called twice I suggest to have counter and Log.i() in each important state of the cycle - at least in onCreate() and onRestart().
Keep in mind that app stays in memory when you click Home button. When you click app icon again it restarts already running app (calls onRestart() and then onStart() methods and no onCreate() ). When you really kill you app for real then sequence would be onCreate and onStart without onRestart. Having logcat records really helps you to understand app lifecycle flow and why your onStart() is called twice or more times.
Problem
I'm making an android app that test if certain security features on your phone are enabled. For example, if you have password log in enabled or if your data is encrypted on your phone. For some reason, the app has to be run twice to test and see if these security features are enabled on the phone or not, and this is the problem I'm trying to solve. I'd like it to test and see if the security features are enabled when the app is created and the first time the app is run, not the second time it is run. I test if these features are enabled in the `onStart()` function in my `MainActivity` file. I included the functions code below: ``` @Override @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @SuppressLint("NewApi") public void onStart() { super.onStart(); //determine if phone uses lock pattern //It returns 1 if pattern lock enabled and 0 if pin/password password enabled ContentResolver cr = getBaseContext().getContentResolver(); lockPatternEnable = Settings.Secure.getInt(cr, Settings.Secure.LOCK_PATTERN_ENABLED, 0);//Settings.System //returns 1 if pin/password protected. 0 if not KeyguardManager keyguardManager = (KeyguardManager) getBaseContext().getSystemService(Context.KEYGUARD_SERVICE); if( keyguardManager.isKeyguardSecure()) { //it is pin or password protected pinPasswordEnable=1; } else { //it is not pin or password protected pinPasswordEnable=0; }//http://stackoverflow.com/questions/6588969/device-password-in-android-is-existing-or-not/18716253#18716253 //determine if adb is enabled. works adb=Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0); //determine if bluetooth is enabled.works bluetooth=Settings.Global.getInt(cr, Settings.Global.BLUETOOTH_ON, 0); //Settings.System BLUETOOTH_DISCOVERABILITY //determine if wifi is enabled. works WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); if (wifi.isWifiEnabled()) { //wifi is enabled wifiInt=1; } else wifiInt=0; //determine if data is encrypted getDeviceEncryptionencryption(); //determine if gps enabled }//end of onStart() function ``` If any more code needs to be posted to answer this question, just let me know, and thanks for your help. Maybe the issue has something to do with the `super.onStart();` Does anyone think that a splash loading screen might help solve the issue?