首先DialogFragment是跟隨Fragment一起被Google推出的蔽莱,DialogFragment是基于Fragment的,生命周期和Fragment是一樣的泳猬。
在Android中批钠,實現(xiàn)對話框的方式多種:
Dialog/Alter
DialogFragment
Activity的Style設(shè)置成Dialog
通常,我們在開發(fā)中實現(xiàn)通過繼承Dialog來實現(xiàn)對話框的效果得封,但是埋心,基于Dialog的對話框生命周期是不會隨著Activity的,我們可以寫一段簡單的代碼來看看:
public class MyDialogActivity extends AppCompatActivity {
private static final String TAG = "MyDialogActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG,"onCreate");
setContentView(R.layout.activity_dialog);
Button button = findViewById(R.id.button4);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyDialog myDialog = new MyDialog(MyDialogActivity.this);
myDialog.show();
}
});
//延時2秒主動關(guān)閉Activity
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
finish();
}
},2000);
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG,"onResume");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG,"onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG,"onRestart");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG,"onPause");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG,"onDestroy");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG,"onStop");
}
static class MyDialog extends Dialog {
private String TAG = "Dialog";
public MyDialog(@NonNull Context context) {
super(context);
setContentView(R.layout.dialog_demo);
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG,"onStop");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG,"onStart");
}
@Override
public void cancel() {
super.cancel();
Log.e(TAG,"cancel");
}
@Override
public void dismiss() {
super.dismiss();
Log.e(TAG,"dismiss");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG,"onCreate");
}
}
}
運行起來后忙上,打開一個Dialog拷呆,然后延時兩秒關(guān)閉Dialog,發(fā)現(xiàn)Log中竟然報錯了:
image
大致的意思疫粥,Dialog沒被關(guān)閉茬斧,造成了內(nèi)存泄漏
解決辦法也很簡單,在Activity中的onDestory方法中主動關(guān)閉:
@Override
protected void onDestroy() {
super.onDestroy();
if (myDialog != null){
myDialog.cancel();
}
Log.e(TAG,"onDestroy");
}
如果每次都要這樣做梗逮,感覺比較繁瑣项秉,為什么不能讓系統(tǒng)自己來回收呢?這里就可以使用DialogFragment:
public class MyDialogFragment extends DialogFragment {
private static final String TAG = "MyDialogFragment";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG,"onCreate");
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Log.d(TAG,"onCreateView");
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG,"onDetach");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestroy");
}
}
image
從日志來看慷彤,當Activity生命周期發(fā)生變化的時候娄蔼,DialogFragment的生命周期也在發(fā)生變化,這和Fragment是一樣的底哗,因此可以保證當對話框的生命周期和Activity的生命周期保持一致岁诉,避免內(nèi)存泄漏
順便提一下,在通過點擊彈出對話框的時候跋选,不要直接new一個對話框涕癣,如果可以復用,就盡量復用前标,減少對象的創(chuàng)建