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 Universal Image Loader 源码分析
  3. Android 线程归纳
  4. 【30篇突击 android】源码统计二
  5. 20个Android游戏源码,…
  6. AsyncTask源码分析
  7. Android多线程(一)
  8. Android的消息机制源码分析
  9. Android 源码分析 - 消息处理机制

随机推荐

  1. android UI小结(五)
  2. Android 组件安全
  3. android - ViewPager 监听左右滑动
  4. Error: Error parsing D:\android-sdk-w
  5. OpenMax在Android上的实现
  6. android图形化学习1
  7. 认识Android手机--来自MIUI
  8. Android启动过程(转)
  9. NDK编译:fatal error: GLES2/gl2platform.
  10. SystemUI 下拉栏快捷键隐藏(一)