美文网首页
Android Dialog的生命周期及封装对话框管理类

Android Dialog的生命周期及封装对话框管理类

作者: 清风兑酒 | 来源:发表于2023-08-10 11:00 被阅读0次
    对于开发Android的朋友来说Activity的生命周期肯定不陌生,但是对于Dialog的生命周期就会有点困惑了,可能会问咋个Dialog还有生命周期呢?没错,Dialog不仅有生命周期而且会与Activity有密切的关联。相信用过Dialog的朋友肯定记得如何让Dialog消失的方法:就是调用dialog.cancle 或 dialog.dismiss()方法。OK,那么,下面我们先看一下Dialog 的六个生命周期。

    前言

    一、Dialog生命周期

    二、Activity上有Dialog的时候的生命周期

    三、封装对话框管理类


    一、Dialog生命周期

    • onCreate(),show(),onStart() ,cancel(),onDismiss(),Stop()

    是不是看着很眼熟,当在对话框创建onCreate()后(仅执行一次创建),show()方法用于展示对话框,随后调用onStart(),当点击back键或点击外部会执行cancel(),如果调用dialog.dismiss()方法会执行onDismiss,对话框消失最后会执行Stop()。

    二、Activity上有Dialog的时候的生命周期

    Android 深刻理解Activity生命周期的作用及意义

    有些朋友可能会认为Activity被覆盖会处于onPause的生命周期,完全不可见即将销毁则处于onStop状态, 但是弹出Dialog覆盖时会不会这样呢?很简单的做个试验: 点击按钮弹出一个Dialog, 这时后面的Activity处于不完全可见的状态, 打印出Activity生命周期的变化。

    public class MainActivity extends AppCompatActivity {     private Button button;    private String TAG = "MainActivity";     public void init(){        button = findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)                        .setIcon(R.mipmap.ic_launcher_round)                        .setCancelable(false)                        .setTitle("dialog")                        .show();            }        });    }     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }     protected void onStart(){        Log.d(TAG,"onStart方法正在执行");        super.onStart();    }     protected void onResume(){        Log.d(TAG,"onResume方法正在执行");        super.onResume();    }     protected void onPause(){        Log.d(TAG,"onPause方法正在执行");        super.onPause();    }     protected void onStop(){        Log.d(TAG,"onStop方法正在执行");        super.onStop();    }     protected void onDestroy(){        Log.d(TAG,"onDestroy方法正在执行");        super.onDestroy();    }}
    

    程序打开后,点击弹框,生命周期显示是:onCreate() -> onStart() -> onResume 。这表明弹出的东西对后面Activity的生命周期并没有影响。

    官方文档我们可以看到: onPause():Called when the system is about to start resuming another activity. (启动另外一个Activity的时候才会进入onPause状态)

    Dialog实现的原理是windowmanager.addView();其实添加的是一个view。所以,我们弹出的Dialog对话框实际上是Activity的一个组件,Activity并不是不可见而是被一个布满屏幕的组件覆盖到最顶层,我们无法对其他内容进行操作,因此,Dialog不会影响Activity的生命周期的变化。

    如果在弹出对话框的Activity点击home键返回桌面,Activity生命周期会不会变化呢?当然会,会执行onPause() -> onStop() 。

    再次启动: onRestart() -> onStart() -> onResume()。(有没有Dialog生命周期都不会发生变化)

    三、封装对话框管理类

    通过对support v4/v7/v13的区别我们了解到v7最低兼容Android2.1版本的系统,所以我们使用Dialog可以这样导入:

    import android.support.v7.app.AlertDialog; 
    
    
     //对话框    private static AlertDialog alertDialog;     /**     *  显示单独按钮的Dialog     */    public static void showSimpleDialog(Activity context, String title, String message , DialogInterface.OnClickListener clickListener) {        AlertDialog.Builder builder =new AlertDialog.Builder(context);        builder.setCancelable(true);        builder.setTitle(title);        builder.setMessage(message);        //监听事件        if (clickListener != null){            builder.setPositiveButton("确认",clickListener);        }else{            builder.setNegativeButton("知道了",null);        }        alertDialog=builder.create();        alertDialog.setCanceledOnTouchOutside(false);        if(!((Activity) context).isFinishing()){            alertDialog.show();        }    }     /**     *  显示双按钮Dialog     */    public static void showDoubleDialog(Activity context, String title, String message , DialogInterface.OnClickListener clickListener) {        AlertDialog.Builder builder =new AlertDialog.Builder(context);        builder.setCancelable(true);        builder.setTitle(title);        builder.setMessage(message);        //监听事件        if (clickListener != null){            builder.setPositiveButton("确认",clickListener);        }else{            builder.setPositiveButton("确认",null);        }        builder.setNegativeButton("取消",null);        alertDialog=builder.create();        alertDialog.setCanceledOnTouchOutside(false);        if(!context.isFinishing()){            alertDialog.show();        }     }
    

    进度条对话框,需要自定义布局:

        //进度条    private static Dialog progressDialog;    /**     * 显示进度条     * @param context     * @param msg     */    public static void showProgress(Activity context,String msg){        if (progressDialog == null){            progressDialog = new Dialog(context , R.style.loadingdialog);            progressDialog.setContentView(R.layout.loading_dialog);            progressDialog.setCanceledOnTouchOutside(false);        } else if (progressDialog.isShowing()){            progressDialog.dismiss();        }        if(!context.isFinishing())        {            progressDialog.show();        }     }     /**     * 关闭进度条     */    public static void dismissProgress(){        if (progressDialog != null ){            if (progressDialog.isShowing()){                progressDialog.dismiss();            }        }    }
    

    其中布局:R.layout.loading_dialog:

    <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">     <LinearLayout        android:layout_width="150dp"        android:layout_height="130dp"        android:layout_centerInParent="true"        android:orientation="vertical"        android:gravity="center"        android:background="#ab0e0e0e">         <ProgressBar            android:id="@+id/pro"            android:indeterminateTintMode="src_atop"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:indeterminateDrawable="@drawable/progressbar_bg"            />         <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginTop="10dp"            android:text="加载中..."/>     </LinearLayout> </RelativeLayout>
    

    其中ProgressBar的Style.Theme: R.style.loadingdialog

       <style name="loadingdialog" parent="@android:style/Theme.Dialog">        <item name="android:windowFrame">@null</item><!-- Dialog的边框,@null标识无 -->        <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->        <item name="android:windowIsTranslucent">false</item><!--半透明-->        <item name="android:windowNoTitle">true</item><!--无标题-->        <item name="android:windowBackground">@color/transparent</item><!--背景透明-->        <item name="android:backgroundDimEnabled">false</item><!--模糊-->    </style>
    

    其中ProgressBar属性android****:indeterminateDrawable=****"@drawable/progressbar_bg"

    <?xml version="1.0" encoding="utf-8"?><animated-rotate    xmlns:android="http://schemas.android.com/apk/res/android"    android:pivotX="50%" android:pivotY="50%"    android:fromDegrees="0"    android:toDegrees="360">     <shape        android:shape="ring"        android:innerRadiusRatio="3"        android:thicknessRatio="10"        android:useLevel="false">        <gradient            android:type="sweep"            android:useLevel="false"            android:startColor="#ffa500"            android:centerColor="#FF7121"            android:centerY="0.50"            android:endColor="#FFFF00" />    </shape> </animated-rotate>
    

    相关文章

      网友评论

          本文标题:Android Dialog的生命周期及封装对话框管理类

          本文链接:https://www.haomeiwen.com/subject/ksacgktx.html