Android游戏《歪把子炮》源码
http://www.eoeandroid.com/thread-197425-1-1.html

Android 新版捕鱼达人源码
http://www.eoeandroid.com/thread-197437-1-1.html

Android版本的手机RSS阅读器的源码
http://www.eoeandroid.com/thread-197465-1-1.html

最近新产品测试,频频出现异常。所以需要对异常进行全局捕捉。
翻阅大量帖子、源码终于找到了UncaughtExceptionHandler接口。废话不多说还是直接上源码吧。


首先实现UncaughtExceptionHandler

public class CatchHandler implements UncaughtExceptionHandler{         private CatchHandler() {        }         public static CatchHandler getInstance() {                 return mCatchHandler;        }         private static CatchHandler mCatchHandler = new CatchHandler();         private Context mContext;         private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");         @Override        public void uncaughtException(Thread thread, Throwable ex) {                if (thread.getName().equals("main")) {                        ToastException(thread, ex);                        try {                                Thread.sleep(3000);                        } catch (InterruptedException e) {                        }                        android.os.Process.killProcess(android.os.Process.myPid());                        System.exit(1);                } else {                        handleException(thread, ex);                }         }         public void init(Context context) {                mContext = context;                Thread.setDefaultUncaughtExceptionHandler(this);        }         private void ToastException(final Thread thread, final Throwable ex) {                new Thread() {                        @Override                        public void run() {                                Looper.prepare();                                StringBuilder builder = new StringBuilder();                                builder.append("At thread: ").append(thread.getName())                                                .append("\n");                                builder.append("Exception is :\n").append(ex.getMessage());                                 Toast.makeText(mContext, builder.toString(), Toast.LENGTH_LONG)                                                .show();                                Looper.loop();                        }                }.start();        }         private void handleException(final Thread thread, final Throwable ex) {                Intent intent =new Intent("per.xch.test2_35.main");                <font color="#00ed00">intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);</font>                mContext.startActivity(intent);        }}

然后在项目中引用

public class CatchApplication extends Application {        @Override        public void onCreate() {                super.onCreate();                CatchHandler.getInstance().init(getApplicationContext());        }}

注意

<application        <font color="#00ed00">android:name=".CatchApplication"</font>

最后测试下

public class MainActivity extends Activity {     @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                 new Thread(new Runnable() {                                                 @Override                        public void run() {                                 throw new NullPointerException("please catch me! sub thread");                        }                }).start();        throw new NullPointerException("please catch me! sub thread");            }     @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.activity_main, menu);        return true;    }}

之所以在主线程和其他线程采用不同处理方式因为主线程崩溃很大程度上就没的救了。
还有要注意的是intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
原因很简单,源码写的很明白


ContextImpl.java

  @Override    public void startActivity(Intent intent) {        if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {            throw new AndroidRuntimeException(                    "Calling startActivity() from outside of an Activity "                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."                    + " Is this really what you want?");        }        mMainThread.getInstrumentation().execStartActivity(            getOuterContext(), mMainThread.getApplicationThread(), null,            (Activity)null, intent, -1);    }

至于怎么把activity怎么变成dialog我就不废话喽,吼,闪人。

原文链接:http://www.eoeandroid.com/thread-197442-1-1.html

更多相关文章

  1. Android(安卓)SDK各版本源码
  2. Android安卓51个开源代码
  3. Android(安卓)Universal Image Loader 源码分析
  4. Android安卓51个开源代码
  5. Android(安卓)线程归纳
  6. 【30篇突击 android】源码统计二
  7. Android屏幕尺寸、标题栏高度、状态栏高度、当前View尺寸
  8. 20个Android游戏源码,…
  9. Android异步处理四:AsyncTask的实现原理

随机推荐

  1. 如何将Eclipse中的项目迁移到Android(安
  2. Android应用配置签名
  3. android 自定义相机 取矩形内内容 注意事
  4. 【Android(安卓)电量优化】电量优化 ( Ba
  5. 如何用命令(cmd)创建开启AVD
  6. android读写文件
  7. 更改.android目录位置
  8. 有关Android线程的学习
  9. 获取Android(安卓)SDK 源代码并在Eclipse
  10. Android(安卓)TextView属性详解