Android系统应用开发(八)ANR应用程序与无响应对话框自定义
2016-09-13 10:13
1011 查看
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绝对不止是你的应用名,自己可以打印出来看一下,
2,processName.contains("File")用这个方法判断只要包含你的应用的名称,改了dialog的显示内容即可,比如我这里改了dialog的message,setMessage("waita
moment please! ");,title的修改
setTitle("Tips.");这都是在源码里面修改,字符串不能直接用中文加引号
相关文章推荐
- 关于LCD调整背光的问题
- Android layout属性大全
- 图形处理【Android】
- Android串口操作,简化android-serialport-api的demo(附源码)
- android开发中创建按钮事件监听器的几种方法
- Android 安全加密:消息摘要Message Digest详解
- Android系统应用开发(七)屏蔽Home键和屏幕的唤醒和休眠,AlarmManager
- [Android测试] Android Studio+Appium+Java+Windows 自动化测试之二:Appium环境安装搭建
- Android 泛型小例 findById
- Android 安全加密:非对称加密详解
- Android系统应用开发(六)Android framework系统默认设置修改
- 应用程序未安装:已安装了存在签名冲突的同名数据包。
- 关于Android开发软件图标尺寸
- make版本不符合要求,不能编译android的解决方法
- Android Framework系统服务详解
- Android Binder机制----实现自定义的系统服务
- Android使用 SO 库时要注意的一些问题
- Android图片文件缓存
- Android系统应用开发(五)android 输入法类说明
- onWindowFocusChanged重要作用