32.activity的生命周期

本文详细介绍了Android中Activity的生命周期,包括各个回调方法的作用及调用时机,并提供了示例代码帮助理解。此外,还讨论了不同启动模式下Activity的行为差异及横竖屏切换时的生命周期处理。

什么是activity

Activity是安卓四大组件之一(还有Service、BroadcastReceiver、ContentProvider)

acivity的生命周期如下:


onCreate:Activity创建的时候被调用
onStart:Activity能被用户看见,但是没有获得焦点
onResume:Activity获得焦点,此时Activity成为前台Activity
onPause:Activity失去焦点,但是依然可见
onStop:Activity不可见,此时Activity成为后台Activity
onDestroy:Activity被销毁
内存不足时,系统会优先杀死后台Activity所在的进程,都杀光了,如果内存还是不足没那么就会杀死在暂停状态的Activity所在的进程,如果还是不够,有可能杀死前台进程。
如果有多个后台进程,在选择杀死目标时,采用最近少用使用算法(LRU)

1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

参考代码如下(通过两个activity之间的跳转来查看activity的生命周期):

创建第一个activity

<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=".MainActivity" 
    android:orientation="vertical"
    >


    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第一个activity"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳转" 
        android:onClick="click"
        />


</RelativeLayout>
package com.ldw.lifecycle;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;


public class SecondActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		
		System.out.println("onCreate方法被调用");
	}
	
	@Override
	protected void onStart(){
		super.onStart();
		System.out.println("onStart方法调用");
	}
	
	@Override
	protected void onResume(){
		super.onResume();
		System.out.println("onResume方法调用");
	}
	
	@Override
	protected void onPause(){
		super.onPause();
		System.out.println("onPause方法调用");
	}
	
	@Override
	protected void onStop(){
		super.onStop();
		System.out.println("onStop方法调用");
	}
	
	@Override
	protected void onDestroy(){
		super.onDestroy();
		System.out.println("onDestroy方法调用");
	}
	
	@Override
	protected void onRestart(){
		super.onRestart();
		System.out.println("onRestart方法调用");
	}

}

创建第二个activity

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第二个activity"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳转到第一个activity" 
        android:onClick="click1"
        />
</LinearLayout>

package com.ldw.lifecycle;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;


public class SecondActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		
		System.out.println("第二个onCreate方法被调用");
	}
	
	public void click1(View v){
		Intent intent = new Intent(this, MainActivity.class);
		startActivity(intent);
	}
	
	@Override
	protected void onStart(){
		super.onStart();
		System.out.println("第二个onStart方法调用");
	}
	
	@Override
	protected void onResume(){
		super.onResume();
		System.out.println("第二个onResume方法调用");
	}
	
	@Override
	protected void onPause(){
		super.onPause();
		System.out.println("第二个onPause方法调用");
	}
	
	@Override
	protected void onStop(){
		super.onStop();
		System.out.println("第二个onStop方法调用");
	}
	
	@Override
	protected void onDestroy(){
		super.onDestroy();
		System.out.println("第二个onDestroy方法调用");
	}
	
	@Override
	protected void onRestart(){
		super.onRestart();
		System.out.println("第二个onRestart方法调用");
	}

}
Activity启动模式
标准模式:默认就是,不用设置
singleTop:如果站定已经是该activity,就无法再启动,如果栈顶不是,那么就会启动。
singleTask:如果该activity没有启动过,会启动并跳转到该activity,即该activity会出现在栈顶,如果该activity启动过,但不在栈顶,那么再次启动时会返回到该activity,即把该activity上方所有的activity都销毁。对于singleTask的activity,在任务栈中,永远只有一个该activity实例。
singleInstance:该activity启动时,会在新的任务站中启动,并且只会启动一次,以后再启动该activity时,其实知识把该activity所在的任务栈移动到前台。单例模式的activity,内中永远只有一个,10个应用启动单例模式的activity,都只是把该activity所在的任务栈移动到前台。

android横竖屏切换的时候会触发生命周期的方法,设置一下可以不用出发生命周期的方法
android:configChanges="orientation|keyboardHidden|screenSize"
orientation:水平竖直切换的时候不触发生命周期方法
keyboardHidden:键盘影藏的时候不触发生命周期的方法
screenSize:屏幕大小变化的时候不触发生命周期的方法。


参考博客:http://blog.youkuaiyun.com/liuhe688/article/details/6733407

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值