Run App Twice To Work

前端 未结 4 1107

I\'m making an android app that test if certain security features on your phone are enabled. For example, if you have password log in enabled or if your data is encrypted on you

相关标签:
4条回答
  • 2021-02-05 08:05

    I'm not sure why you are using onStart(), if you want it to be run the first time the activity is created I would probably use onCreate() instead.

    There is no API in Android that will tell you if the app has been run at least once so you will need to use some type of persistent storage for that, e.g. SharedPreferences could be used to persist a flag that would be set the first time your app is run and thereafter you can check it as shown 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(); 
        }
    }
    
    0 讨论(0)
  • how about using flag ?

    singleTop

    If an instance of the activity already exists at the top of the target task, the system routes the intent to that instance through a call to its onNewIntent() method, rather than creating a new instance of the activity.

    singleTask

    The system creates the activity at the root of a new task and routes the intent to it. However, if an instance of the activity already exists, the system routes the intent to existing instance through a call to its onNewIntent() method, rather than creating a new one.

    singleInstance

    Same as "singleTask", except that the system doesn't launch any other activities into the task holding the instance. The activity is always the single and only member of its task.

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

    0 讨论(0)
  • 2021-02-05 08:13

    Here is good explanation how app lifecycle flows. onStart() can be executed many times. You can keep counter how many times you had entered this method and act differently on each time:

     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
          }
     }
    

    To be more clear about life cycle and why your onStart() method is called twice I suggest to have counter and Log.i() in each important state of the cycle - at least in onCreate() and onRestart().

    Keep in mind that app stays in memory when you click Home button. When you click app icon again it restarts already running app (calls onRestart() and then onStart() methods and no onCreate() ). When you really kill you app for real then sequence would be onCreate and onStart without onRestart. Having logcat records really helps you to understand app lifecycle flow and why your onStart() is called twice or more times.

    0 讨论(0)
  • 2021-02-05 08:20

    Using a static variable to check how many times onStart has been called isn't a good idea, because an app can be killed if Android needs more memory for other apps while still allowing the user to navigate back to the app. That would be the path through the red box in the picture below (http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle):

    enter image description here

    A static variable would be 0 again after that and your app would run the security check again. What you need to do is use an instance variable that you persist in onSaveInstanceState and restore in onCreate. In case the app is killed, onSaveInstanceState is called and you save your Activity's state. If the user goes back to the app, onCreate is called and the state would be restored. This works for all other cases too when the app isn't killed but the user just navigates away from the app and later re-opens it. Here's a simple example of an app saving and restoring:

    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");
            }
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题