Подтвердить что ты не робот

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

Я делаю приложение для 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/info/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();

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

4b9b3361

Ответ 1

Здесь - хорошее объяснение того, как потоки жизненного цикла приложения. 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() вызывается дважды или более раз.

Ответ 2

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

enter image description here

После этого статическая переменная будет 0, а ваше приложение снова проведет проверку безопасности. Что вам нужно сделать, это использовать переменную экземпляра, которую вы сохраняете в onSaveInstanceState и восстанавливать в onCreate. В случае, если приложение будет убито, вызывается onSaveInstanceState и вы сохраняете свое состояние Activity. Если пользователь вернется в приложение, вызывается 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");
        }
    }

}

Ответ 3

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

SingleTop

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

singleTask

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

SingleInstance

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

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

Ответ 4

Я не уверен, почему вы используете 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(); 
    }
}