Запустить приложение дважды для работы

Я делаю приложение для Android, которое проверяет, включены ли определенные функции безопасности на вашем телефоне. Например, если вы включили пароль, или ваши данные зашифрованы на вашем телефоне.

По какой-то причине приложение должно быть запущено дважды, чтобы проверить и посмотреть, включены ли эти функции безопасности на телефоне или нет, и это проблема, которую я пытаюсь решить. Я бы хотел, чтобы он тестировал и видел, включены ли функции безопасности при создании приложения и при первом запуске приложения, а не во второй раз.

Я проверяю, включены ли эти функции в onStart() в моем файле MainActivity . Я включил код функций ниже:

  @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 

Если для ответа на этот вопрос нужно отправить какой-либо еще код, просто дайте мне знать и спасибо за вашу помощь. Возможно, проблема связана с super.onStart();

Кто-нибудь думает, что экран загрузки всплеска может помочь решить проблему?

Solutions Collecting From Web of "Запустить приложение дважды для работы"

Вот хорошее объяснение того, как потоки жизненного цикла приложения. OnStart () может выполняться много раз. Вы можете следить за тем, сколько раз вы ввели этот метод и действовать по-разному:

  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 } } 

Чтобы более четко рассказать о жизненном цикле и почему ваш метод onStart () вызывается дважды, я предлагаю иметь счетчик и Log.i () в каждом важном состоянии цикла – по крайней мере, в onCreate () и onRestart ().

Имейте в виду, что приложение остается в памяти, когда вы нажимаете кнопку «Главная». Когда вы снова нажимаете значок приложения, он перезапускает уже запущенное приложение (вызовы onRestart (), а затем методы onStart () и не onCreate ()). Когда вы действительно убьете приложение для реального, тогда последовательность будет onCreate и onStart без onRestart. Наличие записей logcat действительно помогает вам понять поток жизненного цикла приложения и почему ваш onStart () вызывается дважды или более раз.

Использование статической переменной для проверки того, сколько раз было вызвано onStart, не является хорошей идеей, потому что приложение может быть убито, если Android требуется больше памяти для других приложений, но при этом позволяет пользователю вернуться к приложению. Это будет путь через красный квадрат на картинке ниже ( http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle ):

Введите описание изображения здесь

После этого статическая переменная будет 0, а ваше приложение снова проведет проверку безопасности. Что вам нужно сделать, это использовать переменную экземпляра, которую вы сохраняете в onSaveInstanceState и восстанавливать в onCreate. В случае, если приложение будет убито, вызывается onSaveInstanceState и вы сохраняете состояние своей активности. Если пользователь вернется в приложение, вызывается onCreate и состояние будет восстановлено. Это работает и во всех других случаях, когда приложение не убито, а пользователь просто переходит от приложения, а затем снова открывает его. Вот простой пример сохранения и восстановления приложения:

 public class MainActivity extends Activity { private boolean mSecurityCheckDone; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { mSecurityCheckDone = savedInstanceState.getBoolean("mSecurityCheckDone"); } } @Override protected void onStart() { super.onStart(); if (! mSecurityCheckDone) { // run the security check mSecurityCheckDone = true; } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean("mSecurityCheckDone", mSecurityCheckDone); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); if (savedInstanceState != null) { mSecurityCheckDone = savedInstanceState.getBoolean("mSecurityCheckDone"); } } } 

Как насчет использования флага?

SingleTop

Если экземпляр действия уже существует в верхней части целевой задачи, система перенаправляет намерение на этот экземпляр посредством вызова его метода onNewIntent (), а не создает новый экземпляр действия.

singleTask

Система создает активность в корне новой задачи и направляет на нее намерение. Однако, если экземпляр действия уже существует, система перенаправляет намерение на существующий экземпляр посредством вызова его метода onNewIntent (), а не создает новый.

SingleInstance

То же, что и «singleTask», за исключением того, что система не запускает никаких других действий в задачу, содержащую экземпляр. Деятельность всегда является единственным и единственным ее членом.

http://developer.android.com/guide/topics/manifest/activity-element.html

Я не уверен, почему вы используете onStart (), если вы хотите, чтобы он запускался при первом создании активности, я бы, скорее всего, использовал onCreate ().

В Android нет API, который расскажет вам, было ли приложение запущено хотя бы один раз, поэтому вам нужно будет использовать для этого какое-то постоянное хранилище, например SharedPreferences можно использовать для сохранения флага, который будет установлен в первый раз Приложение запускается, и после этого вы можете проверить его, как показано здесь .

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences settings = getSharedPreferences("Prefs", 0); if (settings.getBoolean("first_time", true)) { //the app is being launched for first time, do something Log.d("Comments", "First time"); // first time task // record the fact that the app has been started at least once settings.edit().putBoolean("first_time", false).commit(); } }