Android中Activity和进程的生命周期是一个很重要的问题。Android对进程也采取了垃圾回收之类的机制,这意味着即使用户退出了程序,该进程依然可能存在于系统中。这将直接影响我们写的程序结构。
一个进程可能有若干个Activity。Activity退出后,进程可能并没有结束。下次用户从桌面启动该Activity时,会直接使用没有结束的进程。所以,想直接在主Activity中做程序初始化之类的操作,则需要小心。(实际上,Activity没有主次之分,说它是“主”,主要是因为它接受ndroid.intent.action.MAIN action)
如下代码:
package com.kl.test;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
class GlobalData {
public static final String LOGTAG = "TestLog";
private static GlobalData mInst = null;
public static GlobalData instance() {
if(mInst == null) {
Log.d(LOGTAG, "The instance is null.");
mInst = new GlobalData();
}
else {
Log.d(LOGTAG, "The instance is ready.");
}
return mInst;
}
}
public class Test2 extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(GlobalData.LOGTAG, "Activity onCreate.");
GlobalData.instance();
Observer.register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(GlobalData.LOGTAG, "Activity onDestroy.");
}
}
package com.kl.test;
import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.util.Log;
/*
* If the process has been terminated, the ContentObserver will not be called when
* the content changed.
* It's very same as Activity about life cycle.
*/
public class Observer extends ContentObserver {
private static final Uri CONTENT_URI = Uri.parse("content://sms");
private static boolean mRegistered = false;
Observer(Handler h) {
super(h);
}
@Override
public void onChange( boolean selfChange ) {
super.onChange(selfChange);
Log.d(GlobalData.LOGTAG, "Observer onChange.");
// test code.
GlobalData.instance();
}
public static void register(Context context) {
if(mRegistered) {
Log.d(GlobalData.LOGTAG, "Observer already registered.");
return;
}
mRegistered = true;
context.getContentResolver().registerContentObserver(CONTENT_URI, true,
new Observer( new Handler() ) );
Log.d(GlobalData.LOGTAG, "Observer register.");
}
}
GlobalData算是我们程序的逻辑数据,当运行以上程序时,第一次会得到如下日志输出:
12-24 11:58:58.923: DEBUG/TestLog(223): Activity onCreate.
12-24 11:58:58.983: DEBUG/TestLog(223): The instance is null.
12-24 11:58:59.014: DEBUG/TestLog(223): Observer register.
ContentObserver是当监听的content发生变化时,被回调。当按BACK回到桌面,并再次启动该程序时,则得到:
12-24 12:09:14.113: DEBUG/TestLog(223): Activity onCreate.
12-24 12:09:14.134: DEBUG/TestLog(223): The instance is ready.
12-24 12:09:14.154: DEBUG/TestLog(223): Observer already registered.
从上可以证实:
就算是activity都退出了,进程也不一定结束。进程不结束,进程内的静态数据就不会消失。
进程什么时候被终止?根据官方文档描述,一个重要的条件是,当系统发觉内存过少时,则会把一些没有处于前台的activity进程结束掉。我们可以使用DDMS直接终止进程。终止进程后,再启动activity,则会得到第一次的日志输出。
值得注意的是,如果我们的进程结束掉了,那么注册的ContentObserver则不会被调用。相反,如果进程依然存在,就算没有activity,ContentObserver也会被调用,并且不会创建其他activity。
此外,对于BroadcastReceiver:
package com.kl.test;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/*
* It will called even if the process has been terminated before. After it is called,
* the process will remain as usual for sometime.
*/
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(GlobalData.LOGTAG, "SmsReceiver onReceive.");
GlobalData.instance();
}
}
就算进程不在,BroadcastReceiver也会被调用,并且创建对应的进程。但是,并不会创建任何Activity。
BTW,activity中的数据会由于activity被销毁而被销毁。activity onDestroy了就真的是被destory了,意味着其在内存中的消失。在UI中缓存UI界面数据的需要注意一下。
PS,优化后的程序在进程已经存在的情况下,效率明显提升。:D
1.16.2011 update
BroadcastReceiver被调用时,会首先初始化所在的进程(如果进程之前被关闭),也就是会执行Application:onCreate
分享到:
相关推荐
1、设计界面,包括四个按钮,两个文本框。单击对应按钮可以启动对应...假定Activity A为启动Activity。 2、修改 Activity 的启动模式 LaunchMode,并通过 Log 信息来体会不同启动模式所对应的Activity 和 task 的关系
Android Activity ABC页面跳转生命周期变化及activity + fragment生命周期变化
日志追踪(完成以下六步、明白android的四种状态的生命周期和相互切换): 1、启动app、查看控制台输出,发现依次触发onCreate、onStart、onResume这三个方法 2、点击按钮(弹窗风格的Activity),控制台输出onPause...
Android_Activity_生命周期例子.主要通过几个activity 相互调用 解释生命周期,应该对大家了解android activity 的生命周期有所帮助
实验一 第一个Android程序和Activity生命周期。实验要求: 1.用工程向导生成第一个Android程序,并在模拟器上运行 注意在新建应用的选择SDK版本时选API 18 2.熟悉Android应用程序的基本文件结构 3.了解使用开发环境...
Android 中从activity1跳转到activity2再回到activity所经历的生命周期
android:Activity中切换不同状态页:加载中,加载失败,数据页,空页面……
android组件Activity 的生命周期
Android官方activity-lifecycle生命周期例子,参考网页: http://developer.android.com/training/basics/activity-lifecycle/index.html 方便了解Activity生命周期,提供了非常形象的说明。生动讲解。可以结合官网...
Android屏幕旋转时Activity的生命周期
有助于深入了解Android Activity生命周期的测试代码,可以结合博客http://blog.csdn.net/freetangxiaoying/article/details/17167819领悟。
Android的Activity周期 Android的Activity周期 Android的Activity周期 Android的Activity周期 Android的Activity周期 Android的Activity周期 Android的Activity周期 Android的Activity周期 Android的Activity周期
Activity和Service生命周期及使用AIDL通信
对于应用开发者来说,理解不同的应用组件(特别是Activity、Service、Intent Receiver)对应用进程的生命周期的影响,这是非常重要的。如果没有正确地使用这些组件,将会导致当应用正在处理重要的工作时,进程却被...
devDiv 移动开发丛书之android 第二章 activity 生命周期
android下activity生命周期 生命周期: 回调 描述 onCreate() 这是第一个回调,在活动第一次创建是调用 onStart() 这个回调在活动为用户可见时被调用 onResume() 这个回调在应用程序与用户开始可交互的时候调用 ...
Activity Fragment 生命周期研究
Android Activity和Fragment的生命周期测试代码,没事的时候可以玩玩。
Activity7大生命周期与4种启动模式(standard,singleTop,singleTask,singleIntance)
这是一个有关于Android开发平台的论文译文