运行应用两次才能正常工作

2022-09-02 10:53:14

我正在制作一个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();

有没有人认为初始加载屏幕可能有助于解决问题?


答案 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,你的应用将再次运行安全检查。您需要做的是使用您保留在SaveInstanceState中的实例变量,并在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");
        }
    }

}

推荐