您的位置:首页 > 其它

Activity异常情况下生命周期分析

2017-03-31 14:49 351 查看
主要分析两种情况:
1 系统资源不足导致优先级低的Activity被回收。

Activity优先级排序:前台可见>前台可见不可交互(前台activity弹出dialog)>后台(用户按下home键、切换到其他应用)

当前台activity被回收,系统处于要奔溃状态,前台可见但不可交互状态下的activity一般情况也不会回收。Activity被系统回收,如果需要保存一些现场数据和再次被用户打开恢复,可借助onSaveInstanceState(Bundle outState)保存数据,onRestoreInstanceState(Bundle savedInstanceState) 恢复数据。虽然可以 onCreate(Bundle savedInstanceState)种对savedInstanceState进行非空判断进行数据恢复,但谷歌更推荐onRestoreInstanceState(Bundle
savedInstanceState) 。

代码如下:

public class MainActivity extends AppCompatActivity {
private EditText testEt;
private String test;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testEt= (EditText) findViewById(R.id.test);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
test=testEt.getText().toString();
outState.putString("test",test);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
testEt.setText(savedInstanceState.getString("test","default"));
}

2 由于资源相关配置发生改变导致Activity被杀死和重新创建,比如屏幕发生旋转。使用上述的方法也可以很好的保存和恢复数据。也可以指定configChanges避免由于配置改变导致重建。 android:configChanges="orientation|screenSize",当该activity发生屏幕旋转,activity不会被系统杀死和重建,会回调onConfigurationChanged。当配置程序需要响应配置改变,指定configChanges属性,重写onConfigurationChanged方法即可。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Toast.makeText(MainActivity.this,"屏幕旋转",Toast.LENGTH_SHORT).show();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息