如何在Android程序Force Closed后自动重启

在开发Android程序中,都会或多或少的遇到程序被Force Closed,那么如何让程序在Force Closed后自动重启呢?可以通过以下两部来简单实现:
1、在Activity的onCreate方法里初始化一个PendingIntent,你可以在intent中put一个针对crash的code,这样下次Activity启动后,就可以通过get code来判断是否是restart,以此来做一些事情。

Intent intent = getIntent();
int code = intent.getIntExtra(RESTART_INTENT_KEY, 0);

if (CRASHED_CODE == code)
{
    /** You can do something here. */   
    Log.d(TAG, "So sorry that the application crashed.");
}

intent.putExtra(RESTART_INTENT_KEY, CRASHED_CODE);
m_restartIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

2、为当前Activity的Thread设置一个UncaughtExceptionHandler,当某个Thread因为未捕获的异常而终止的时候会回调到它,这样只需要在uncaughtException(Thread thread, Throwable ex)方法的实现中,设置一个alarm来启动程序,如下边代码,程序将会在Crash 3秒后自动重启。

private UncaughtExceptionHandler m_handler = new UncaughtExceptionHandler()
{
    @Override
    public void uncaughtException(Thread thread, Throwable ex)
    {
        Log.d(TAG, "uncaught exception is catched!");
        AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 3000, m_restartIntent);
        System.exit(2);
    }
};
Thread.setDefaultUncaughtExceptionHandler(m_handler);

当然如果你觉得你的application在Force Closed后,自动重启并不是一个最佳的选择,也可以利用上述代码在程序Force Closed后保存一些程序Crash的Log,以便在以后的版本中修复Bug。

如何在android中为Http连接设置超时

最近在项目中因为与服务器打交道,所以经常需要进行Http请求操作,最开始写代码的时候并没有在意超时的问题,一开始还没什么问题,后来在Debug的时候发现有的线程一直结束不了,很占用资源。于是通过DDMS分析之后得出线程一直运行是因为线程中的Http请求没有设置超时时间,而刚好服务器也没有设置超时时间,于是线程就悲剧了。

Android中(更准确说是Java中)支持两种Timeout:connect timeout 和 socket timeout。

那么如何设置超时呢?

在通过HttpClient进行Http请求的时候,可以通过以下代码来设置Timeout:

HttpClient httpclient = new DefaultHttpClient();
HttpParams params = httpclient.getParams();
HttpConnectionParams.setConnectionTimeout(params,NetworkConstant.CONNECT_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, NetworkConstant.SOCKET_TIMEOUT);

在通过UrlConnection进行Http请求的时候,可以通过以下代码来设置Timeout:

URL url = new URL("http://www.google.com/");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(NetworkConstant.CONNECT_TIMEOUT);
conn.setReadTimeout(NetworkConstant.SOCKET_TIMEOUT);

既然有两种Timeout,那自然就有两种TimeoutException:ConnectTimeoutExceptionSocketTimeoutException,如果想分别处理的话分别Catch就可以了,如果要统一处理只要Catch住它们的父类InterruptedIOException

判断某个Intent是否可用(Android)

只要是了解过Android系统的人就一定知道Intent,Intent是一个表达你要干什么事情的工具,当你发出一个Intent后,系统内部能实现你想法的程序就会有响应,因此Intent让你的code更加modular and reusable。

开发Android程序的时候,经常会需要调用一些系统内部的程序,比如一个需要网络环境的App在启动后,首先要检查当前的网络环境是否正常,如果不正常,可以通过Intent的方式直接调用系统的网络设置界面,来引导用户处理问题。这种你能保证在每个机器里都有的程序,比如上边提到的Settings,你就不用担心找不到了。但是有时候,你可能会用到一些你不能确定所有用户设备内部都装有的App的时候,你就需要根据运行的实际环境来决定是否激活你App的某些功能,费了一大堆话,下边直接上代码:
继续阅读