Android系統應用開發(八)ANR應用程序與無響應對話框自定義


1, 在源碼下搜,grep "已停止運行" -r ,找到他的字段名,搜到id爲"aerr_application"的字段

2,繼續搜 ,grep "aerr_application" -r ,看他在那裏用到,搜到 AppErrorDialog的文件,位置:Z:\myandroid\frameworks\base\services\java\com\android\server\am,但是這個文件裏面沒見用到style,那麼看他的基類,AppErrorDialog extends BaseErrorDialog
3,BaseErrorDialog 裏面看到 super(context, com.android.internal.R.style.Theme_Dialog_AppError);好了,去找這個style,當然是在frameworks\base\core\res\res\theme裏面
class BaseErrorDialog extends AlertDialog {
    public BaseErrorDialog(Context context) {
        super(context, com.android.internal.R.style.Theme_Dialog_AppError);


        getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
                WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
        WindowManager.LayoutParams attrs = getWindow().getAttributes();
        attrs.setTitle("Error Dialog");
        getWindow().setAttributes(attrs);
        setIconAttribute(R.attr.alertDialogIcon);
    }

4,在style裏面搜,改變 <item name="windowBackground">@android:color/transparent</item>發現並沒卵用,這是dialog的整體背景,titlebar和下面的button有自己的背景,那麼看他基類Theme.Holo.Dialog
 <!-- @hide -->
    <style name="Theme.Dialog.AppError" parent="Theme.Holo.Dialog">
        <item name="windowFrame">@null</item>
        <item name="windowTitleStyle">@android:style/DialogWindowTitle</item>
        <item name="windowBackground">@android:color/transparent</item>
        <item name="windowIsFloating">true</item>
        <item name="windowContentOverlay">@null</item>
        <item name="textAppearance">@style/TextAppearance.Theme.Dialog.AppError</item>
        <item name="android:windowCloseOnTouchOutside">false</item>
    </style>

5,找到Theme.Holo.Dialog,其中的  <itemname="android:buttonBarStyle">@android:style/Holo.ButtonBar.AlertDialog</item>就是下面的button的樣式,繼續找Holo.ButtonBar.AlertDialog,在style裏面

<style name="Theme.Holo.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowTitleStyle">@android:style/DialogWindowTitle.Holo</item>
        <item name="android:windowBackground">@android:drawable/dialog_full_holo_dark</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Holo.Dialog</item>
        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
        <item name="android:windowActionBar">false</item>
        <item name="android:windowActionModeOverlay">true</item>
        <item name="android:windowCloseOnTouchOutside">@bool/config_closeDialogWhenTouchOutside</item>


        <item name="android:colorBackgroundCacheHint">@null</item>


        <item name="android:buttonBarStyle">@android:style/Holo.ButtonBar.AlertDialog</item>
        <item name="borderlessButtonStyle">@android:style/Widget.Holo.Button.Borderless.Small</item>
        
        <item name="textAppearance">@android:style/TextAppearance.Holo</item>
        <item name="textAppearanceInverse">@android:style/TextAppearance.Holo.Inverse</item>


        <item name="listPreferredItemPaddingLeft">16dip</item>
        <item name="listPreferredItemPaddingRight">16dip</item>
        <item name="listPreferredItemPaddingStart">16dip</item>
        <item name="listPreferredItemPaddingEnd">16dip</item>


        <item name="preferencePanelStyle">@style/PreferencePanel.Dialog</item>
    </style>

6,在Holo.ButtonBar.AlertDialog,其中的<item name="android:background">@color/white</item>就是下面button的背景色,下面接着找上面titlebar的背景
<style name="Holo.ButtonBar.AlertDialog">
        <item name="android:background">@color/white</item>
        <item name="android:dividerPadding">0dp</item>
    </style>

7,臥槽,花了一下午時間,剛找到,改變他的背景的地方,他應該不是titlebar的背景,這個dialog沒有title
返回到低(4)步裏面    <item name="windowFrame">@null</item>這個就是改變"xx已停止運行"的背景的,我改成<item name="windowFrame">@android:color/white</item>
看到效果了;
<!-- @hide -->
    <style name="Theme.Dialog.AppError" parent="Theme.Holo.Dialog">
        <item name="windowFrame">@null</item>
        <item name="windowTitleStyle">@android:style/DialogWindowTitle</item>
        <item name="windowBackground">@android:color/transparent</item>
        <item name="windowIsFloating">true</item>
        <item name="windowContentOverlay">@null</item>
        <item name="textAppearance">@style/TextAppearance.Theme.Dialog.AppError</item>
        <item name="android:windowCloseOnTouchOutside">false</item>
    </style>


特定應用“xxx”已停止運行對話框做修改,文件位置Z:\myandroid\frameworks\base\services\java\com\android\server\am\AppNotRespondingDialog.java


說明:

1 String processName=name2 != null? res.getString(resid,name1.toString(), name2.toString()): res.getString(resid, name1.toString());自己定義一個字符串,獲取停止的英明的名字,這個字符串中包含你的應用的名稱,比如你的應用名爲“File”,那麼他的打印出來就是“File  xxx”xxx是我忘了,打過log,但是processName絕對不止是你的應用名,自己可以打印出來看一下,

2processName.contains("File")用這個方法判斷只要包含你的應用的名稱,改了dialog的顯示內容即可,比如我這裏改了dialogmessagesetMessage("waita moment please! ");title的修改

setTitle("Tips.");這都是在源碼裏面修改,字符串不能直接用中文加引號


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章