开发者社区> 啊啊啊88jdk> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Android捕获全局异常

简介: Android捕获全局异常 程序避免不了出现bug,导致程序崩溃,为了尽量不影响用户体验,可以全局捕获异常 效果图 异常捕获处理前 异常捕获处理后(将程序重新启动) 捕获异常的工具类 package com.
+关注继续查看

Android捕获全局异常

程序避免不了出现bug,导致程序崩溃,为了尽量不影响用户体验,可以全局捕获异常

效果图

  • 异常捕获处理前

P1

  • 异常捕获处理后(将程序重新启动)

P2

捕获异常的工具类

package com.example.kongqw.exceptiondemo;

import android.content.Context;
import android.support.v7.internal.app.ToolbarActionBar;
import android.util.Log;
import android.widget.Toast;

/**
 * Created by kongqw on 2015/11/3.
 */
public class KqwException implements Thread.UncaughtExceptionHandler {
    private static KqwException myCrashHandler;

    private Context mContext;

    private KqwException(Context context) {
        mContext = context;
    }

    public static synchronized KqwException getInstance(Context context) {
        if (null == myCrashHandler) {
            myCrashHandler = new KqwException(context);
        }
        return myCrashHandler;
    }

    public void uncaughtException(Thread thread, Throwable throwable) {
        long threadId = thread.getId();
        String message = throwable.getMessage();
        String localizedMessage = throwable.getLocalizedMessage();
        Log.i("KqwException", "------------------------------------------------------");
        Log.i("KqwException", "threadId = " + threadId);
        Log.i("KqwException", "message = " + message);
        Log.i("KqwException", "localizedMessage = " + localizedMessage);
        Log.i("KqwException", "------------------------------------------------------");
        throwable.printStackTrace();
        Log.i("KqwException", "------------------------------------------------------");

        // TODO 下面捕获到异常以后要做的事情,可以重启应用,获取手机信息上传到服务器等
        Log.i("KqwException", "------------------应用被重启----------------");
        // 重启应用
        mContext.startActivity(mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName()));
        //干掉当前的程序
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

使用

在Application下添加Handler

注册Application

在清单文件下添加name属性

<application
    ……
    android:name=".InitApplication"
    …… >
    <activity
        …… >
        <intent-filter>
            ……
        </intent-filter>
    </activity>
</application>

Application

package com.example.kongqw.exceptiondemo;

import android.app.Application;

/**
 * Created by kongqw on 2015/11/3.
 */
public class InitApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        KqwException handler = KqwException.getInstance(this);
        Thread.setDefaultUncaughtExceptionHandler(handler);
    }
}

测试类

package com.example.kongqw.exceptiondemo;

import android.app.Activity;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void bug(View view) {
        Toast.makeText(this, "程序崩溃", Toast.LENGTH_SHORT).show();
        // 除数为0 导致程序崩溃
        int a = 1 / 0;
    }
}

XML布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/activity_main">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="bug"
        android:text="点击程序崩溃" />
</RelativeLayout>

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android自定义崩溃收集器捕获java层和native层崩溃异常日志
Android自定义崩溃收集器捕获java层和native层崩溃异常日志
0 0
Android 捕获错误日志(下篇)
前提 昨天写了捕获错误日志的文章,但是没有写上传到服务器的部分,今天就针对上传服务器的部分进行编写和分析,如果没有观看的请先移步到上篇Android 捕获错误日志(上篇)。
1027 0
Android 捕获错误日志(上篇)
前提 今天在群里聊天的时候有群友问如何捕获错误日志,我说可以自己写,也可以用第三方的比如腾讯的bugly,友盟的错误统计等等,但是那些是别人的东西,作为一个程序员当然是要知其然,并且要知其所以然。
951 0
Android 异常信息打印(适用于捕获应用崩溃信息收集)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.
569 0
Android捕获监听Home键、最近任务列表键
package zhangphil.home; import android.app.Activity; import android.
1050 0
Android Studio进行APP设计开发之矢量图及XML文件转换
Android Studio进行APP设计开发之矢量图及XML文件转换
0 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Android组件化实现
立即下载
蚂蚁聚宝Android秒级编译—— Freeline
立即下载
Android插件化:从入门到放弃
立即下载