在 MainActivity 中存储带有附加功能的 Bundle

Posted

技术标签:

【中文标题】在 MainActivity 中存储带有附加功能的 Bundle【英文标题】:Store Bundle with extras in MainActivity 【发布时间】:2018-01-09 12:14:46 【问题描述】:

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

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

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

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

2) 更具体地说,对于我的代码(见下文),我不明白为什么当我从启动器(重新)打开 MainActivity 时我的应用程序崩溃。在那种情况下,我认为不会有带有 Bundle 的 Intent,所以 .显然,情况并非如此,因为第一次运行并且应用程序因 NullPointer 而崩溃。这个 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);
            
        
        ...
    
    ...

【问题讨论】:

将你的数据存储在SharedPreferences,并在启动时加载MainActivity.Bundle用于在活动之间传递数据。 【参考方案1】:

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

    请参阅this。 @Magius 很好地解释了这一点。简而言之,如果您从启动器启动活动,getIntent().getAction() 将返回android.intent.action.MAINgetCategories() 将返回一个包含android.intent.category.LAUNCHER 类别的集合。您可以在onCreate() 中查看此信息,以了解您来自哪里。如果您从启动器启动活动,sourceExtras 将是null,您可以将其设置为您保存的Bundle

【讨论】:

这很有趣,因为您链接的帖子说您无法在 sharedpreferences 中存储捆绑包 从技术上讲,您不能将包直接存储在 SharedPreferences 中,但您可以借助迭代包并保存每个数据的辅助方法来做到这一点。也许你没有看接受的答案@TimCastelijns @TimCastelijns 我已经进行了编辑以避免混淆。如果您觉得我的构图不正确,请随时进一步编辑。谢谢。 等等,你可以遍历Bundle的元素吗?怎么样? 我一直在研究解决方案,使用 SharedPreferences。但是,不可能将数组存储在 SharedPreferences 中,对吧?那么我应该将我的数组转换为单独的长值以存储在 SharePreferences 中吗?并在读取它们时将它们重新组合成一个数组?

以上是关于在 MainActivity 中存储带有附加功能的 Bundle的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在后台时无法从意图中获取附加信息

重复报警BroadcastReciever Intent字符串附加功能没有得到更新

带有附加功能的地理围栏 PendingIntent

Swift - 如何将本地存储的对象数组(文件管理器)转换为较新的对象? (带有附加属性)

在python中附加带有json数据的文本文件

java.lang.IllegalStateException:未附加到上下文的片段