Android入门/Activity生命周期(三)
2012-07-26 13:56
393 查看
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_TOP和FLAG_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);
相关文章推荐
- 个人总结/Activity生命周期
- Android Activity生命周期
- Android Activity生命周期
- android之activity生命周期图
- Android Activity生命周期
- Android之---Activity生命周期
- (Android)Activity生命周期详解(原创)
- Android-Google提供的Activity生命周期图
- Android之Activity生命周期示图
- Android中Activity生命周期各情景详解!
- Android Activity生命周期
- Android的Fragment收不到生命周期回调的问题
- android activity生命周期
- Android Activity生命周期
- Android程序生命周期-4
- Android Activity生命周期
- Android-Activity生命周期(生命,有始有终!)
- Android Activity生命周期
- Android Activity生命周期
- <Android>Activity生命周期