1· Activity的生命周期(一)
1.1 如何定义多个Activity
1 - 新建一个类,继承Activity
package com.example.activiylife;
import android.app.Activity;
public class SecondActivity extends Activity{
}
2- 重写Activity中的onCreate方法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
3- 创建布局文件:
<?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:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="textView"/>
</LinearLayout>
4- 在onCreate方法中调用布局文件
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
}
5- 在主配置文件(AndroidManifest.xml)中注册该Activity
在<application>中添加一对<activity>子标签;
android:name后面写新增的activit的完整类名
<activity
android:name="com.example.activiylife.SecondActivity"
android:label="@string/app_name" >
</activity>
至此,就完成、增加了一个全新的activity。
如果想要看见它的话,我们还需要改一个地方:
在主配置文件中,为这个新activity增加这段内容:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
有这段内容,这个activity就会被作为默认activity,另外,我们还应该在前一个使用它的地方,把它删除了:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.activiylife.MainActivity"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.example.activiylife.SecondActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
这时,启动程序就会默认启动新增的activity:
1.2 启动另一个Activity的方法
1- 生成一个意图对象(Intent)
Intent intent = new Intent();
2- 调用setClass方法设置要启动的Activity
//参数为Context类型对象,它是Activity的父类,所有Activity对象可以向上转型为Context对象
//第一个参数是当前activity对象,第二个参数为要启动的activity.class
intent.setClass(Context packageContext, Class<?> cls)
3- 调用startActivity方法启动Activity
startActivity(intent);
这样就能实现启动另一个activity;
下面用一个例子来说明: 在第一个activity点击按钮启动第二个activity。
第一个activity的按钮监听:
class ButtonListener implements OnClickListener {
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
}
同时将默认activity设置为第一个activity:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.activiylife.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="com.example.activiylife.SecondActivity"
android:label="SecondActivity" >
</activity>
</application>
启动程序:
点击按钮来到secondeactivity:
1.3 Android当中的back stack(后退栈)
栈:一种先进后出的数据结构
用在activity上面的意思就是:
第一个activity在栈的最底层; 第二个activity在栈的倒数第二层; ... 最新的activity在栈的最上面,显示在手机屏幕上;
点击返回的时候,是返回到前一个activity,5、4、3、2、1这样一直返回到栈最底层的activity。
2· Activity的生命周期(二)
2.1 什么是生命周期
Activity从创建到销毁这就是一个生命周期,在这个过程中的不同阶段要做不同的事。 具体处于什么阶段,这个由系统来控制,但具体阶段所做的事,可以根据需求来实现。
2.2 Activity的生命周期函数
这些函数由系统自动调用; 什么时候调用是由系统决定的,但函数内容是我们可以根据需求来定制。
2.3 生命周期函数的调用时机
为了初步了解这些函数的调用时机,我们通过一个例子来说明。
在这个例子中,我们一共需要两个activity,实现从界面1点击按钮能进入界面2。
同时在两个activity中,都重写这个7个函数,打印输出语句。
第一个activity的按钮监听器:
class ButtonOnClickListener implements OnClickListener {
public void onClick(View arg0) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
}
除onCreate外,另外的6个方法,两边activity都要重写: (记得在onCreate方法中 写一行打印语句)
protected void onDestroy() {
super.onDestroy();
System.out.println("----onDestroy----");
}
protected void onPause() {
super.onPause();
System.out.println("----onPause----");
}
protected void onRestart() {
super.onRestart();
System.out.println("----onRestart----");
}
protected void onResume() {
super.onResume();
System.out.println("----onResume----");
}
protected void onStart() {
super.onStart();
System.out.println("----onStart----");
}
protected void onStop() {
super.onStop();
System.out.println("----onStop----");
}
启动APP,进入第一个activity:
执行的函数依次为:
1- onCreate-- Activity对象第一次创建时执行(第一个activity第一次创建)
2- onStart-- 可以看见Activity的时候执行(第一个activity可见)
3- onResume-- 当Activity可以与用户交互时调用(第一个activity可交互)
接着我们打开第二个activity:
函数执行顺序:
1- onPause-- 即将启动另外一个activity时执行。(这里要启动第二个activity了,所以第一个activity执行了onPause方法)
2- onCreate-- activity对象第一次被创建时执行(第二个activity是第一次启动,所以要执行onCreate)
3- onStart-- 当actvitiy可见时被执行 (第二个activity可见)
4- onResume-- 当activity可以进行交互时执行 (第二个activity可交互)
5- onStop-- 当activity不可见时执行 (第一个activity不可见)
接着我们点击返回:
执行顺序:
1- onPause-- 即将启动另外一个activity时执行(要启动第一个activity,所以第二个activity执行onPause)
2- onRestart-- 当一个Activity再次启动之前执行(第一个activity在之前已经被启动过了,所以这里执行onRestart)
3- onStart-- activity可见时执行(第一个activity可见)
4- onResume-- activity可交互时执行(第一个activity可交互)
5- onStop-- activity不可见时执行(第二个activity不可见)
6- onDestroy-- 当前activity被销毁之前执行(第二个activity被销毁)
以上,我们就可以了解到一个activity的生命周期是什么样的。
-
Activity-A第一次启动时执行:onCreate\onStart\onResume
-
启动其他Activity前,Activity-A会执行onPause
-
在其他Activity启动好,同时看不见Activity-A的时候,Activity-A会执行onStop
-
重新回到Activity-A的时候,Activity-A会执行:onRestart\onStart\onResume
-
当关闭Activity-A的时候,Activity-A会执行:onStop/onDestroy.
3· Activity的生命周期(三)
3.1 Activity对象的状态
状态
-
Resumed : Activity对象处于运行状态
-
Paused : 另一个Activity位于前端,但本Activity还可见
-
Stopped : 另一个Activity位于前端,完全遮蔽本Activity
注意:
- Activiy不会自动释放占用资源
- 需要在onStop、onPause、onDestroy中写代码来释放资源
3.2 成对的生命周期函数
Activity生命周期图
onCreate和onDestroy一对
onPause和onResume一对
onStop和onStart一对
onRestart暂时一个人。
3.3 一个无厘头的比喻
onCreate-买车 onDestroy-报废
onStart-点火启动 onStop-熄火
onResume-踩油门前进 onPause-松开油门(刹车)
来源:oschina
链接:https://my.oschina.net/u/2437172/blog/495822