Android学习笔记之----Activity(一)生命周期

API:An activity is a single, focused thing that the user can do.

译:一个活动是一个单独的个体,负责处理用户做的事件。(大概就是这个意思,汗,这个还真不好翻译,呵呵。)

下面这张是官方给出的Activity的生命周期图:

    从这张图中,我们可以看出5条路线:

    1、onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy....

    2、onCreate -> onStart -> onResume -> onPause -> App process killed -> onCreate....

    3、onCreate -> onStart -> onResume -> onPause -> onStop -> App process killed -> onCreate....

    4、onCreate -> onStart -> onResume -> onPause -> onResume....

    5、onCreate -> onStart -> onResume -> onPause -> onStop -> onRestart -> onStart....

 

    那么这些路线是什么意思呢?下面我们来仔细阅读下。(在本文最后会上传一个DEMO,结合DEMO看会更加清晰.)

    在前文中我们谈到了Android进程,在这里可以结合起来,下面我们来一一分析上面的5条路线:

    1、当一个Activity启动的时候,系统会调用他的onCreate,onStart,onResume方法,这时候,Activity处于可以和用户交互的状态,当然,也就是说现在Activity是位于前台进程,这时候,如果用户按下了Back键退出了App,那么,系统会依次调用Activity的onPause,onStop,onDestroy方法,这时候Activity就变成了空进程。

 

    2、前面的同上,我们来看onPause方法执行后,这时,我们的Activity还是处于可见状态,他处于可见进程级别,但是,用户现在不能与他直接交互,如果系统资源不够了,那么,我们的App很可能被杀死,然后,当我们回到Activity的时候,系统会调用Activity的onCreate,onStart,onResume方法,来重新生成一个Acitivity。

 

    3、前面的同上,当Activity执行到onStop的时候,也就是说,我们按下了Home键,这时候,Activity的进程处于后台进程,后台进程的优先级仅略高于空进程,当系统资源不足的时候,就会被系统杀死,然后,当我们重新回到App的时候,系统又会调用Activity的onCreate,onStart,onResume方法,来重新生成一个Acitivity。

 

    4、这种情况类似上面的第二种情况,只是从这种情况看来,系统资源还比较充足,不用去杀死这个可见进程,然后,当我们重新回到主Activity的时候,系统就会调用Activity的onResume方法,让他又处于前台进程级别。

 

    5、这种情况类似上面的第三中情况,当我们按下Home键后,又重新返回到Activity中,当然,这时候,系统资源还是比较富裕,还不至于去杀掉他,所以,我们的Activity从后台进程级别又回到了前台进程级别。

 

下面是测试截图:

test_1:    运行程序打印的日志;

test_2:    点击"测试OnPause状态"打印的日志;

test_3:    取消弹窗后打印的日志;

test_4:    按下手机Home键后,打印的日志;

test_5:    重新返回Activity后打印的日志;

test_6:    旋转手机屏幕后,打印的日志;

test_7:    按下退出键后打印的日志;


test_8:    手机内存不足时打印的日志???

(暂时没想到方案测试该种情况,不过大致可以预测出来)其实各大生命周期有其特别的存在,只要动动手测试下,在项目中某些特定的场合就能派上大用场; 比如: 

onSaveInstanceState状态从以上测试截图得知其运行条件有2种:1,按下Home键;2,手机屏幕旋转;
onRestoreInstanceState状态则只会在手机屏幕旋转后才会执行一次;
onPause状态则与onResume状态对应存在,也就是说只要离开当前页面或程序, onPause状态就会执行, 而当回到当前页面,则onResumu状态就会执行;假设现在需要你判断手机屏幕是否旋转,然后进行对应的操作, 那么这个时候就有2种方案可执行:1,在onRestoreInstanceState设置个falg当onRestoreInstanceState执行时,我们就可以知道;2,利用onSaveInstanceState和onDestroy状态设置flag,我们也可以得知,因为按下Home键时onSaveInstanceState才会被调用一次,但是按下Home键时不会执行onDestroy方案;还有onPause 和 onResume用得是比较多的了,还记得友盟统计吗,哈哈,现在应该知道友盟统计为什么让我们在onPause和onResume中加方法了吧,这就是统计时长的原理了.
(注:本篇博客写得比较早了,最近心血来潮上来补充点东西.下面的DEMO就没加上onSaveInstanceState,onRestoreInstanceState,onWindowFocusChanged 3个方法,自行加上就好了测试下,加深印象.)

 

    下面我们新建一个名为TestActivityCycleLife的工程,让我们来看看他的执行效果,代码如下:

    首先是我们的TestActivityCycleLife的Java代码:

 

package com.testactivitycyclelife;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.app.Activity;
import android.content.Intent;

public class TestActivityCycleLife extends Activity {
	private static final String TAG = "TestActivityCycleLife";

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.test_activity_cycle_life);

		this.findViewById(R.id.testOnPause).setOnClickListener(mClick);
		Log.e(TAG, "onCreate is executing!");
	}

	//TextView的点击事件监听,为了测试执行onPause的情况
	private OnClickListener mClick = new OnClickListener() {

		public void onClick(View v) {
			Intent intent = new Intent(TestActivityCycleLife.this,	TestOnPause.class);
			startActivity(intent);
		}
	};

	protected void onStart() {
		super.onStart();
		Log.e(TAG, "onStart is executing!");
	}

	protected void onResume() {
		super.onResume();
		Log.e(TAG, "onResume is executing!");
	}

	protected void onPause() {
		super.onPause();
		Log.e(TAG, "onPause is executing!");
	}

	protected void onRestart() {
		super.onRestart();
		Log.e(TAG, "onRestart is executing!");
	}

	protected void onStop() {
		super.onStop();
		Log.e(TAG, "onStop is executing!");
	}

	protected void onDestroy() {
		super.onDestroy();
		Log.e(TAG, "onDestroy is executing!");
	}

}


    接着是TestActivityCycleLife的布局文件名为test_activity_cycle_life.xml:

 

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".TestActivityCycleLife" >

    <TextView
        android:id="@+id/testOnPause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="@string/test_onPause"
        android:textSize="20sp" />

</RelativeLayout>


    下面为了单独测试onPause方法所写的Activity名为TestOnPause:

 

 

package com.testactivitycyclelife;

import android.app.Activity;
import android.os.Bundle;

public class TestOnPause extends Activity {

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.test_onpause);
	}

}

    接着是TestOnPause的布局文件名为test_onpause.xml:

 

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#0000ff" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="@string/app_name"
        android:textSize="18sp" />

</RelativeLayout>


    最后是我们最重要的Manifest文件的代码:

 

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.testactivitycyclelife"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.testactivitycyclelife.TestActivityCycleLife"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.testactivitycyclelife.TestOnPause"
            android:label="@string/app_name" 
            
            android:theme="@android:style/Theme.Dialog">
            <!-- 上面这句是使得Activity以Dialog的形式显示,为了实现onPause方法单独执行  -->
        </activity>
    </application>

</manifest>


    测试生命周期DEMO链接:TestActivityCycleLife

    推荐同类文章: 基础总结篇之一:Activity生命周期       两分钟彻底让你明白Android Activity生命周期(图文)!

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值