android 四大组件Acitivity (2) 保存activity状态 Fragment
2016-07-07 12:18
591 查看
android 四大组件Acitivity (2) 保存activity状态 Fragment
(1) 继承Fragment ,
设置 setRetainInstance(true); 不会被重建, 不会销毁在Activiy销毁的时候
保证了Fragment 可以保存数据
使用DialogFragment 创建一个加载进度显示条(官方推荐)
异步任务加载数据,同时监视Activity的状态变化
SetActvity(Activity);
当系统的配置发生变化的时候, 导致Activiy 被销毁,
我们根据Activity 的状态,以及Task的进度, 判断
当Activity重建时任务是否继续任务
(1)通过FragmentManager 获取保存的DataFragment
dataFragment = fm.getFindFragmentByTag("tag"); 这个tag是一个唯一标示
如果DataFragment == null , 则是 Activity 第一次创建
否则是Activity重建,
获取MyTask
myTask = dataFragment.getData();
通过判断myTask是否为空, 来判断是是是重建
myTask == null 是还未存myTask
所以进行MyTask的初始化
myTask = new MyTask(this);
dataFragment.setdata(myTask); //将myTask 保存到Fragment中
myTask.execute(); 执行
(3)重要的是每次在Activity状态改变前,将Activity保存到MyTask中
销毁前, 将Activity的状态将变为null
在Actiivty重建获取第一次创建时, 所以要注意三个Activity变化的阶段
第一次 重建Activity
销毁Acitivity = null//容易被略了, setSaveInstanceState()
重建Acitivity
(1) 继承Fragment ,
设置 setRetainInstance(true); 不会被重建, 不会销毁在Activiy销毁的时候
保证了Fragment 可以保存数据
package my; import android.app.Fragment; import android.os.Bundle; public class DataFragment extends Fragment { private MyTask myTask; public void setData(MyTask myTask){ this.myTask = myTask; } public MyTask getData(){ return myTask; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true);//onCreate 不会调用,在fragment重建 和onDestroy() 不会创建 // } }
使用DialogFragment 创建一个加载进度显示条(官方推荐)
package my; import com.example.zhy_handle_runtime_change.R; import com.example.zhy_handle_runtime_change.R.id; import com.example.zhy_handle_runtime_change.R.layout; import com.example.zhy_handle_runtime_change.R.style; import android.app.Dialog; import android.app.DialogFragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; public class LoadingDialog extends DialogFragment { private String mMsg = "Loading"; public void setMsg(String msg) { this.mMsg = msg; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.dialog_loading, null); TextView title = (TextView) view .findViewById(R.id.id_dialog_loading_msg); title.setText(mMsg); Dialog dialog = new Dialog(getActivity(), R.style.dialog); dialog.setContentView(view); return dialog; } }
异步任务加载数据,同时监视Activity的状态变化
SetActvity(Activity);
当系统的配置发生变化的时候, 导致Activiy 被销毁,
我们根据Activity 的状态,以及Task的进度, 判断
当Activity重建时任务是否继续任务
(1)通过FragmentManager 获取保存的DataFragment
dataFragment = fm.getFindFragmentByTag("tag"); 这个tag是一个唯一标示
如果DataFragment == null , 则是 Activity 第一次创建
否则是Activity重建,
获取MyTask
myTask = dataFragment.getData();
通过判断myTask是否为空, 来判断是是是重建
myTask == null 是还未存myTask
所以进行MyTask的初始化
myTask = new MyTask(this);
dataFragment.setdata(myTask); //将myTask 保存到Fragment中
myTask.execute(); 执行
FragmentManager fm = getFragmentManager(); dataFragment = (DataFragment) fm.findFragmentByTag("datas"); if(dataFragment == null){ dataFragment = new DataFragment(); fm.beginTransaction().add(dataFragment, "datas").commit(); }
(3)重要的是每次在Activity状态改变前,将Activity保存到MyTask中
销毁前, 将Activity的状态将变为null
@Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); myTask.setActivity(null); }
在Actiivty重建获取第一次创建时, 所以要注意三个Activity变化的阶段
第一次 重建Activity
销毁Acitivity = null//容易被略了, setSaveInstanceState()
重建Acitivity
myTask = dataFragment.getData(); if(myTask == null) {//第一次创建 myTask = new MyTask(this); dataFragment.setData(myTask); myTask.execute(); }else {//重建 myTask.setActivity(this); }
package my; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import android.os.AsyncTask; public class MyTask extends AsyncTask<Void, Void, Void> { private LoadingDialog dialog; private MyListActivity activity; private List<String> datas; private boolean isComplete; public MyTask(MyListActivity activity){ this.activity = activity; } @Override protected void onPreExecute() { super.onPreExecute(); //进行显示初始化, dialog = new LoadingDialog(); dialog.show(activity.getFragmentManager(), "dialog"); } @Override protected Void doInBackground(Void... params) { datas = loadingData(); return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); isComplete = true; notityActivityCompleted(); if(dialog != null){ dialog.dismiss(); } } private void notityActivityCompleted() { if(isComplete) { activity.onComplete(datas);//将这个加载的数据串出去 } } public void setActivity(MyListActivity activity) { if(activity == null){//activity被销毁, 在onSaveInstanceState()中设置null if(dialog != null){ dialog.dismiss(); } } //设置当前的Activity this.activity = activity; if(activity != null & !isComplete){//数据还未加载 //进行显示初始化,重新进行dialog 的显示 dialog = new LoadingDialog(); dialog.show(activity.getFragmentManager(), "dialog"); } if (isComplete) {// notityActivityCompleted(); } } /** * 加载数据 * @return */ private List<String> loadingData(){ try{ Thread.sleep(5000); } catch (InterruptedException e){ e.printStackTrace(); } return new ArrayList<String>(Arrays.asList("通过Fragment保存大量数据", "onSaveInstanceState保存数据", "getLastNonConfigurationInstance已经被弃用", "RabbitMQ", "Hadoop", "Spark")); } }
相关文章推荐
- Android应用程序通用自动脱壳方法研究
- Android ADT修改主题配色方案 Color theme
- Release from App standby(Android M)
- 定时执行alarm(Android M)
- Android分享SDK 从零开始自主研发
- 如何修改frameworks实现音量统一调节
- Androidn Notification的使用,解决找不到setLatestEventInfo方法
- Android下so注入汇总
- No Crypto provider (Android N)
- Android 自定义View (四) 视频音量调控
- Android 自定义View (三) 圆环交替 等待效果
- Android模拟器连接localhost错误解决办法
- Android 自定义View (二) 进阶
- 自定义只有上下边界的边框背景
- Android 自定义View (一)
- 在Android String文件中使用CDATA
- Android 测试环境噪音分贝
- Android Volley框架的几种post提交请求方式
- AndroidStudio的PullToRefreshListView简单使用
- Android_android:windowSoftInputMode属性详解