在 MainActivity 中存储带有附加功能的 Bundle
Store Bundle with extras in MainActivity
作为新手 Android/Java 开发人员,我希望这不是一个微不足道的问题。不过,我已经为此苦苦挣扎了几个小时,所以我希望得到一些指示。
我实际上正在开发一个 alarm/timer 应用程序,它具有多个时间间隔用于特定的计时目的。我的想法是创建一个包含计时参数(间隔量、间隔持续时间和具有实际计算的警报时间的模式)的捆绑包。这个 Bundle 是在 MainActivity UI 中创建的。当警报模式处于 运行 宁时,我想将这些参数存储在一个 Bundle 中,我将其传递给在警报模式处于活动状态时始终可见的通知。
用户可以从通知返回到 MainActivity UI;在这种情况下,通知将 Bundle 传递给 MainActivity。但是,当用户 returns 通过启动器图标再次访问应用程序时,Bundle 不可用,因为没有包含所需数据的 Intent。
1) 现在我的第一个问题可能是一个更广泛的问题,因为我想知道如何解决这类问题。是否可以 'store' 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
将数据存储在 Bundle
中,但使用 this 接受的答案中所示的辅助方法题。还有其他存储数据的方法,可以是文件或数据库。
参考this。 @Magius 对此进行了很好的解释。简而言之,如果您从启动器启动 activity,getIntent().getAction()
将 return android.intent.action.MAIN
和 getCategories()
将 return 一组将包含android.intent.category.LAUNCHER
类别。您可以在 onCreate()
中查看此信息以了解您的来源。如果您从启动器启动 activity,sourceExtras
将是 null
,您可以将其设置为您保存的 Bundle
。
作为新手 Android/Java 开发人员,我希望这不是一个微不足道的问题。不过,我已经为此苦苦挣扎了几个小时,所以我希望得到一些指示。
我实际上正在开发一个 alarm/timer 应用程序,它具有多个时间间隔用于特定的计时目的。我的想法是创建一个包含计时参数(间隔量、间隔持续时间和具有实际计算的警报时间的模式)的捆绑包。这个 Bundle 是在 MainActivity UI 中创建的。当警报模式处于 运行 宁时,我想将这些参数存储在一个 Bundle 中,我将其传递给在警报模式处于活动状态时始终可见的通知。
用户可以从通知返回到 MainActivity UI;在这种情况下,通知将 Bundle 传递给 MainActivity。但是,当用户 returns 通过启动器图标再次访问应用程序时,Bundle 不可用,因为没有包含所需数据的 Intent。
1) 现在我的第一个问题可能是一个更广泛的问题,因为我想知道如何解决这类问题。是否可以 'store' 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
将数据存储在Bundle
中,但使用 this 接受的答案中所示的辅助方法题。还有其他存储数据的方法,可以是文件或数据库。参考this。 @Magius 对此进行了很好的解释。简而言之,如果您从启动器启动 activity,
getIntent().getAction()
将 returnandroid.intent.action.MAIN
和getCategories()
将 return 一组将包含android.intent.category.LAUNCHER
类别。您可以在onCreate()
中查看此信息以了解您的来源。如果您从启动器启动 activity,sourceExtras
将是null
,您可以将其设置为您保存的Bundle
。