Android借助Application重写App的Crash(完整版)
发布日期:2021-06-30 11:24:22 浏览次数:3 分类:技术文章

本文共 5373 字,大约阅读时间需要 17 分钟。

MainActivity如下:

package cn.testcrash;import android.app.Activity;import android.os.Bundle;/** * Demo描述: * 借助于Application自定义Crash *  * 备注说明: * 1 在获取Crash信息后可依据业务上传服务器或者保存至SDCard * 2 在uncaughtException()中的第三步——退出程序.此处只是做了 *   最简单的处理.完备的操作请参见: *   http://blog.csdn.net/lfdfhl/article/details/9261147 *   http://blog.csdn.net/lfdfhl/article/details/9260605 *    * 参考资料: * 1 http://blog.csdn.net/xiaanming/article/details/9344703 * 2 http://blog.csdn.net/itachi85/article/details/9102021 * Thank you very much */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) {		 //1 保存错误日志到SD卡         Utils.saveCrashInfoToSDCard(mContext, throwable);         //2 提示Crash信息         showCrashTipToast();         try {			Thread.sleep(3000);		} catch (Exception e) {		}         //3 退出应用         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.io.PrintWriter;import java.io.StringWriter;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 saveCrashInfoToSDCard(Context context, Throwable throwable) {		StringBuilder crashInfoStringBuilder=new StringBuilder();				//获取Crash时间		String crashTime=getCrashTime();		crashInfoStringBuilder.append("------------------"+"\n");		crashInfoStringBuilder.append(crashTime+"\n");		crashInfoStringBuilder.append("------------------"+"\n");				//获取Crash时设备及该App的基本信息		HashMap
hashMap=getBaseInfo(context); for(Map.Entry
entry:hashMap.entrySet()){ String key=entry.getKey(); String value=entry.getValue(); crashInfoStringBuilder.append(key).append("=").append(value).append("\n"); } crashInfoStringBuilder.append("------------------"+"\n"); //获取导致Crash的时间 String uncaughtException=getUncaughtException(throwable); crashInfoStringBuilder.append(uncaughtException+"\n"); crashInfoStringBuilder.append("------------------"+"\n"); System.out.println("crashInfo如下:"+"\n"+crashInfoStringBuilder.toString()); } /** * 获取设备及该App的基本信息 */ public static HashMap
getBaseInfo(Context context){ HashMap
hashMap = new HashMap
(); 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; } /** * 获取造成Crash的异常的具体信息 */ public static String getUncaughtException(Throwable throwable){ StringWriter stringWriter = new StringWriter(); PrintWriter printWriter = new PrintWriter(stringWriter); throwable.printStackTrace(printWriter); printWriter.close(); String uncaughtException=stringWriter.toString(); return uncaughtException; } /** * 获取Crash的时间 */ public static String getCrashTime(){ 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); return currentTime; }}

 

AndroidManifest.xml如下:

main.xml如下:

 

转载地址:https://it9527.blog.csdn.net/article/details/9716229 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:获取异常的详细信息
下一篇:Android借助Application重写App的Crash(简易版)

发表评论

最新留言

很好
[***.229.124.182]2024年04月19日 21时35分04秒