AndroidRetainFragment狀態(tài)保存的方法

一、常見的狀態(tài)保存恢復(fù)方式

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請域名雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、呼中網(wǎng)站維護(hù)、網(wǎng)站推廣。

①onSaveInstance + onRestoreInstance

這種方式是最通用的實(shí)現(xiàn)狀態(tài)保存與恢復(fù),在Android生態(tài)種,組件和View大量使用了此方式。

②android:configChanges+onConfigurationChanged

這種情況適用于屏幕旋轉(zhuǎn)和配置變化,只要作用是阻止Activity重建,因此對于【語言】【時(shí)區(qū)】的調(diào)整可能需要重新啟動(dòng)Activity才能更新。

注意:

語言的變化需要配置為

android:configChanges="locale|layoutDirection"

屏幕旋轉(zhuǎn)需要配置為

android:configChanges="orientation|keyboard|screenSize"

③onRetainNonConfigurationInstance

此方法是3.0版本的Android系統(tǒng)中提供了代替方式②的一種方式,使用場景是允許屏幕旋轉(zhuǎn)、時(shí)區(qū)和語言調(diào)整及時(shí)反應(yīng)。但是對于當(dāng)前系統(tǒng)的狀態(tài)或者進(jìn)行的任務(wù)需要進(jìn)行保存。

如線程任務(wù)

public class NetWorkTask extends Thread {
  private volatile ProgressUpdateLinster progressUpdateLinster;
  private Handler handler = new Handler(Looper.getMainLooper());

  public NetWorkTask(ProgressUpdateLinster progressUpdateLinster) {
    this.progressUpdateLinster = progressUpdateLinster;
  }

  private int progress = 0;
  @Override
  public void run() {
    while (progress <= 100) {
      if(progressUpdateLinster != null) {
        handler.post(new Runnable() {
         @Override
          public void run() {
            progressUpdateLinster.updateProgress(progress);
          }
        });
      }
      try {
        Thread.sleep(200);
      } catch (InterruptedException e) {
        return;
      }
      progress += 2;
    }
  }

  public interface ProgressUpdateLinster {
    void updateProgress(int progress);
  }

  public void cacel() {
    interrupt();
  }
  public void setProgressUpdateLinster(ProgressUpdateLinster progressUpdateLinster) {  
    this.progressUpdateLinster = progressUpdateLinster;
  }
}

在Activity中保存狀態(tài)

private ProgressBar progressBar;
private TextView textView;
private static final String TAG = "MainActivity";

NetWorkTask netWorkTask = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  progressBar = (ProgressBar) findViewById(R.id.progressbar);
  textView = (TextView) findViewById(R.id.tv_progroess);

  if(getLastCustomNonConfigurationInstance() != null
      && getLastCustomNonConfigurationInstance() instanceof NetWorkTask) {

    this.netWorkTask = (NetWorkTask) getLastCustomNonConfigurationInstance(); //獲取保存的任務(wù)
    this.netWorkTask.setProgressUpdateLinster(linster);
  }else {
    this.netWorkTask = new NetWorkTask();
    netWorkTask.setProgressUpdateLinster(linster);
    netWorkTask.start();
  }

}

private NetWorkTask.ProgressUpdateLinster linster = new NetWorkTask.ProgressUpdateLinster() {
  @Override
  public void updateProgress(int progress) {
    progressBar.setProgress(progress);
    textView.setText(progress+"%");
    Log.d(TAG,MainActivity.this.toString());
  }
};

/**
* 保存任務(wù)
*/
@Override
public Object onRetainCustomNonConfigurationInstance() {
  return netWorkTask;
}

④RetainFragment

所謂RetainFragment并不是多么高大上的Fragment,和DialogFragment一樣本身都是比較普通的,這里的RetainFragment更注重【用途】,而非Fragment的名稱。

Fragment同樣是Android 3.0 版本的API,不過support-v4中也提供了補(bǔ)充方式。這種保存狀態(tài)的原理是將Fragment加入FragmentManager的事務(wù)中,但是并不顯示到界面中(也不需要實(shí)現(xiàn)view),因此可以成為后臺Fragment。

要實(shí)現(xiàn)后臺Fragment,必須做到在Activity重建的時(shí)候不被銷毀,原理就是通過setRetainInstance方法實(shí)現(xiàn)。

public class WorkFragment extends Fragment {

NetWorkTask netWorkTask = null;

/**
 * 重建之后這里的Context會自動(dòng)替換成新的Activity
 * @param context
 */
@Override
public void onAttach(Context context) {
  super.onAttach(context);
  //第一次啟動(dòng)的時(shí)候,這里network還沒有初始化
  //Activity重建之后,更新回調(diào)
  if(netWorkTask != null) {
    netWorkTask.setProgressUpdateLinster((NetWorkTask.ProgressUpdateLinster) context);
  }
}

@Override
public void onDetach() {
  super.onDetach();
  netWorkTask.setProgressUpdateLinster(null);
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState); //重建之后不再會調(diào)用此方法
  //設(shè)置為retain instance Fragment
  setRetainInstance(true);
  netWorkTask = new NetWorkTask();
  netWorkTask.setProgressUpdateLinster((NetWorkTask.ProgressUpdateLinster) getActivity());
  netWorkTask.start();
}
}

Activity中的使用方式

public class MainActivity extends AppCompatActivity implements NetWorkTask.ProgressUpdateLinster {

private ProgressBar progressBar;
private TextView textView;
private static final String TAG = "MainActivity";
private static final String TAG_TASK_FRAGMENT = "work";

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  progressBar = (ProgressBar) findViewById(R.id.progressbar);
  textView = (TextView) findViewById(R.id.tv_progroess);
  
  //如果已經(jīng)有了work fragment,那就不需要再新建了
  if(getSupportFragmentManager().findFragmentByTag(TAG_TASK_FRAGMENT) == null) {
    getSupportFragmentManager().beginTransaction().add(new WorkFragment(),TAG_TASK_FRAGMENT).commit();
  }
}

@Override
public void updateProgress(int progress) {
  progressBar.setProgress(progress);
  textView.setText(progress+"%");
}
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

文章名稱:AndroidRetainFragment狀態(tài)保存的方法
標(biāo)題鏈接:http://bm7419.com/article4/jjsioe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、搜索引擎優(yōu)化全網(wǎng)營銷推廣、做網(wǎng)站App開發(fā)、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管