Android中DialogFragment优于Dialog
首先DialogFragment是跟随Fragment一起被Google推出的,DialogFragment是基于Fragment的,生命周期和Fragment是一样的。
在Android中,实现对话框的方式多种:
- Dialog/Alter
- DialogFragment
- Activity的Style设置成Dialog
通常,我们在开发中实现通过继承Dialog来实现对话框的效果,但是,基于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秒主动关闭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,然后延时两秒关闭Dialog,发现Log中竟然报错了:
大致的意思,Dialog没被关闭,造成了内存泄漏
解决办法也很简单,在Activity中的onDestory方法中主动关闭:
@Override
protected void onDestroy() {
super.onDestroy();
if (myDialog != null){
myDialog.cancel();
}
Log.e(TAG,"onDestroy");
}
如果每次都要这样做,感觉比较繁琐,为什么不能让系统自己来回收呢?这里就可以使用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");
}
}
从日志来看,当Activity生命周期发生变化的时候,DialogFragment的生命周期也在发生变化,这和Fragment是一样的,因此可以保证当对话框的生命周期和Activity的生命周期保持一致,避免内存泄漏
顺便提一下,在通过点击弹出对话框的时候,不要直接new一个对话框,如果可以复用,就尽量复用,减少对象的创建

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
威锋网金狮奖落下大幕,2017年度科技榜单出炉
期待2018! 2017年度威锋网金狮奖在昨天关闭了投票通道,短短一个月时间转瞬即逝,在前半个月的征集阶段中,网友们纷纷提交了自己喜爱的数码产品和iOS APP,而在后半个月的投票阶段中大家也是见证了好几对“冤家”之间的激烈竞争。不过现在一切都圆满落幕了,在统计完超过15万张选票之后,各大板块的获奖名单纷纷出炉,是不是迫不及待地想看到最后的结果了?Let's go! 科技硬件类——实用和颜值才是王道 在最受关注的智能手机排名中,iPhone X毫无意外地成为最受欢迎的产品,9222张选票远远超过其他对手,不过令人意外的是,三星Galaxy S8竟然击败了下半年发布的Note 8、华为Mate 10和小米MIX 2等产品,看来比起双摄等配置,高颜值才是大家最关注的卖点啊!而小米MIX 2作为现象级的全面屏手机,也夺得了第三名。 而在影音娱乐提名中,1MORE三单元圈铁耳机作为今年现象级的传统有线耳机,也一举击败了热度超高的AirPods和任天堂Switch和BOSE QC35等产品,看来荣获iF设计大奖和美国《消费者报告》“2017年夏季最佳耳机”奖项确实为它增色不少,也从侧面证实了现在...
-
下一篇
Android中将APK放入系统APK目录中,找不到so文件
如题,将APK直接放入系统目录中,会导致APK找不到so文件,正常情况下的安装是使用PackageManager,它会将so文件拷入系统读取的so文件夹目录下,提供给App使用 ; 系统应用就是不会使用PackageManager去安装,所以在使用系统应用前,提前将so文件拷入到so文件夹目录下,重启后,App 就可以调用so文件了
相关文章
文章评论
共有0条评论来说两句吧...