我在应用程序中使用“向上”按钮时遇到问题。我已经阅读过很多关于类似问题的帖子,但它们都没有解决我想要解决的同一个问题。
我有两项活动 - public static TimeSpan LocalTimeSpanToUTC(TimeSpan ts)
{
DateTime dt = DateTime.Now.Date.Add(ts);
DateTime dtUtc = dt.ToUniversalTime();
TimeSpan tsUtc = dtUtc.TimeOfDay;
return tsUtc;
}
public static TimeSpan UTCTimeSpanToLocal(TimeSpan tsUtc)
{
DateTime dtUtc = DateTime.UtcNow.Date.Add(tsUtc);
DateTime dt = dtUtc.ToLocalTime();
TimeSpan ts = dt.TimeOfDay;
return ts;
}
和A
。
A显示SQLite数据库中所选类别的任务列表。每个任务都属于一个类别,因此,A有一个从Intent传递的私有变量B
(它充当过滤器)。当我点击任务时,它会打开活动B,允许您编辑它。 B有一个向上按钮,可以将您带回A(带有任务的列表)。
由于A从intent获取topicId,当我单击B中的Up按钮时,A中没有intent,默认情况下topicId为-1。我认为保存id很容易 - 只需保存它:
topicId
在我使用的onCreate()方法中:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("topicId", this.TOPIC_ID);
}
但是,传递给onCreate()的savedInstanceState始终为if(savedInstanceState != null) {
this.TOPIC_ID = savedInstanceState.getInt("topicId");
}
。
我把登录A的生命周期方法看看会发生什么。
null
中运行并且捆绑包为空onCreate()
运行并保存我的ID onSaveInstanceState()
,然后是A onDestroy()
,而捆绑包是onCreate()
!有人可以告诉我为什么null
中的Bundle在这种情况下为空吗?我已将B&#39的父活动设置为manifest.xml中的A.我还阅读了一个解决方案,假设您在A的清单中添加onCreate()
。
然而,这不是我想要的 - 如果将其设置为singleTop,则单击“向上”按钮时不会销毁父活动。我希望将其销毁并重新创建,因为在B中我更改了一个任务,当我点击时,我想立即从A中的DB重新加载。
如果有人告诉我为什么Android将android:launchMode="singleTop"
捆绑包传递给null
,我会感激不尽。我已经尝试将此代码添加到B中,但它没有工作:
onCreate()
我认为this帖子是关于同一个问题的,但它已经4年没有得到解答了......
如果您需要,我会发布代码。我不想在开始时太过势不可挡。
的修改
经过多次搜索后,我找到了这个解决方案:link
它说:
当您按下时,活动将被销毁,其中的数据将丢失。在此之后,当您重新打开应用程序时,正在创建新的新实例时,您将始终在包中获得null。
Bundle savedInstanceState用于在由于某些更改(如旋转)重新创建活动时使用,或者因为它在后台暂停了很长时间。
如果你想保留一些数据,可以考虑使用SharedPreferences来处理小东西,或者考虑数据库(SQLite,Realm)或大文件的文件。
据我了解,仅在某些特定情况下,Android才会使用Bundle,例如关闭/打开屏幕,单击“主页”按钮或更改屏幕方向。在像我这样的情况下,您必须依赖其他一些功能,例如Intent intent = NavUtils.getParentActivityIntent(this);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpFromSameTask(this);
类。我欢迎拥有比我更先进的知识的人更多地了解这个问题。