`
kevinlynx
  • 浏览: 82962 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Android: Activity、进程、BoradcastReceiver生命周期

阅读更多
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
分享到:
评论

相关推荐

    Android实验二:Activity的生命周期及Intent

    1、设计界面,包括四个按钮,两个文本框。单击对应按钮可以启动对应...假定Activity A为启动Activity。 2、修改 Activity 的启动模式 LaunchMode,并通过 Log 信息来体会不同启动模式所对应的Activity 和 task 的关系

    Android Activity ABC页面跳转生命周期变化及activity + fragment生命周期变化

    总之,掌握Activity和Fragment的生命周期是Android开发者必备的基础技能。正确管理它们的生命周期可以避免内存泄漏,提高应用性能,并确保用户在各个界面之间的流畅切换。在实际开发中,我们需要根据需求灵活运用...

    Android 中从activity1跳转到activity2再回到activity所经历的生命周期

    ### Android 中从Activity1跳转到Activity2再回到Activity1所经历的生命周期 在Android开发过程中,理解Activity的生命周期对于管理界面状态、处理用户交互以及响应系统事件至关重要。本文将详细解析从一个Activity...

    android Activity生命周期

    Activity的生命周期是Android开发者必须深入理解的关键概念,因为它直接影响到应用的性能、内存管理和用户体验。本文将详细探讨Android Activity的生命周期,并通过源码分析和工具辅助来深化理解。 一、Activity...

    Android Activity生命周期

    Android Activity 生命周期 Android Activity 生命周期是指 Activity 从创建到销毁的整个过程,该过程中会经历多个状态变化,每个状态变化都会触发相应的回调方法。理解 Activity 生命周期是 Android 开发的基础。 ...

    android生命周期管理:重置一个Activity

    Android 生命周期管理:重置一个 Activity Android 生命周期管理是 Android 应用程序开发中一个非常重要的概念,涉及到 Activity 的生命周期管理,包括 Activity 的创建、启动、停止、销毁等过程。在 Android 中,...

    android生命周期管理:启动一个Activity

    当我们谈论“android生命周期管理:启动一个Activity”,我们关注的是如何启动Activity以及在生命周期中的关键回调函数。 1. 了解生命周期回调函数 Activity的生命周期由一系列的回调方法组成,包括onCreate(), ...

    Android Activity和Fragment的生命周期测试代码

    总的来说,理解和掌握Activity和Fragment的生命周期是Android开发的基础,它涉及到用户体验、性能优化和资源管理等多个方面。通过"LifecycleLog"这样的测试代码,开发者可以更好地理解生命周期机制,从而编写出更...

    Activity的生命周期(LifeCycle)

    为了确保系统的稳定性和流畅性,Android操作系统通过生命周期机制来动态管理应用进程,当内存紧张时,会选择性地关闭一些进程以释放内存。 #### 四、Activity的状态 1. **Active(活动)**:表示Activity正在运行...

    Android activity生命周期示例

    本示例项目“Android activity生命周期示例”旨在帮助开发者深入理解Activity的生命周期及其各个阶段,这对于优化用户体验和资源管理至关重要。 Activity的生命周期包括以下几个主要状态: 1. **创建(Created)**...

    Android之Activity的生命周期和Activity间的跳转和数据传递)

    ### Android之Activity的生命周期与Activity间的跳转及数据传递 #### Activity的概念与作用 在Android应用开发中,`Activity`是四大组件之一,主要负责管理应用程序的用户界面(UI)。一个Activity代表一个屏幕上的...

    android activity的生命周期小例子

    在这个“android activity的生命周期小例子”中,我们将探讨Activity在不同场景下如何启动、暂停、恢复和终止,以及如何在后台打印Activity的调用方法。 Activity的生命周期主要由以下几个关键方法组成: 1. `...

    android Activity生命周期详解(图文)

    首先,Activity的生命周期是Android系统管理组件的核心机制,它包括了创建、启动、暂停、恢复和销毁等几个关键状态。每个状态的变化都对应着特定的方法调用,如`onCreate()`, `onStart()`, `onResume()`, `onPause()...

    android启动以及activity生命周期分析

    ### Android启动及Activity生命周期分析 在Android开发过程中,理解应用程序如何启动及Activity的生命周期是非常重要的。这不仅有助于我们更好地管理程序的状态,还能帮助我们在遇到内存泄漏等问题时进行快速定位和...

    Activity生命周期演示

    日志追踪(完成以下六步、明白android的四种状态的生命周期和相互切换): 1、启动app、查看控制台输出,发现依次触发onCreate、onStart、onResume这三个方法 2、点击按钮(弹窗风格的Activity),控制台输出onPause...

    Android_Activity_生命周期例子

    本文将深入探讨Android Activity的生命周期,并通过具体的例子来帮助开发者更好地理解这一核心概念。 Android Activity的生命周期包括以下几个主要状态: 1. **初始化态(Created)**: 当Activity首次被创建时,会...

    Activity生命周期与启动模式

    理解Activity的生命周期和启动模式对于开发高效、稳定的应用至关重要。让我们深入探讨Activity的7大生命周期以及4种启动模式。 **Activity生命周期** Activity的生命周期包括了从创建到销毁的各个阶段,主要有以下...

    android_Activity生命周期

    Activity生命周期是Android开发中至关重要的一环,因为它决定了应用如何响应用户操作和系统事件。理解Activity的生命周期对于编写高效、稳定且用户体验良好的应用至关重要。 Activity的生命周期由多个关键状态组成...

    Android课程第一次实验报告_Andorid应用程序Activity生命周期.docx

    本实验报告将深入探讨Android应用程序,尤其是Activity、Service和Intent Receiver的生命周期,并解释如何正确管理这些组件以避免不必要的进程销毁。 首先,Android应用通常在独立的Linux进程中运行。当应用需要...

Global site tag (gtag.js) - Google Analytics