如何保存一个activity,创建历史记录?也就是说,保存创建过的activity的ui页面,然后通过历史记录可以再次看到过去的activity。有方法吗?
File==>local history
public boolean onKeyDown(int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0)
{
这里写自己的操作,此方法兼容Android 1.0到Android 2.1
}
}
我这里的代码:
//注:Intent黄色因为我在搜索Intent。backIntent有下划线是我重复定义了两次,当时写的时候小失误,后面已更正。
乍一看,这里的代码好像就可以实现功能了。但是实际上运行的时候,并不能达到想要的效果,点击返回时,不但没有保存我在当前activity已经输入的数据,而且还将我的mainactivity给重置为了初始状态。
问题出在哪里呢?问题在于我这里少写了一句话,又多写了一句话。
少写的代码:setResult(RESULT_OK,backIntent);
将这句代码加入到最后一行。
该方法的原型:setResult(int resultCode, Intent data)
第一个参数:当Activity结束时resultCode将归还在onActivityResult()中,一般为RESULT_CANCELED , RESULT_OK该值默认为-1。
第二个参数:一个Intent对象,返回给主Activity的数据。在intent对象携带了要返回的数据,使用putExtra( )方法。
加入这句话后,成功实现事件。点击返回键,成功保存数据。直到这里我才得到了启发:实际上我们需要做的事就是,给返回键添加一个相当于确定键的功能。点击返回键,相当于点击了确定键。
确定键的部分代码如下:
我只需要给返回键添加与确定键一样的返回值,就可以实现事件。点击确定键返回RESULT_OK,即resultCode==RESULT_OK
。所以我给上面的代码添加了setResult(RESULT_OK,backIntent);
之后,返回键的返回值就跟确定键的返回值一样了。
多的一句话是startActivity(backIntent);
为什么呢?
我们知道,activity的调用实际上在内存中是一个压栈的过程,调用一个activity就压一次栈。
以这个代码为例,这个app有两个activity:
启动app,首先调用的是LifePriceMainActivity,将该Activity压栈,随后我们通过事件(在这不特别指出调用事件的代码,这不是我们的重点)调用了GoodEditActivity,此时压栈GoodEditActivity。
所以我们不需要为返回键添加startActivity方法,因为点击返回键,GoodEditActivity出栈,LifePriceMainActivity回到栈顶,也就是此时显示的是LifePriceMainActivity,所以调用这个方法是多此一举的,删掉删掉。
完整代码:
@Override
// 重写物理返回键方法
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if(keyCode == KeyEvent.KEYCODE_BACK){
String back_name=((EditText)findViewById(R.id.edit_text_good_name)).getText().toString();
String back_price=((EditText)findViewById(R.id.edit_text_good_price)).getText().toString();
Intent backIntent = new Intent(GoodEditActivity.this,LifePriceMainActivity.class);
Bundle back_bundle = new Bundle();
back_bundle.putCharSequence("back_name",back_name);
back_bundle.putCharSequence("back_price",back_price);
backIntent.putExtras(back_bundle);
setResult(RESULT_OK,backIntent);
GoodEditActivity.this.finish();
}
return super.onKeyDown(keyCode,event);
}
}
还是用fragment吧 ui页面无法保存啊