【问题标题】:Run App Twice To Work运行应用两次即可工作
【发布时间】:2014-06-04 19:40:18
【问题描述】:

我正在制作一个 android 应用程序,用于测试您手机上的某些安全功能是否已启用。例如,如果您启用了密码登录,或者您的数据在手机上已加密。

由于某种原因,该应用程序必须运行两次以测试手机是否启用了这些安全功能,这就是我要解决的问题。我希望它测试并查看在创建应用程序和第一次运行应用程序时是否启用了安全功能,而不是第二次运行它。

我测试我的MainActivity 文件中的onStart() 函数是否启用了这些功能。我在下面包含了函数代码:

    @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();

有关

是否有人认为启动加载屏幕可能有助于解决问题?

【问题讨论】:

    标签: java android


    【解决方案1】:

    Here 很好地解释了应用程序生命周期的流程。 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() 方法被调用两次,我建议在周期的每个重要状态中设置 counter 和 Log.i() - 至少在 onCreate() 和 onRestart() 中。

    请记住,当您单击主页按钮时,应用程序会保留在内存中。当您再次单击应用程序图标时,它会重新启动已经运行的应用程序(调用 onRestart() 和 onStart() 方法,而不是 onCreate() )。当你真正杀死你的应用程序时,序列将是 onCreate 和 onStart 而没有 onRestart。拥有 logcat 记录确实可以帮助您了解应用程序生命周期流程以及 onStart() 被调用两次或更多次的原因。

    【讨论】:

    • 如果应用被 Android 杀死并且用户导航回应用,这将不起作用
    • 您所描述的是让应用程序第一次工作。这是正确的。但 OP 要求进行第二次运行。当您一直立即杀死应用程序时,就没有第二次运行,这不是 OP 所要求的。
    • 谁说Android会在第一次运行后杀死它?这可以随时发生,例如第三次运行后。您的代码将重新开始并确定这是第一次运行,这显然是错误的。
    【解决方案2】:

    使用静态变量来检查 onStart 已被调用多少次并不是一个好主意,因为如果 Android 需要更多内存用于其他应用程序,但仍允许用户导航回该应用程序,则该应用程序可能会被终止。就是通过下图中红框的路径(http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle):

    此后静态变量将再次为 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】:

      用flag怎么样?

      单顶

      如果活动的实例已经存在于目标的顶部 任务,系统通过调用将意图路由到该实例 它的 onNewIntent() 方法,而不是创建一个新的实例 活动。

      单任务

      系统在新任务和路由的根目录创建活动 它的意图。但是,如果活动的一个实例已经 存在,系统通过 调用它的 onNewIntent() 方法,而不是创建一个新方法。

      singleInstance

      与“singleTask”相同,只是系统不启动任何其他任务 活动到持有该实例的任务中。活动总是 其任务中唯一且唯一的成员。

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

      【讨论】:

        【解决方案4】:

        我不确定你为什么使用 onStart(),如果你希望它在第一次创建活动时运行,我可能会使用 onCreate()。

        Android 中没有 API 可以告诉您应用程序是否至少运行过一次,因此您需要为此使用某种类型的持久性存储,例如SharedPreferences 可用于保存一个标志,该标志将在您的应用第一次运行时设置,之后您可以检查它,如 here 所示。

        @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(); 
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2015-04-25
          • 1970-01-01
          • 1970-01-01
          • 2018-05-07
          • 1970-01-01
          • 2021-04-14
          • 1970-01-01
          • 2014-05-01
          • 1970-01-01
          相关资源
          最近更新 更多