运行应用程序两次工作

时间:2014-06-04 19:40:18

标签: java android

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

有关

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

3 个答案:

答案 0 :(得分: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");
        }
    }

}

答案 1 :(得分:1)

如何使用旗帜?

  

<强> singleTop

     

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

     

singleTask

     

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

     

<强> singleInstance

     

与&#34; singleTask&#34;相同,除了系统没有启动任何其他   活动进入持有实例的任务。活动总是如此   其任务的唯一成员。

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

答案 2 :(得分:0)

我不确定你为什么要使用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(); 
    }
}