限定屏幕方向:
设置Manifest文件的activity的属性:
android:screenOrientation="portrait"(始终竖屏)
landscape(始终横屏)

///////

自己处理变更:
设置Manifest文件中的activity属性:
android:configChanges="orientation|screenSize|keyboardHidden"


视图状态会自动保存(适用于EditText不适用于TextView):
前提条件:
(1)拥有Id
(2)实现onSaveInstanceState回调
(3)实现onRestoreInstanceState回调
 

    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        Log.d(TAG, "onSaveInstanceState() called with: " + "outState = [" + outState + "]");        outState.putLong(CREATE_TIME, this.createTime);        Log.d(TAG, "onSaveInstanceState() called with: " + "outState = [" + outState + "]");    }    @Override    protected void onRestoreInstanceState(Bundle savedInstanceState) {        super.onRestoreInstanceState(savedInstanceState);        Log.d(TAG, "onRestoreInstanceState() called with: " + "savedInstanceState = [" + savedInstanceState + "]");    }    @Override    protected void onDestroy() {        super.onDestroy();        Log.d(TAG, "onDestroy: " + this);    }

 


保持Fragment对象:
(1)在onCreate函数里调用setRetainInstance(true);

setRetainInstance(true);


(2)findFragmentByTag无则创建并添加,有就什么都不做
(2)Fragment对象添加到Activity中,当Activity重启时,通过FragmentManager过去此Fragment对象

    protected void onCreate(Bundle savedInstanceState) {        private Fragment fragment;        super.onCreate(savedInstanceState);        FragmentManager fm = getSupportFragmentManager();        fragment = fm.findFragmentByTag("ScoreFragment");        if (fragment == null) {            fragment = new ScoreFragment();            fm.beginTransaction().replace(android.R.id.content, fragment, "ScoreFragment").commit();        }        Log.d(TAG, "onCreate: ");    }



保存和恢复Fragment的状态
onSaveInstanceState保持状态
onActivityCreated恢复状态

    public ScoreFragment() {        // Required empty public constructor    }    @Override    public void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        outState.putInt(SCORE, this.score);        Log.d(TAG, "onSaveInstanceState() called with: " + "outState = [" + outState + "]");    }    @Override    public void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.d(TAG, "onCreate() called with: " + "savedInstanceState = [" + savedInstanceState + "]");//        setRetainInstance(true);        if (savedInstanceState != null) {            this.score = savedInstanceState.getInt(SCORE);        }    }    @Override    public void onDestroy() {        super.onDestroy();        Log.d(TAG, "onDestroy: " + this);    }

setRetainInstance的原理

只有调用了fragment的setRetainInstance(true)方法, 并且因设备配置改变,托管Activity正在被销毁的条件下, fragment才会短暂的处于保留状态。

比较来说,onSaveInstanceState可以更长久的保持数据。 
当Activity所在进程被关闭(非用户主动关闭),系统将会重新创建activity时, 将恢复onSaveInstanceState中保留的数据。

当Fragment设置了setRetainInstance(true)后, 在设备旋转等情况下,该Fragment可以暂时与Activity分离。

如果此时Fragment持有的后台线程,例如AsyncTask中的后台操作等, 需要使用Fragment的Context等信息,就可能出现错误。

为此,在Fragment中定义了isAdded, 用于判断Fragment是否已经绑定到了某个Activity。

更多相关文章

  1. Android 响应System UI状态,焦点改变,手势处理
  2. 监听android电话呼叫状态
  3. FregServer进程,获取ServiceManager代理对象
  4. 2011.07.19——— android intent 传递list或者对象
  5. Android获取通话状态
  6. Android USB状态监控(解决scheme="file")
  7. Android service后台执行定时任务
  8. Android - GridView,自定义开关控件,状态选择器selector,自定义对话

随机推荐

  1. Android最新优秀而实用的开源组件1
  2. android jni开发详细步骤
  3. Android(安卓)MapView 申请apiKey
  4. android,NativeActivity使用
  5. Android各种键盘挡住输入框解决办法
  6. Android中Fragment讲解及Fragment静态的
  7. Android(安卓)logcat内核信息
  8. 面试题八:事件分发机制
  9. 【Android(安卓)系统开发】使用 Source I
  10. 在代码中设置RelativeLayout布局中标签的