Activity生命周期
2013-12-14 23:49
190 查看
摘要: 一、多Activity
二、启动Activity的方法
三、back stack
四、Activity生命周期
五、Activity对象的状态
六、成对的生命周期函数
填写Name,完成,生成文件
打开刚才新建的文件,让类继承Activity,注意引入包,快捷键是CTRL+SHIFT+O
package com.hj.s02e01_multiactivity;
import android.app.Activity;
public class SecondActivity extends Activity {
}
实现onCreate方法,点击菜单栏上的Source->Override/Implement Methods
弹出一个框,勾选onCreate。点击确定。
确定以后,代码里有了函数:
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
}
填入名称second.xml,确定
在该布局文件里加一个textview
<?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/secondView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="第二个activity"
/>
</LinearLayout>
再在onCreate函数里指定我们要渲染的布局文件是这个second.xml
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
}
<activity
android:name="com.hj.s02e01_multiactivity.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>
其中android:label是app显示在标题栏的名称
Intent-filter放在哪个activity里面,哪个就是默认启动的activity
这时,我们需要增加一个activity,同样是application的子标签,两个属性是必须的,name和label:
<activity
android:name="com.hj.s02e01_multiactivity.SecondActivity"
android:label="SecondActivity" ></activity>
这样就注册了一个activity。
首先,给第一个Activity加一个按钮。
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="启动SecondActivity"/>
在activity里声明这个button,找到他,(步骤参考前面的课程)并添加监听器:
class listener implements OnClickListener{
@Override
public void onClick(View v) {
}
}
接下来是启动activity的流程和方法:
这里生成一个意图对象很简单:
Intent intent = new Intent();
Setclass的第一个参数是context对象,activity是context类的子类。这个参数在这里表示当前场景,也就是当前的activity,在本例中,我们应用MainActivity.this。
Setclass的第二个参数是class对象,表示需要被启动的activity的类的class对象。在本例中,我们应用SecondActivity。
startActivity(intent);
完成。
程序启动时,默认启动了第一个activity,后退栈里存放着第一个activity。
当启动第二个activity之后,后退栈就保存第二个activity。
启动第三个activity时,第三个activity又被放入后退栈中。
而当点击返回按钮时,返回到第二个activity,此时第三个activity就从后退栈中被移除。
依此类推。
在每个阶段调用的函数就是生命周期函数。这些函数不是被程序员调用的,而是被系统自动调用的。程序员的任务是往这些函数里填代码,让它在特定的时间运行。
这些函数有:
我们用前面做的多Activity项目来演示这七个方法调用的顺序和时机。
我们将MainActivity和OtherActivity的这七个方法都实现出来,并都填上类似
System.out.println("MainActivity:onDestroy");
的代码。方便我们查看调用的顺序。
对照这三个方法的含义,我们知道它们在启动时调用,并有先后顺序。
这说明,跳转activity时,当前activity首先调用暂停方法,被启用的activity执行创建-》可见-》交互的方法,最后当前activity调用停止方法。
其流程和前面的类似。但MainActivity因为之前已创建过,所以这次不再是onCreate方法,而是onRestart方法。因为它存放在后退栈里,之前有讲过。
最后在调用完当前Activity的onStop方法后,要销毁它,于是调用了onDestroy方法,之所以要调用这个方法,也是因为它在后退栈里移除了。
注意:当处于paused和stopped两种状态时,activity并没有从内存中释放,包括成员变量之类的仍然占用资源。释放资源的操作需要手工完成。
这是android官方解释生命周期的图。
所谓的成对,是指oncreate与ondestroy是一对,onstart与onstop是一对,onresume与onpause是一对。前者申请资源,后者释放相应的资源。
例如:我们在oncreate函数里启动一个线程,让程序播放音乐,这时电话进来,我们在onstop方法里暂停音乐,电话结束后,要继续播放音乐,而这里调用onstart方法,这时我们发现我们无法启动音乐,因为我们把线程写在了oncreate函数里。
也就是说,这七个方法只是告诉我们调用的时机,而里面要写什么代码是由我们自己决定的。我们必须根据程序的需要来决定在哪个方法里写什么代码。
二、启动Activity的方法
三、back stack
四、Activity生命周期
五、Activity对象的状态
六、成对的生命周期函数
一、多Activity
1.新建一个Activity
在包上点右键,New->Class,填写Name,完成,生成文件
打开刚才新建的文件,让类继承Activity,注意引入包,快捷键是CTRL+SHIFT+O
package com.hj.s02e01_multiactivity;
import android.app.Activity;
public class SecondActivity extends Activity {
}
实现onCreate方法,点击菜单栏上的Source->Override/Implement Methods
弹出一个框,勾选onCreate。点击确定。
确定以后,代码里有了函数:
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
}
2.新建一个布局文件
在res->layout上点右键,选new->android xml file填入名称second.xml,确定
在该布局文件里加一个textview
<?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/secondView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="第二个activity"
/>
</LinearLayout>
再在onCreate函数里指定我们要渲染的布局文件是这个second.xml
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
}
3.新增一个Activity配置
Res目录下的androidmanifest.xml是整个项目的配置文件,我们来看一下里面关于activity的代码:<activity
android:name="com.hj.s02e01_multiactivity.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>
其中android:label是app显示在标题栏的名称
Intent-filter放在哪个activity里面,哪个就是默认启动的activity
这时,我们需要增加一个activity,同样是application的子标签,两个属性是必须的,name和label:
<activity
android:name="com.hj.s02e01_multiactivity.SecondActivity"
android:label="SecondActivity" ></activity>
这样就注册了一个activity。
二、启动Activity的方法
我们让第一个Activity里点一下按钮就启动第二个Activity。首先,给第一个Activity加一个按钮。
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="启动SecondActivity"/>
在activity里声明这个button,找到他,(步骤参考前面的课程)并添加监听器:
class listener implements OnClickListener{
@Override
public void onClick(View v) {
}
}
接下来是启动activity的流程和方法:
1.生成一个意图对象(Intent)
在安卓系统里,几乎做任何事情都离不开Intent,他封装的就是“你想做什么”。这里生成一个意图对象很简单:
Intent intent = new Intent();
2.调用setClass方法设置你要启动的activity
intent.setClass(MainActivity.this, SecondActivity.class);Setclass的第一个参数是context对象,activity是context类的子类。这个参数在这里表示当前场景,也就是当前的activity,在本例中,我们应用MainActivity.this。
Setclass的第二个参数是class对象,表示需要被启动的activity的类的class对象。在本例中,我们应用SecondActivity。
3.调用startActivity方法启动activity
把intent对象作为参数传入。startActivity(intent);
完成。
三、back stack
Back stack就是后退栈。放的是activity对象。它维护了activity的启动顺序。程序启动时,默认启动了第一个activity,后退栈里存放着第一个activity。
当启动第二个activity之后,后退栈就保存第二个activity。
启动第三个activity时,第三个activity又被放入后退栈中。
而当点击返回按钮时,返回到第二个activity,此时第三个activity就从后退栈中被移除。
依此类推。
四、Activity生命周期
一个Activity对象从创建到销毁过程中经历的阶段,和在这些阶段中要做的事情就是Activity的生命周期。在每个阶段调用的函数就是生命周期函数。这些函数不是被程序员调用的,而是被系统自动调用的。程序员的任务是往这些函数里填代码,让它在特定的时间运行。
这些函数有:
我们用前面做的多Activity项目来演示这七个方法调用的顺序和时机。
我们将MainActivity和OtherActivity的这七个方法都实现出来,并都填上类似
System.out.println("MainActivity:onDestroy");
的代码。方便我们查看调用的顺序。
1.启动Activity时
当我们启动第一个Activity时,系统打印如下:对照这三个方法的含义,我们知道它们在启动时调用,并有先后顺序。
2.跳转Activity时
接着我们点击启动第二个Activity。系统打印如下:这说明,跳转activity时,当前activity首先调用暂停方法,被启用的activity执行创建-》可见-》交互的方法,最后当前activity调用停止方法。
3.退回Activity时
当我们点击后退按钮时,系统打印如下:其流程和前面的类似。但MainActivity因为之前已创建过,所以这次不再是onCreate方法,而是onRestart方法。因为它存放在后退栈里,之前有讲过。
最后在调用完当前Activity的onStop方法后,要销毁它,于是调用了onDestroy方法,之所以要调用这个方法,也是因为它在后退栈里移除了。
五、Activity对象的状态
结合生命周期的七种方法,进一步理解Activity对象的状态,Android官方解释有三种状态:1.Resumed
Activity处于运行状态2.Paused
另一个Activity位于前端,但是本Activity还可见。3.Stopped
另一个Activity位于前端,完成遮挡住本Activity。即不可见。注意:当处于paused和stopped两种状态时,activity并没有从内存中释放,包括成员变量之类的仍然占用资源。释放资源的操作需要手工完成。
六、成对的生命周期函数
这是android官方解释生命周期的图。
所谓的成对,是指oncreate与ondestroy是一对,onstart与onstop是一对,onresume与onpause是一对。前者申请资源,后者释放相应的资源。
例如:我们在oncreate函数里启动一个线程,让程序播放音乐,这时电话进来,我们在onstop方法里暂停音乐,电话结束后,要继续播放音乐,而这里调用onstart方法,这时我们发现我们无法启动音乐,因为我们把线程写在了oncreate函数里。
也就是说,这七个方法只是告诉我们调用的时机,而里面要写什么代码是由我们自己决定的。我们必须根据程序的需要来决定在哪个方法里写什么代码。
相关文章推荐
- ActivityThread和Activity的生命周期
- Activity的生命周期
- Android的Activity生命周期模拟程序及解析
- [Activity生命周期] Android 完美退出应用程序
- 基础总结篇之一:Activity生命周期
- Activity的生命周期
- Activity的生命周期方法
- Activity的生命周期
- Android—开发自学历程(1)-Activity(2)-生命周期
- Android Activity和Fragment的生命周期图
- Activity的onCreate中启动新的Activity时生命周期
- Activity的生命周期和启动模式
- Activity的生命周期
- Android---Activity生命周期状态
- Managing the Activity Lifecycle--管理Activity生命周期
- Activity LifeCycle 生命周期
- activity fragment 生命周期
- Activity生命周期基础
- Activity的生命周期
- Activity生命周期详解