Android Dialog的生命周期及封裝對話框管理類

對于開發(fā)Android的朋友來說Activity的生命周期肯定不陌生,但是對于Dialog的生命周期就會有點(diǎn)困惑了,可能會問咋個(gè)Dialog還有生命周期呢?沒錯(cuò),Dialog不僅有生命周期而且會與Activity有密切的關(guān)聯(lián)。相信用過Dialog的朋友肯定記得如何讓Dialog消失的方法:就是調(diào)用dialog.cancle 或 dialog.dismiss()方法。OK,那么,下面我們先看一下Dialog 的六個(gè)生命周期。

前言

一、Dialog生命周期

二、Activity上有Dialog的時(shí)候的生命周期

三、封裝對話框管理類


一、Dialog生命周期

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

是不是看著很眼熟,當(dāng)在對話框創(chuàng)建onCreate()后(僅執(zhí)行一次創(chuàng)建),show()方法用于展示對話框,隨后調(diào)用onStart(),當(dāng)點(diǎn)擊back鍵或點(diǎn)擊外部會執(zhí)行cancel(),如果調(diào)用dialog.dismiss()方法會執(zhí)行onDismiss,對話框消失最后會執(zhí)行Stop()。

二、Activity上有Dialog的時(shí)候的生命周期

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

有些朋友可能會認(rèn)為Activity被覆蓋會處于onPause的生命周期,完全不可見即將銷毀則處于onStop狀態(tài), 但是彈出Dialog覆蓋時(shí)會不會這樣呢?很簡單的做個(gè)試驗(yàn): 點(diǎn)擊按鈕彈出一個(gè)Dialog, 這時(shí)后面的Activity處于不完全可見的狀態(tài), 打印出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方法正在執(zhí)行");        super.onStart();    }     protected void onResume(){        Log.d(TAG,"onResume方法正在執(zhí)行");        super.onResume();    }     protected void onPause(){        Log.d(TAG,"onPause方法正在執(zhí)行");        super.onPause();    }     protected void onStop(){        Log.d(TAG,"onStop方法正在執(zhí)行");        super.onStop();    }     protected void onDestroy(){        Log.d(TAG,"onDestroy方法正在執(zhí)行");        super.onDestroy();    }}

程序打開后,點(diǎn)擊彈框,生命周期顯示是:onCreate() -> onStart() -> onResume 。這表明彈出的東西對后面Activity的生命周期并沒有影響。

官方文檔我們可以看到: onPause():Called when the system is about to start resuming another activity. (啟動(dòng)另外一個(gè)Activity的時(shí)候才會進(jìn)入onPause狀態(tài))

Dialog實(shí)現(xiàn)的原理是windowmanager.addView();其實(shí)添加的是一個(gè)view。所以,我們彈出的Dialog對話框?qū)嶋H上是Activity的一個(gè)組件,Activity并不是不可見而是被一個(gè)布滿屏幕的組件覆蓋到最頂層,我們無法對其他內(nèi)容進(jìn)行操作,因此,Dialog不會影響Activity的生命周期的變化。

如果在彈出對話框的Activity點(diǎn)擊home鍵返回桌面,Activity生命周期會不會變化呢?當(dāng)然會,會執(zhí)行onPause() -> onStop() 。

再次啟動(dòng): onRestart() -> onStart() -> onResume()。(有沒有Dialog生命周期都不會發(fā)生變化)

三、封裝對話框管理類

通過對support v4/v7/v13的區(qū)別我們了解到v7最低兼容Android2.1版本的系統(tǒng),所以我們使用Dialog可以這樣導(dǎo)入:

import android.support.v7.app.AlertDialog; 

 //對話框    private static AlertDialog alertDialog;     /**     *  顯示單獨(dú)按鈕的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);        //監(jiān)聽事件        if (clickListener != null){            builder.setPositiveButton("確認(rèn)",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);        //監(jiān)聽事件        if (clickListener != null){            builder.setPositiveButton("確認(rèn)",clickListener);        }else{            builder.setPositiveButton("確認(rèn)",null);        }        builder.setNegativeButton("取消",null);        alertDialog=builder.create();        alertDialog.setCanceledOnTouchOutside(false);        if(!context.isFinishing()){            alertDialog.show();        }     }

進(jìn)度條對話框,需要自定義布局:

    //進(jìn)度條    private static Dialog progressDialog;    /**     * 顯示進(jìn)度條     * @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();        }     }     /**     * 關(guān)閉進(jìn)度條     */    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標(biāo)識無 -->        <item name="android:windowIsFloating">true</item><!--是否浮現(xiàn)在activity之上-->        <item name="android:windowIsTranslucent">false</item><!--半透明-->        <item name="android:windowNoTitle">true</item><!--無標(biāo)題-->        <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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容