Activity的生命周期

Activity是具有生命周期的,以下是Activity的生命周期图:


(来自Android SDK的帮助文档)

【例01】

为了让大家更加清楚地看到Activity的生命周期,来创建一个新的Android Application Project,并按照默认配置创建一个Activity。

以下是默认的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="net.csdn.activitylifecycle.MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

以下是默认的Java文件。

package net.csdn.activitylifecycle;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}


首先删除掉不必要的代码。

package net.csdn.activitylifecycle;

<pre name="code" class="java">import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}

 

接下来,我们按生命周期图依次实现全部的callback方法。

package net.csdn.activitylifecycle;

...//导入

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		System.out.println("onCreate");
	}
	@Override
	protected void onStart() {
		super.onStart();
		System.out.println("onStart");
	}
	...//省略其它callback方法
}


值得注意的是,在调用System.out.println()输出之前,需要先执行父类的callback方法。

现在将其运行到一个Android模拟器或者真机上去,打开Logcat查询结果。

这里告诉大家一个小窍门:使用System.out.println输出的信息的TAG是System.out。所以只要在Logcat上方的输入框中输入“tag:System.out”,并把右侧的消息等级选为“info”(显示info,warn,err和assert),就可以过滤掉所有其它内容了。在运行新的app或者需要清除log时,可以单击右侧的Clear Log。

可以看到,在运行开始时,显示如下:

onCreate(Activity被创建,必定接着onStart)

onStart(必定接着onResume)

onResume

按下home键,显示如下:

onPause(另一个activity[启动器]来到前台)

onStop(MainActivity被完全遮盖了)

重新返回应用,显示如下:

onRestart(用户重新导航到activity,必定接着onStart)

onStart(必定接着onResume)

onResume

退出应用,显示如下:

onPause(另一个activity[启动器]来到前台)

onStop(MainActivity被完全遮盖了)

onDestroy(用户结束了这个Activity)

如果再次进入,会产生一个新的生命周期。

【例02】

在Activity中调用finish()方法也能够结束这个Activity,并调用onDestroy() callback方法。

将例01进行修改,在onCreate方法中添加如下语句:

finish();

运行后可以看出,程序一闪而过,只是输出了以下两条信息:

onCreate

onDestroy

可以看出,调用finish()会直接onDestroy,不会调用onPause和onStop,因为它们需要另一个activity来到前台替换这个activity时,或者这个activity不再显示时才会调用,而自身调用finish()是不会执行它们的。

【例03】

Activity切换间的生命周期。

注释掉finish();语句(注释/反注释 快捷键为Ctrl+/)并把每一个callback方法的输出前面加一个"A",如下:

package net.csdn.activitylifecycle;

...//导入

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		System.out.println("A onCreate");
//		finish();
	}
	@Override
	protected void onStart() {
		super.onStart();
		System.out.println("A onStart");
	}
	...//省略其它callback方法
}

之后来创建一个BActivity,复制callback方法的代码并把A改为B。如下:
package net.csdn.activitylifecycle;

...//导入

public class BActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_b);
		System.out.println("B onCreate");
	}
	@Override
	protected void onStart() {
		super.onStart();
		System.out.println("B onStart");
	}
        ...//省略其它callback方法
}
在activity_main.xml文件中,添加一个Button。XML代码如下(推荐使用LinearLayout):
<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="net.csdn.activitylifecycle.MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="toBActivity" />

</LinearLayout>
OK,XML文件配置完成。打开MainActivity.java文件,在onCreate中添加如下语句(注意一定要在setContentView后面)

findViewById(R.id.btn).setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v) {
				startActivity(new Intent(MainActivity.this,BActivity.class));
			}
		});

需要在上面两个import后面加上:

import android.view.View;

还有这句也要:

import android.content.Intent;

这是一个匿名内部类。如果你看不懂,也可以这么写:

package net.csdn.activitylifecycle;

...//导入

public class MainActivity extends Activity implements View.OnClickListener{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		System.out.println("A onCreate");
//		finish();
//		findViewById(R.id.btn).setOnClickListener(new View.OnClickListener(){
//			@Override
//			public void onClick(View v) {
//				startActivity(new Intent(MainActivity.this,BActivity.class));
//			}
//		});
		findViewById(R.id.btn).setOnClickListener(this);
	}
	@Override
	public void onClick(View v) {
		startActivity(new Intent(this,BActivity.class));
	}
        ...//省略callback
}
嗯,就是实现OnClickListener接口,并setOnClickListener(这个接口)。如果这么写,之后按钮的实现可能会稍微复杂,但是只需要一个OnClickListener对象即可,从某种程度上可能会减少一些内存的调用。
好了,先不管。放到模拟器里运行看看。

熟悉的信息再次输出:

A onCreate(MainActivity创建,必定跟随onStart)

A onStart(必定跟随onResume)

A onResume

按下按钮:

A onPause(BActivity来到了前台)

B onCreate(BActivity创建,必定跟随onStart)

B onStart(必定跟随onResume)

B onResume

A onStop(此时BActivity进入了运行状态,MainActivity完全被遮盖)

【例04】

如果新的Activity不会完全遮盖MainActivity的话会怎么样呢?我们可以做一个主题来试验一下。

在/res/values目录下新建colors.xml,加入以下内容:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="transparent">#9000</color>
</resources>

然后,在/res/values/styles.xml中加入以下内容:

 <style name="Dialog" parent="android:Theme.DeviceDefault.Dialog.Alert">
        <item name="android:windowBackground">@color/transparent</item> 
        <item name="android:windowIsTranslucent">true</item>
 </style>
然后,将/AndroidManifest.xml的<application>段改为以下内容:

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            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=".BActivity"
            android:label="@string/title_activity_b" 
            android:theme="@style/Dialog">
        </activity>
    </application>
好了,尝试运行。你会发现,BActivity变为了透明,输出也有了略微不同:

A onCreate

A onStart

A onResume

A onPause

B onCreate

B onStart

B onResume

由于B Activity现在无法完全遮住MainActivity,所以没有执行A onStop。

【完】


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值