【问题标题】:Run a piece of code only once when an application is installed [duplicate]安装应用程序时仅运行一次代码[重复]
【发布时间】:2013-02-25 07:00:23
【问题描述】:

我只想在我的应用程序中运行一段代码,并且是在我第一次运行它时(新安装的应用程序)。我怎么能这样做,谁能解释给出一段代码。

实际上,在我的 android 项目中,我只想在第一次运行时创建数据库并插入一些值。之后,该特定代码不应再次运行。我怎样才能通过 SharedPreferencesPreferences 实现这种机制。

示例代码会更有帮助。

【问题讨论】:

    标签: android sharedpreferences android-preferences


    【解决方案1】:

    首先你可以使用SQLiteOpenHelper。它是使用数据库做事的首选方式。这个类有一个onCreate(SQLiteDatabase) 方法,在第一次创建数据库时调用。我觉得很适合你。

    如果您想要更大的灵活性并且您的第一次逻辑不仅仅与数据库绑定,您可以使用之前提供的示例。你只需要把它放在启动点。

    有 2 个启动点。如果你只有一个活动,你可以把你的代码放在onCreate方法中,所以它会是这样的:

    public void onCreate(Bundle savedInstanceState) {
      // don't forget to call super method.
      super.onCreate(savedInstanceState);
    
      SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
      if (!prefs.getBoolean("firstTime", false)) {
        // <---- run your one time code here
        databaseSetup();
    
        // mark first time has ran.
        SharedPreferences.Editor editor = prefs.edit();
        editor.putBoolean("firstTime", true);
        editor.commit();
      }
    }
    

    别忘了输入activity declaration in manifest,还有intentfilters(操作=MAIN,类别=LAUNCHER)。

    如果您有多个活动并且不想重复启动逻辑,则可以将初始化逻辑放在应用程序实例中,该实例在所有活动之前创建(以及其他组件,例如服务、广播接收器、内容提供商)。

    像这样创建类:

    public class App extends Application {
    
      @Override
      public void onCreate() {
        super.onCreate();
    
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        if (!prefs.getBoolean("firstTime", false)) {
          // <---- run your one time code here
          databaseSetup();
    
          // mark first time has ran.
          SharedPreferences.Editor editor = prefs.edit();
          editor.putBoolean("firstTime", true);
          editor.commit();
        }
    }
    

    所有你需要的,都放在AndroidManifest.xml属性android:name=".App"中的application标签中。

    <!-- other xml stuff -->
    
    <application ... android:name=".App">
    
       <!-- yet another stuff like nextline -->
       <activity ... />
    </application>
    

    【讨论】:

    • 非常感谢,你的代码拯救了我。
    【解决方案2】:

    你可以试试:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedPreferences wmbPreference = PreferenceManager.getDefaultSharedPreferences(this);
        boolean isFirstRun = wmbPreference.getBoolean("FIRSTRUN", true);
        SharedPreferences.Editor editor = wmbPreference.edit();
    
        if (isFirstRun){
           // Code to run once
           editor.putBoolean("FIRSTRUN", false);
           editor.apply();
    }
    

    在您创建的第一个活动中写入此内容。那么之后的代码就不会再执行了。

    【讨论】:

    • 即放在 super.onCreate(savedInstanceState); 之后
    【解决方案3】:

    这是我在这些情况下所做的:

        wmbPreference = PreferenceManager.getDefaultSharedPreferences(this);
    
    
        isFirstRun = wmbPreference.getBoolean("FIRSTRUN", true);
    
        if (isFirstRun)
        {
    
            // Do your magic here
    
            SharedPreferences.Editor editor = wmbPreference.edit();
            editor.putBoolean("FIRSTRUN", false);
            editor.commit();
        }else{
            //what you do everytime goes here 
        }
    

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      无论您需要在应用中的何处运行此代码:

      1. 检查布尔值 firstTime 在共享首选项中是否为 True
      2. 如果没有

        • 运行一次代码
        • 在共享首选项中将 firstTime 保存为 true

      类似这样的:

      SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
      if(!prefs.getBoolean("firstTime", false)) {
          // run your one time code here
          SharedPreferences.Editor editor = prefs.edit();
          editor.putBoolean("firstTime", true);
          editor.commit();
      }
      

      【讨论】:

      • 超级简单和甜蜜的答案。谢谢老兄。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多