Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 运行应用程序两次才能工作_Java_Android - Fatal编程技术网

Java 运行应用程序两次才能工作

Java 运行应用程序两次才能工作,java,android,Java,Android,我正在制作一个android应用程序,测试你手机上的某些安全功能是否已启用。例如,如果您已启用密码登录,或者您的数据已在手机上加密 出于某种原因,该应用程序必须运行两次,以测试手机上是否启用了这些安全功能,这就是我试图解决的问题。我想让它测试一下,看看在创建应用程序和第一次运行应用程序时,是否启用了安全功能,而不是在第二次运行应用程序时 我测试在我的main活动文件中的onStart()函数中是否启用了这些功能。我将函数代码包括在下面: @Override @TargetApi(

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

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

我测试在我的
main活动
文件中的
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()有关

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

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


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

使用flag怎么样?

单顶

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

单个任务

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

单实例

与“singleTask”相同,只是系统不启动任何其他任务 将活动添加到包含实例的任务中。活动总是很有趣 任务中唯一的一个成员


使用静态变量检查onStart被调用的次数不是一个好主意,因为如果Android需要更多内存用于其他应用程序,同时仍允许用户导航回该应用程序,则该应用程序可能会被终止。这将是通过下图()中红色框的路径:

在此之后,静态变量将再次为0,并且您的应用程序将再次运行安全检查。 您需要做的是在onSaveInstanceState中使用一个实例变量,并在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");
        }
    }

}

我不知道为什么要使用onStart(),如果希望在第一次创建活动时运行它,我可能会使用onCreate()来代替

Android中没有API会告诉您应用程序是否至少运行过一次,因此您需要使用某种类型的持久存储,例如,SharedReferences可用于持久化标志,该标志将在应用程序第一次运行时设置,然后您可以如图所示进行检查


如果应用程序被Android杀死,并且用户导航回应用程序,那么这将不起作用。您描述的是让应用程序第一次工作。这是正确的。但OP要求第二轮。如果你一直都立即关闭应用程序,那么就不会有第二次运行,这不是OP所要求的。谁说Android会在第一次运行后关闭它?这可以在任何时候发生,例如在第三次运行之后。您的代码将重新开始并确定它是第一次再次运行,这显然是错误的。
@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(); 
    }
}