Android借助Application重写App的Crash(简易版)
MainActivity如下:
package cn.testcrash;
import android.app.Activity;
import android.os.Bundle;
/**
* Demo描述:
* 借助于Application自定义Crash
*
* 参考资料:
* 1 http://blog.csdn.net/xiaanming/article/details/9344703
* 2 http://blog.csdn.net/itachi85/article/details/9102021
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
//Crash
private void init(){
System.out.println((9727/0)+"");
}
}
CrashApplication如下:
package cn.testcrash;
import android.app.Application; public class CrashApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
CrashHandler crashHandler=CrashHandler.getInstance();
//指定Crash时的处理程序
crashHandler.setCrashHandler(getApplicationContext());
}
}
CrashHandler如下:
package cn.testcrash;
import java.lang.Thread.UncaughtExceptionHandler;
import android.content.Context;
import android.os.Looper;
import android.widget.Toast;
public class CrashHandler implements UncaughtExceptionHandler {
private Context mContext;
private static CrashHandler mCrashHandler=new CrashHandler(); public static CrashHandler getInstance(){
return mCrashHandler;
} /**
* 设置当线程由于未捕获到异常而突然终止的默认处理程序。
*/
public void setCrashHandler(Context context){
mContext=context;
Thread.setDefaultUncaughtExceptionHandler(this);
} /**
* 当发生Crash时调用该方法
*/
@Override
public void uncaughtException(Thread thread, Throwable throwable) {
//保存错误日志到SD卡
Utils.saveInfoToSDCard(mContext, throwable);
//提示Crash信息
showCrashTipToast();
try {
Thread.sleep(3000);
} catch (Exception e) {
}
//退出应用
System.exit(0);
} private void showCrashTipToast() {
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(mContext, "I am very sorry", Toast.LENGTH_LONG).show();
Looper.loop();
}
}).start();
} }
Utils如下:
package cn.testcrash;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Build; public class Utils { public static void saveInfoToSDCard(Context context, Throwable throwable) {
HashMap<String, String> hashMap=getBaseInfo(context);
StringBuilder stringBuilder=new StringBuilder();
for(Map.Entry<String, String> entry:hashMap.entrySet()){
String key=entry.getKey();
String value=entry.getValue();
stringBuilder.append(key).append("=").append(value).append("\n");
}
System.out.println("stringBuilder.toString()如下:"+"\n"+stringBuilder.toString()); /**
* 其余逻辑省略
*/
}
/**
* 获取设备及该App的基本信息
*/
public static HashMap<String, String> getBaseInfo(Context context){
HashMap<String, String> hashMap = new HashMap<String, String>();
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = null;
try {
packageInfo = packageManager.getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);
} catch (NameNotFoundException e) {
e.printStackTrace();
} hashMap.put("versionName", packageInfo.versionName);
hashMap.put("versionCode", packageInfo.versionCode+""); hashMap.put("MODEL", Build.MODEL+"");
hashMap.put("SDK_INT",Build.VERSION.SDK_INT+"");
hashMap.put("RELEASE",Build.VERSION.RELEASE+"");
hashMap.put("PRODUCT",Build.PRODUCT+"");
return hashMap;
} private String getCurrentTime(){
String currentTime="";
long currentTimeMillis=System.currentTimeMillis();
System.setProperty("user.timezone", "Asia/Shanghai");
TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
TimeZone.setDefault(timeZone);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
Date currentDate=new Date(currentTimeMillis);
currentTime = simpleDateFormat.format(currentDate);
System.out.println("currentTime="+currentTime);
return currentTime;
} }
main.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
> <TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自定义Crash"
android:layout_centerInParent="true"
android:textSize="28sp"
/> </RelativeLayout>
AndroidManifest.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.testcrash"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="8" /> <application
android:name="cn.testcrash.CrashApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="cn.testcrash.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>
Android借助Application重写App的Crash(简易版)的更多相关文章
- android 在线升级借助开源中国App源码
android 在线升级借助开源中国App源码 http://www.cnblogs.com/luomingui/p/3949429.html android 在线升级借助开源中国App源码分析如下: ...
- Android开发之创建App Widget和更新Widget内容
App WidgetsApp Widgets are miniature application views that can be embedded in other applications (s ...
- 【转载】Android使用Application总结
Application 配置全局Context 第一步.写一个全局的单例模式的MyApplication继承自Application 覆盖onCreate ,在这个方法里面实例化Application ...
- Android学习之路——简易版微信为例(三)
最近好久没有更新博文,一则是因为公司最近比较忙,另外自己在Android学习过程和简易版微信的开发过程中碰到了一些绊脚石,所以最近一直在学习充电中.下面来列举一下自己所走过的弯路: (1)本来打算前端 ...
- Android学习之路——简易版微信为例(二)
1 概述 从这篇博文开始,正式进入简易版微信的开发.深入学习前,想谈谈个人对Android程序开发一些理解,不一定正确,只是自己的一点想法.Android程序开发不像我们在大学时候写C控制台程序那样, ...
- Android学习之路——简易版微信为例(一)
这是“Android学习之路”系列文章的开篇,可能会让大家有些失望——这篇文章中我们不介绍简易版微信的实现(不过不是标题党哦,我会在后续博文中一步步实现这个应用程序的).这里主要是和广大园友们聊聊一个 ...
- Android 使用Application总结
Application 配置全局Context 第一步.写一个全局的单例模式的MyApplication继承自Application 覆盖onCreate ,在这个方法里面实例化Application ...
- Android采用Application总结一下
什么是 Application Application和Activity,Service由于是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象.用 ...
- 【安卓开发】为什么不能往Android的Application对象里存储数据
在一个App里面总有一些数据需要在多个地方用到.这些数据可能是一个 session token,一次费时计算的结果等.通常为了避免activity之间传递对象的开销 ,这些数据一般都会保存到持久化存储 ...
随机推荐
- Linux 常用命令汇总
1.shutdown -s 时间 如果是想马上关机就直接输入0或者now: 2.init 0 这个是运行级别关机: 3.halt 这个命令不是很好用: 4.power off 这个命令也是很好用的. ...
- COM-TEAM
- Oracle实践--PL/SQL表分区的基础
PL/SQL基础入门之表分区 PL/SQL:过程语言(Procedure Language)和结构化语言(Structured Query Language)结合而成的编程语言.是对SQL的扩展.支 ...
- Base64中文不能加密问题
最近用到了Base64.js来对url参数进行加密,字母和数字都可以很好地加密/解密. 但测试中文时发现不能进行转换,貌似Base64.js不支持中文字符. 联想到encodeURI()对url的编码 ...
- 2款不同样式的CSS3 Loading加载动画 附源码
原文:2款不同样式的CSS3 Loading加载动画 附源码 我们经常看到的Loading加载很多都是转圈圈的那种,今天我们来换一种有创意的CSS3 Loading加载动画,一种是声波形状的动画,另一 ...
- (大数据工程师学习路径)第一步 Linux 基础入门----文件系统操作与磁盘管理
介绍 本节的文件系统操作的内容十分简单,只会包含几个命令的几个参数的讲解,但掌握这些也将对你在学习后续其他内容的过程中有极大帮助. 因为本课程的定位为入门基础,尽快上手,故没有打算涉及太多理论内容,前 ...
- 谈论HashMap,HashSet,HashTableeasy被我们忽视
在正常发育,HashMap,HashTable,HashSet 他们批准了经常使用的按键值地图数据结构.在这里,我主要写一些平时我们使用的这些数据结构easy忽略. HashMap HashMap的结 ...
- 《python源代码分析》笔记 pythonVM一般表达式
本文senlie原版的.转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.字节码指令 LOAD_CONST:从consts表中读取序号为i的元素并压入到执行时栈中 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
- javascript实现数据结构:广义表
原文:javascript实现数据结构:广义表 广义表是线性表的推广.广泛用于人工智能的表处理语言Lisp,把广义表作为基本的数据结构. 广义表一般记作: LS = (a1, a2, ..., an ...