java - 在 MainActivity 中存储包含附加内容的 bundle

标签 java android android-intent android-bundle

作为一名 Android/Java 开发新手,我希望这不是一个小问题。不过,我已经为此苦苦挣扎了几个小时,所以我希望得到一些指示。

我实际上正在开发一个具有多个间隔的警报/计时器应用程序,用于特定的计时目的。我的想法是创建一个包含计时参数的 bundle (间隔量、间隔持续时间以及具有实际计算的警报时间的模式)。该 bundle 是在 ​​MainActivity UI 中创建的。当警报模式运行时,我想将这些参数存储在一个 bundle 中,我将其传递给一个通知,该通知在警报模式处于 Activity 状态时始终可见。

用户可以从通知返回MainActivity UI;在这种情况下,通知将 Bundle 传递给 MainActivity。但是,当用户通过启动器图标再次返回应用程序时,Bundle 不可用,因为没有包含所需数据的 Intent。

1)现在我的第一个问题可能是一个更广泛的问题,因为我想知道如何解决此类问题。是否可以将数据“存储”在 Bundle 中,或者我应该将数据存储在文件中,并在每次打开 MainActivity 时从文件中读取?

2)更具体地说,对于我的代码(见下文),我不明白为什么当我从启动器(重新)打开 MainActivity 时我的应用程序崩溃。在这种情况下,我认为不会有带有 Bundle 的 Intent,所以 .显然,情况并非如此,因为第一个运行并且应用程序因空指针而崩溃。这个 Intent 和空 Bundle 从哪里来?

public class MainActivity extends AppCompatActivity {

    int intervalAmt;
    int intervalDur;
    long[] alarmSchema;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent sourceIntent = getIntent();
        Bundle sourceExtras = sourceIntent.getExtras();

        if (sourceExtras != null) {
            intervalDur = sourceExtras.getInt("intervalDur", 0);
            intervalAmt = sourceExtras.getInt("intervalAmt", 0);
            alarmSchema = sourceExtras.getLongArray("alarmSchema");
        }

        if (sourceExtras == null) {

            PreferenceManager.setDefaultValues(this, R.xml.settings, false);
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

            intervalAmt = Integer.valueOf(sharedPreferences.getString("edittext_intervalAmt", "4"));
            intervalDur = (Integer.valueOf(sharedPreferences.getString("edittext_intervalDur", "1200000")));
            alarmSchema = new long[intervalAmt+1];

            for(int i=0; i<=(intervalAmt-currentInterval); i++){
                alarmSchema[currentInterval+i] = System.currentTimeMillis() + (intervalDur*i);
            }
        }
        ...
    }
    ...
}

最佳答案

  1. 如果您想要持久存储,您可以使用 SharedPreferences 将数据存储在 Bundle 中,但使用辅助方法,如已接受的答案 this 所示。问题。还有其他方法可以存储数据,无论是在文件中还是在数据库中。

  2. 引用 this 。 @Magius 已经很好地解释了这一点。简而言之,如果您从启动器启动 Activity,getIntent().getAction() 将返回 android.intent.action.MAIN,而 getCategories() 将返回包含 android.intent.category.LAUNCHER 类别的集合。您可以在 onCreate() 中检查这一点,以了解您来自哪里。如果您从启动器启动 Activity,sourceExtras 将为 null,您可以将其设置为您已保存的 Bundle

关于java - 在 MainActivity 中存储包含附加内容的 bundle ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48168032/

相关文章:

android - 使用 KSoap 库使用 .NET Web 服务时出错

android - 在树莓派和手机之间交换数据

android - 相机预览没有重新启动?

android - setType 的 Intent 不包括图像和视频,但包括其他所有内容

android - 登录页面重定向的 Intent 标志,杀死以前的 Activity

java - 如何使用在EC2上运行的java aws SDK获取accesskey、secretkey

java - 在java中使用swing定位标签

java - 解析 owl 文件

java - 我想限制我的网络服务网址只能从任何浏览器访问,只能从 Android 应用程序访问

android - ScrollView 不滚动 - Android