zoukankan      html  css  js  c++  java
  • 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("
    ");
    		}
            System.out.println("stringBuilder.toString()如下:"+"
    "+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>



     

  • 相关阅读:
    java基础(六):RabbitMQ 入门
    Spring Boot 入门(六):集成 treetable 和 zTree 实现树形图
    Geoserver+Openlayers拉框查询
    Spring Boot 入门(五):集成 AOP 进行日志管理
    Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理
    java基础(五):谈谈java中的多线程
    java基础(四):谈谈java中的IO流
    java基础(三):谈谈java异常的处理
    java基础(二):谈谈Java基本数据结构
    Java编译时常量和运行时常量
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3233896.html
Copyright © 2011-2022 走看看