有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

MainActivity中带有附加项的java存储捆绑包

作为一名Android/Java开发新手,我希望这不是一个微不足道的问题。不过我已经为此挣扎了好几个小时,所以我希望能得到一些建议

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

用户可以从通知返回MainActivity UI;在这种情况下,通知会将包传递给MainActivity。但是,当用户再次通过launcher图标返回应用程序时,捆绑包不可用,因为不打算提供所需的数据

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

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

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) 个答案

  1. # 1 楼答案

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

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