现在的位置: 首页 > 综合 > 正文

Android入门/Activity生命周期(三)

2018年05月26日 ⁄ 综合 ⁄ 共 7158字 ⁄ 字号 评论关闭

1.Activity是什么?

1.1 Acitvity是单独的,用于处理用户操作。

我们可以想象成"手机屏幕",你可以想象得到Activity的重要性。

几乎所有的Activity都需要与用户打交道。

我们可以使用setContentView(View)方法将UI界面展示在Activity创建的窗口上。

  onCreate(Bundle)接口是初始化Activity的地方。在这里通常使用setContentView(int),调用资源文件(XML)中定义的UI,使用findViewById(int)获得UI定义的控件。例如

setContentView(R.layout.xxx);

当然这里的xxx.xml布局文件,必须在layout/下面被创建。

:  )  也可以setContentView(View);  你自定义的View

          TextView textview = new TextView(this);

         
  textview.setText("Your Name");

            setContentView (textview);

2.Activity生命周期

2.1 Activity的生命周期

在Android系统中,Activity被一个Activity栈管理。

当一个新的Activity被启动时,将被压入栈。

之前未被销毁的Activity将被保留在栈中,知道新的Activity退出为止。

当用户按Back回退的时候,就会从栈中调出前一个Activity。

2.2 Activity的四种本质区别的状态

1. 在屏幕的前端(Activity的栈顶),叫做活动状态或者运行状态(active or running);

2. 如果一个Activity失去焦点,但是依然可见(一个新的非全屏的Activity或者透明的Activity被放置在栈顶),叫做暂停状态(pause)。

     一个Pause状态的Activity依然是保持活力(保持所有的状态,成员的信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。

3.如果一个Acitivity被另一个Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有的状态和信息,但是它是不可见的。所以在系统需要在其他地方用到内存的时候,Stopped的Activity将被杀掉。

4.如果Activity是Pause或者Stopped状态,系统可以将该Activity从内存中删除。Android有两种方式进行删除,结束该进程,或者,杀掉进程。

当Activity再次显示给用户看的时候,需要Restart跟Resume前面的状态。

2.3 Activity的生命周期图:

1. 整个生命周期,从onCreate()开始到onDestroy()结束。

Acitivity在onCreate()设置所有的“全局状态,在onDestroy()中释放所有的资源。

2. 可见的生命周期,从onStart()开始到onStop()结束。

这段时间,可以看到Acitivity在屏幕上,尽管有可能不在前台,不能跟用户交互。在这两个接口之间,

需要保持显示给用户的UI数据和资源等。

onStart()与onStop()都可以多次被调用,因为Activity随时可以在可见隐藏之间转换。

3. 前台的生命周期,从onResume()开始到onPause()结束。

在这段时间里,该Activity处于所有Activity的最前面与用户进行交互。

Activity可以经常性的在onResume与onPause状态之间切换。

onStop --> onStart ,当一辆车停下来,并且熄火了..当然要重新启动!

onResume --> onPause, 当一辆车停下来,但是没熄火,车主去买了包烟,那么他回到车上只需要踩油门,就能直接开动了~

比如,当设备准备休眠时,当一个Activity处理结果被分开时,当一个新的Intent被分发时。

3.Activity Code Example :

1.
新建一个项目
,修改activity_main.xml
如下:

<LinearLayout 
    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:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第一个Activity"
        tools:context=".MainActivity" />
    
    <Button	
        	android:id="@+id/second"
        	android:layout_width="fill_parent"
        	android:layout_height="wrap_content"
        	android:text="打开第二个Activity"
        	/>
</LinearLayout>

2. 接着创建一个second.xml 布局文件,如下:

<LinearLayout 
    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:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第二个Activity"
        tools:context=".MainActivity" />
    
    <Button	
        	android:id="@+id/exit"
        	android:layout_width="fill_parent"
        	android:layout_height="wrap_content"
        	android:text="退出"
        	/>
     <Button	
        	android:id="@+id/back"
        	android:layout_width="fill_parent"
        	android:layout_height="wrap_content"
        	android:text="返回第一个Acivity"
        	/>
</LinearLayout>

3.修改MainActivity.java文件

public class MainActivity extends Activity {

	private final static String TAG="Hello world";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        Log.v(TAG, "onCreate");
        setContentView(R.layout.activity_main);
        // 打开第2个activity的按钮
        Button btnSecond = (Button)findViewById(R.id.second);
        btnSecond.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent();
				intent.setClass(MainActivity.this, SecondActivity.class);
				MainActivity.this.startActivity(intent);
				//finish(); 是关闭还是销毁?
				// 关闭当前Activity
			}
		});
    }

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Log.v(TAG, "onStart");
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		Log.v(TAG, "onResume");
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		Log.v(TAG, "onPause");
	}
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Log.v(TAG, "onStop");
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.v(TAG, "onDestroy");
	}

    
}

4. 创建一个secondActivity.java的Activity的类

package com.example.cjq_activity;

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

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

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		Log.v(TAG, "onCreate");
		setContentView(R.layout.second);
		
		Button btnExit = (Button)findViewById(R.id.exit);
		btnExit.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
					finish(); // 销毁当前Activity
			}
		});
		
		Button btnBack = (Button)findViewById(R.id.back);
		btnBack.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent();
				intent.setClass(SecondActivity.this,MainActivity.class);
				startActivity(intent);
				
			}
		});
		
		
		
	}

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Log.v(TAG, "onStart");
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		Log.v(TAG, "onResume");
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		Log.v(TAG, "onPause");
	}
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Log.v(TAG, "onStop");
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.v(TAG, "onDestroy");
	}



	
	

}

我们可以通过上述的项目,测试Activity的流程,运行app。

项目首先被onCreate => onStart => onResume 

我们点击"打开第二个Activity"这个按钮,结果如下。

当启动第二个Activity的时候,第一个Acitivity首先执行了onPause()方法。然后紧接着创建第二个Activity。在第二个启动onResume()方法后,第一个Activity执行了onStop()方法。此时第一个Activity也就是不可见了。

此时我们点击,“返回第一个Activity” 它是否会像之前介绍的任务栈中。启动Restart()方法呢?我们尝试一下!

很显然这里并没有启动Restart()这个方法,那这是为什么呢?

我们这边是通过Intent来启动Activity的。那我们猜测,这里的Restart()可能是当用户点击Back(回退键)时产生的。

1、onCreate():创建Activity调用,用于Activity的初始化,还有个Bundle类型的参数,可以访问以前存储的状态。
2、onStart():Activity在屏幕上对用户可见时调用
3、onResume():Activity开始和用户交互的时候调用,这时该Activity是在Activity栈的顶部。
4、onPause():Activity被暂停时调用,也就是你要对你能看到的这个Activity说byebye的时候调用,这里可以做一些清理和保存工作
5、onStop():Activity被停止或者Activity变成不可见时调用
6、onDestroy():Activity被从内存中移除,一般发生在执行finish方法时或者Android回收内存的时候

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

千万不要忘记在Androidmanifest.xml配置文件中声明activity!! 

        <activity android:name="com.example.cjq_activity.SecondActivity"/>

========================= 关于Activity  启动模式的补充========================

Activity的两种启动模式:FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_REORDER_TO_FRONT

如果已经启动了四个Activity:A,B,C和D。

在D Activity里,我们要跳到B Activity,同时希望C finish掉,可以在startActivity(intent)里的intent里添加flags标记

    Intent intent = new Intent(this, B.class);   
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(intent);  

如果B的启动模式是默认的, 则启动情况是 D C B被销毁掉之后, 重新启动了B 活动

如果不希望B被销毁后 在New一个,则可以 在上面的代码上加一句

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);   

如果已经启动了四个Activity:A,B,C和D,

在D Activity里,想再启动一个Actvity B,但不变成A,B,C,D,B,而是希望是A,C,D,B,则可以像下面写代码:

    Intent intent = new Intent(this, MainActivity.class);  
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);   
    startActivity(intent);   




抱歉!评论已关闭.