关于当前activity被kill后数据的保存,onSaveInstanceState 与onRestoreInstanceState 的联系

来源:互联网 发布:傅海峰张楠进四强 知乎 编辑:程序博客网 时间:2024/04/30 19:45

一、为什么会有这个问题

大多数时候我们会遇到这样的问题(面试题)

当activity被销毁,或者运行于后台的情况下,Android系统因为内存紧张,将我们的进程kill了,我们的数据如何保存呢?

二、了解原理

作为这么智能的操作系统,怎么能没有办法呢?

Android系统中提供了一个回调方法,即


onSaveInstanceState(Bundle b)方法:当当前的activity “可能”被销毁的时候,该方法就会调用。什么是可能呢?

就是按home键,进程运行于后台的时候;启动第二个activity,当前activity被隐藏的时候;横竖屏切换的时候……

这个时候给我们一个保存数据的机会

onRestoreInstanceState(Bundle b)方法:当activity真的被系统销毁的时候,注意“真的”被系统销毁了,不是用户销毁的,所以home键,回退键不会调用它,他的主要作用就是恢复实例的

三、生命周期(当屏幕变换时)


四、代码案例

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.e("TAG", "MainActivity---onCreate");setContentView(R.layout.activity_main);}@Overrideprotected void onStart() {super.onStart();Log.e("TAG", "MainActivity---onStart");}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);Log.e("TAG", "MainActivity---onRestoreInstanceState");if(savedInstanceState!=null){Toast.makeText(this, savedInstanceState.getString("uname")+"------你看我还是保存了", Toast.LENGTH_SHORT).show();}}@Overrideprotected void onResume() {super.onResume();Log.e("TAG", "MainActivity---onResume");}@Overrideprotected void onPause() {super.onPause();Log.e("TAG", "MainActivity---onPause");}@Overrideprotected void onStop() {super.onStop();Log.e("TAG", "MainActivity---onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.e("TAG", "MainActivity---onDestroy");}public void btn1(View v){startActivity(new Intent(this,SecondActivity.class));}@Overrideprotected void onRestart() {super.onRestart();Log.e("TAG", "MainActivity---onRestart");}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);Log.e("TAG", "MainActivity---onSaveInstanceState");outState.putString("uname", "YYD");Toast.makeText(this, "系统你敢kill我!!我将数据保存了", Toast.LENGTH_SHORT).show();}
五、拓展,

这里我有用问题了,他妹的!如何模仿Android系统在内存紧张的情况下把我的activity给kill掉了呢?

虽然上面用到的横竖屏切换 可以解决“不是用户主动调用的情况下,进程destory了”,但是我还是想解决这个问题

①开个模拟器,内存给小点(比较lower)

adb shell am kill 包名(注意:一定要将当前进程弄后台后,再运行命令)

adb(Android Debug Bridge),am(Android Manege)有什么命令我一并贴过来

http://blog.csdn.net/soslinken/article/details/50245865

1 0
原创粉丝点击