我有以下情况:
我想要做的是在点击活动B的后退按钮时保持活动A的状态。
活动A代码:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_product_details);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null)
{
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
// check for saved instance
if (savedInstanceState != null)
{
//restore saved values
}
else
{
//initialize members with default values
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
savedInstanceState.putString("typeID", typeID);
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState)
{
super.onRestoreInstanceState(savedInstanceState);
typeID = savedInstanceState.getString("typeID");
}
public boolean gotoActivityB(View view)
{
Intent intent = new Intent(getApplicationContext(), ActivityB.class);
startActivity(intent);
return false;
}
活动B代码:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_buy_item);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null)
{
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
//do some magic...
}
public boolean onOptionsItemSelected(MenuItem item)
{
Intent intent = new Intent(getApplicationContext(), ActivityA.class);
startActivity(intent);
return false;
}
每次从活动B转到活动A时,savedInstanceState等于null,换句话说,活动A状态不会被保存或恢复。
我在这里缺少什么?
!! SOLUTION !!
根据 @cybersam 的回答,活动默认维持其状态。因此不需要savedInstanceState。为了解决我的问题,我只需要将我的后退按钮事件更新为:
public boolean onOptionsItemSelected(MenuItem item)
{
finish();
return true;
}
答案 0 :(得分:2)
正如onSaveInstanceState()所述的文档:
调用onPause()时的示例,而不是 onSaveInstanceState(Bundle)是在前面启动活动B的时候 活动 - 答:系统可能会避免调用onSaveInstanceState(Bundle) 活动A,如果它在B的生命周期内没有被杀死,因为 A的用户界面状态将保持不变。
因此,您无法假设onSaveInstanceState()
只会因为A
在其前面发起而被调用B
。事实上,大部分时间,它都不会。
[EDITED]
您的B代码似乎是将startActivity()调用为"返回"到之前的活动。如果你只想让B回到之前的活动,你可以(通常)只调用finish()来退出B,这应该允许A重新出现(其状态完好无损),因为它将成为{{{ 3}}