在MainActivity中存储Bundle和extras

时间:2018-01-09 12:14:46

标签: java android android-intent android-bundle

作为新手Android / Java开发人员,我希望这不是一个微不足道的问题。我现在已经挣扎了好几个小时了,所以我希望得到一些指示。

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

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

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

2)更具体地说,我的代码(见下文),当我(重新)从启动器打开MainActivity时,我不明白为什么我的应用程序崩溃了。在这种情况下,我认为不会是一个捆绑的意图,所以。显然,情况并非如此,因为第一个运行并且应用程序与NullPointer崩溃。这个意图和空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 个答案:

答案 0 :(得分:0)

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

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