1

我正在尝试使用以下代码检测我的应用程序是否曾经运行过:

(这是在我的默认 Android 活动中)

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    if (savedInstanceState == null) {
        Log.w("activity", "first time");
        setContentView(R.layout.activity_clean_weather);
    } else {

        Log.w("activity", "second time");
        setContentView(R.layout.activity_clean_weather);
    }


 }

当我第一次运行该应用程序时,它说第一次,当我第二次运行它时,第一次,第三次,第一次......

我使用的是实际的 Android 设备,并且每次都没有使用运行按钮。我使用 Eclipse 运行按钮运行应用程序一次,然后关闭应用程序并按下手机上的图标。

我的代码有问题吗?

4

4 回答 4

12

savedInstanceState更多的是用于在状态之间切换,例如暂停/恢复之类的事情。它也必须始终由您创建。

在这种情况下,您想要的是SharedPreferences.

像这样的东西:

public static final String PREFS_NAME = "MyPrefsFile"; // Name of prefs file; don't change this after it's saved something

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); // Get preferences file (0 = no option flags set)
    boolean firstRun = settings.getBoolean("firstRun", true); // Is it first run? If not specified, use "true"

    if (firstRun) {
        Log.w("activity", "first time");
        setContentView(R.layout.activity_clean_weather);

        SharedPreferences.Editor editor = settings.edit(); // Open the editor for our settings
        editor.putBoolean("firstRun", false); // It is no longer the first run
        editor.commit(); // Save all changed settings
    } else {
        Log.w("activity", "second time");
        setContentView(R.layout.activity_clean_weather);
    }

}

我基本上直接从Storage Options 的文档中获取了这段代码,并将其应用于您的情况。早点学习是个好概念。

于 2012-10-07T02:53:46.167 回答
0

您可以使用自定义的共享偏好来归档您的目标。

于 2012-10-07T02:51:49.850 回答
0

事实是,它savedInstanceState保存跨活动的持久数据。因此,如果您重新启动应用程序,savedInstanceState将在运行中为空。您应该使用一个Preference或一些数据库条目来跟踪您的第一次运行。我自己SharedPreference为此目的使用 a 。

于 2012-10-07T02:54:31.523 回答
0

savedInstanceState如果应用程序尚未加载到内存中,则将为 null。如果您想检测应用程序是否第一次运行,您必须应用不同的技术,例如使用 sharedPrefs / DB 来存储第一次运行的属性。

即检查属性“firstRun”的sharedPrefs

如果存在,那么它不是第一次运行

否则这是第一次运行

将 firstRun 属性设置为 true

于 2012-10-07T02:54:52.810 回答