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。
【完】