Android知识点归纳

1.如果发布的APP在客户机运行是出现错误,如何获得错误信息(android程序崩溃时的异常捕获);

在编写APK程序时,通常会导致程序崩溃的异常,在通常情况下这些异常不能被捕获到 有没有一种方法能够将这些异常捕获呢,Java前辈们早就想到了,不错就是这个Thread.UncaughtExceptionHandler 
那么如何使用呢?非常简单,请听我慢慢说来。  
从名字就可以看出来UncaughtExceptionHandler是针对某个线程而言的,同时Thread提供了3个相关的方法  
void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 为一个线程设置一个Handler 
Thread.UncaughtExceptionHandler getUncaughtExceptionHandler() 获取该线程的handler 
static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 为一个线程设置一个默认的Handler,在程序不能捕获而退出,并且么有其他的handler时被调用 
static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()  
所以只要通过set方法,为一个线程设置一个handler就可以在程序异常退出时,捕获该异常,下面是Demo:


Thread thread = new thread(new Runnable(){
 public void run() { 
  //Do something can throw runtime exception. 
 }
}); 

thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){ 
 @Override 
 public void uncaughtException(Thread thread, Throwable ex) { 
  //TODO 
  System.out.println(ex.getLocalizedMessage()); 
 });

线程的运行时异常就会被捕获,你就可以对捕获到异常进行处理  

但是,犹豫在android编程中,大量使用线程,如果统一处理呢?因为 主线程只有一个,我们可以在主线程里处理。 
我们可以在主activity启动时的 onCreate()方法里面添加下面代码 



Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
 public void uncaughtException(Thread thread, Throwable ex) { 
  //TODO 
  System.out.println(ex.getLocalizedMessage());
  finish(); 
 } 
});  

 这样就可以捕获大部分的运行时异常


2.如何更好的解决Activity退出不干净的问题(如何实现APP完美退出);

网上流传的三个常用方法并不能彻底解决问题:


1.killProcess, 这种方式当你kill后 Activity 会返回到上一个Activity
2.Android Level 8(包含8)前使用一个API来操作,Level8以后又是另外一种,所以不能通用
3.使用 FLAG_ACTIVITY_CLEAR_TOP,从 A 到 B

下面介绍自己的方式:

大家都知道 Android 的 Activity 是存着历史栈的,比如从 A -> B -> C,C 完成 finish 后回到 B,把所有的Activity 都 finish了,程序就自然退出了。 当然在 finish 的同时也需要释放自己程序的其他资源。所以需要想个办法把 Activity 给存起来。然后在程序退出的地方调用它们的 finish()方法。
使用 全局变量。对了,第一个想到的就是继承 Application,代码入下。
public class AgentApplication extends Application {

private List<Activity> activities = new ArrayList<Activity>();

	public void addActivity(Activity activity) {
		activities.add(activity);
	}

	@Override
	public void onTerminate() {
		super.onTerminate();
		
		for (Activity activity : activities) {
			activity.finish();
		}
		
		onDestroy();
		
		System.exit(0);
	}
}


然后 在 Activity  onCreate 的时候来调用  addActivity (),有人可能想到这个Application需要在所有的 Activity  onCreate的时候都使用,需要做一个单例实例。其实根本不需要。在 Activity 中使用  this.getApplication() 就可以了。
最后在你需要 退出程序的地方调用 application.onTerminate() 就可以了。记住:super.onTerminate() 必须调用,代码中的 onDestroy()是我自己的释放其他资源的方法,不是系统的。

运行以上代码后,在LogCat 中会出现一行提示:
Process  包名 (pid  xxxxx)  has died.  证明你的程序退出了。现在你可以测试了。
【转自:http://blog.csdn.net/zeus_9i/article/details/7259881】


3.关于Activity与Service的详细分析;

区别:Service,运行在后台,不能自己运行,需要Activity与Service需要通过某一个Activity或者其他Context对象来调用, Context.startService() 和 Context.bindService()。

Activity与Service需要通两种启动Service的方式有所不同。这里要说明一下的是如果你在Service的onCreate或者onStart做一些很耗时间的事情,最好在 Service里启动一个线程来完成,因为Service是跑在主线程中,会影响到你的UI操作或者阻塞主线程中的其他事情。过某一个Activity或者其他Context对象来调用, Context.startService() 和 Context.bindService()。

什么时候需要Service呢?比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。


什么时候那接下来用代码来说明一下怎么使用Service,这里我们要讲的是Local Service也就是你自己的一个Service, 你也可以操作别的应用程序的service如果它允许你那么去做的话,这就设计到一个比较麻烦的东西interprocess communication (IPC),在不同的进程中通信需要Service呢?比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。

Service的生命周期

Service的生命周期Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。

1.通过startService

Service会经历onCreate->onStart()->stopService的时候直接onDestroy

如果是调用者(TestServiceHolder)自己直接退出而没有调用stopService的话,Service会一直在后台运行。下次TestServiceHolder再起来可以stopService。

2 通过bindService

Service只会运行onCreate, 这个时候 TestServiceHolder 和TestService绑定在一起2 通TestServiceHolder 退出了,Srevice就会调用onUnbind->onDestroyed所谓绑定在一起就共存亡了。过bindServiceService只会运行onCreate, 这个时候 TestServiceHolder 和TestService绑定在一起

一个原则是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又 bindService,Service只被创建一次。如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,对啊,就是stopService不好使了,只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。

你可能感兴趣的:(Android知识点归纳)