【问题标题】:Run code only once after an application is installed on Android device在 Android 设备上安装应用程序后仅运行一次代码
【发布时间】:2011-08-15 13:21:37
【问题描述】:

我只想在安装应用程序后运行一段代码。执行后,不应再次调用该特定代码,即使升级也是如此。

【问题讨论】:

  • 不应该只是安装程序的一部分吗?
  • @Woot4Moo - 安装程序是什么意思?我不熟悉(在android上)
  • 我不是在这个平台上开发的,我只是认为谷歌会为安装程序制作一个可扩展的框架。像 installbuilder 或 installshield。
  • @Woot4Moo:不,不存在这样的东西。

标签: android


【解决方案1】:
  1. 检查共享首选项中的布尔值 X 是否为真
  2. 如果不是:
    一种。运行特殊代码
    湾。在共享首选项中将 x 保存为 true

例如:

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

【讨论】:

  • 它总是为我跳过 if 语句。你是如何设法执行它的。可以分享给我吗...谢谢...
  • @medampudi - 我犯了一个错误,条件应该相反。见编辑。
  • 这不是执行此操作的正确方法,因为当您从应用程序管理器中清除应用程序数据时,即使应用程序没有被卸载,它也会作为新的运行;
  • @Rauf,你是对的,那么你的解决方案是什么?
  • 我认为如果用户清理数据,再次运行代码是可以接受的。如果您真的认为不应该这样做,您可以改为触摸 SD 卡上的文件。
【解决方案2】:

我过去使用过共享首选项,但如果您想在安装时执行某些操作,您也可以查看安装接收器。 MyInstallReciever 实现 BroadcastReciever

<receiver
    android:name="com.MyInstallReciever"
    android:exported="true">
    <intent-filter>
        <action
            android:name="com.android.vending.INSTALL_REFERRER" />
    </intent-filter>
</receiver>

【讨论】:

  • "com.android.vending.INSTALL_REFERRER" 不是一种安全的方式。因为在安装应用程序时,应用程序处于 STOP 状态。也许我无法很好地解释它,但对“INSTALL_REFERRER”稍作研究就会知道这一点。
  • 另外,这似乎只在从 Google Play (com.android.vending) 安装时有效,而不是从“任何来源”安装。
【解决方案3】:

使用这个简单的代码

   if (getPreferences(MODE_PRIVATE).getBoolean("is_first_run", true)) {
        /*
         * your code here
         */
        getPreferences(MODE_PRIVATE).edit().putBoolean("is_first_run", false).commit();
    }

【讨论】:

    【解决方案4】:

    使用布尔值检查是否第一次执行代码。

    SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = sharedpreferences.edit();
    if(sharedpreferences.getBoolean("is_first_exec",false))
        {
            editor.putBoolean("is_first_exec",false);
            //your code here ...
        }
    

    getBoolean() 与 SharedPreference 的所有其他 get 方法一样,采用第二个默认参数,第一次返回 null(因为 SharedPreference 文件中没有任何内容)。因此,if(){...} 块内的代码只会执行一次。

    脚注:SharedPreferences

    【讨论】:

      【解决方案5】:
      Thread t = new Thread(new Runnable() {
          @Override
          public void run() {
              //  Initialize SharedPreferences
              SharedPreferences getPrefs = PreferenceManager
                      .getDefaultSharedPreferences(getBaseContext());
      
              //  Create a new boolean and preference and set it to true
              boolean isFirstStart = getPrefs.getBoolean("firstStart", true);
      
              //  If the activity has never started before...
              if (isFirstStart) {
      
                  //  Launch app intro
                  final Intent i = new Intent(MainActivity.this, DefaultIntro.class);
      
                  runOnUiThread(new Runnable() {
                    @Override public void run() {
                      startActivity(i);
                    }
                  });
      
                  //  Make a new preferences editor
                  SharedPreferences.Editor e = getPrefs.edit();
      
                  //  Edit preference to make it false because we don't want this to run again
                  e.putBoolean("firstStart", false);
      
                  //  Apply changes
                  e.apply();
              }
          }
      });
      
      // Start the thread
      t.start();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-26
        相关资源
        最近更新 更多