首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行两次App即可正常工作

运行两次App即可正常工作
EN

Stack Overflow用户
提问于 2014-06-05 03:40:18
回答 4查看 423关注 0票数 20

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

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

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

代码语言:javascript
复制
    @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();有关

有没有人认为闪屏加载可能有助于解决这个问题?

EN

回答 4

Stack Overflow用户

发布于 2015-05-03 10:06:01

Here很好地解释了应用程序生命周期是如何流动的。可以多次执行onStart()。你可以记下你输入这个方法的次数,并且每次都会有不同的表现:

代码语言:javascript
复制
 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() )。当你真的杀死你的应用程序时,序列将是没有onRestart的onCreate和onStart。拥有logcat记录可以帮助您理解应用程序的生命周期流程,以及onStart()被调用两次或更多次的原因。

票数 7
EN

Stack Overflow用户

发布于 2015-05-08 21:12:33

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

在此之后,静态变量将再次为0,并且您的应用程序将再次运行安全检查。您需要做的是使用一个实例变量,该变量在onSaveInstanceState中持久化并在onCreate中恢复。如果应用程序被终止,onSaveInstanceState将被调用,您将保存活动的状态。如果用户返回到应用程序,则会调用onCreate并恢复状态。这也适用于所有其他情况,当应用程序没有被终止,但用户只是导航离开应用程序,然后重新打开它。下面是一个保存和恢复应用的简单示例:

代码语言:javascript
复制
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");
        }
    }

}
票数 2
EN

Stack Overflow用户

发布于 2015-05-08 20:37:45

使用怎么样?

singleTop

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

singleTask

系统在新任务的根部创建活动,并将意图路由到该活动。但是,如果活动的实例已经存在,系统将通过调用其onNewIntent()方法将意图路由到现有实例,而不是创建新的实例。

singleInstance

与"singleTask“相同,不同之处在于系统不会在持有实例的任务中启动任何其他活动。活动始终是其任务的唯一成员。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24046132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档