MyException - 我的异常网
当前位置:我的异常网» Android » android学习——Activity生命周期小叙

android学习——Activity生命周期小叙

www.MyException.Cn  网友分享于:2013-06-27  浏览:11次
android学习——Activity生命周期小谈

忙了一段时间,终于抽出一段时间对自己前段时间的学习做一下总结了。前段时间趁着晚上有时间,学习了一下android,感觉蛮有意思的。了解了四个基本的元素,Activity,Content Provider,Broadcase Receiver,Services。今天,我们一起来看一下Activity的生命周期,为什么要看这个呢?我想学过servlet的童鞋都知道,我们当时在学习servlet的时候也是从生命周期开始的,首先知道请求的顺序,然后知道怎么处理请求的。只有这样我们才能在需要的时候做一些相关的事情。

android的学习也是这样,Activity是android中最重要的,一般情况下都表示一个界面,这样,我们如果需要进行什么处理都需要在activity上进行处理。下面我们来看一下具体的代码。

1)先建一个项目吧,名称就随便啦。Activity也随便,反正自己看得懂就OK了。

我建了一个结构如图:

这里的名称是随便的,不必追求一致。

2)大家看到我有两个Activity,前面也讲了Activity是一个界面,那么两个当然就是两个界面啦。

看代码之前,我们先来看看Activity事件的方法,有如下几个:

public void onCreate(Bundle savedInstanceState) ;
public void onDestroy();
public void onPause();
public void onRestart();
public void onResume();
public void onStart();
public void onStop();

   这些方法,我们看方法名大概就可以猜到那个方法是在什么时候调用的了。但真正要理解却不是那么简单的。

下面开始我们的正题,看代码啦。

首先看一下strings.xml,这里定义了我们需要显示的字符串。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, MainActivity!</string>
    <string name="app_name">Activity生命周期</string>
    <string name="other">另外一个Activity</string>
    <string name="start">启动另一个Activity</string>
    <string name="stop">结束当前Activity</string>
</resources>

  前面两个可有可无了,只是创建后没有进行修改。

我们来看一下界面的XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
	<Button
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="@string/start"
		android:id="@+id/start"
		/>
	<Button
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="@string/stop"
		android:id="@+id/stop"
		/>
</LinearLayout>

  这里大家应该大概都可以看得懂啦,非常简单的,就两个按钮而已,一个是开始另一个Activity,另一个是停止当前的Activity。非常简单,如果这里看不懂,就需要先补充一下android的基本知识啦。

还有一个是androidManifest.xml这个是最主要的,因为我们用了两个Activity,两个都需要在这里进行“注册”,否则将不可使用。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.shun.android"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <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=".OtherActivity"
        		  android:label="@string/other">
        	<intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

注意,这里的Activity的顺序跟你启动的顺序有关,我这里需要以MainActivity来启动,所以放在OtherActivity前面。

3)这里我们看完了界面代码,接下来便是我们最主要的代码啦。MainActivity和OtherActivity。我们通过MainActivity来进行启动。点击开始另一个Activity则启动OtherActivity。停止则相应的停止当前的Activity。

下面是MainActivity的代码:

package com.shun.android;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
	private static final String TAG = "MainActivity";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Log.i(TAG,"onCreate");
        
        Button start = (Button)findViewById(R.id.start);
        start.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				Intent intent = new Intent(MainActivity.this,OtherActivity.class);
				startActivity(intent);
				MainActivity.this.finish();
			}
		});
        
        Button stop = (Button)findViewById(R.id.stop);
        stop.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				MainActivity.this.finish();
			}
		});
        
    }
    
    protected void onDestroy(){
    	Log.i(TAG,"onDestroy");
    	super.onDestroy();
    }
    
    protected void onPause(){
    	Log.i(TAG,"onPause");
    	super.onPause();
    }
    
    protected void onRestart(){
    	Log.i(TAG,"onRestart");
    	super.onRestart();
    }
    
    protected void onResume(){
    	Log.i(TAG,"onResume");
    	super.onResume();
    }
    
    protected void onStart(){
    	Log.i(TAG,"onStart");
    	super.onStart();
    }
    
    protected void onStop(){
    	Log.i(TAG,"onStop");
    	super.onStop();
    }
}

  OtherActivity代码如下:

package com.shun.android;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class OtherActivity extends Activity{

	private static final String TAG = "OtherActivity";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Log.i(TAG,"onCreate");
        
        Button start = (Button)findViewById(R.id.start);
        start.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				Intent intent = new Intent(OtherActivity.this,MainActivity.class);
				startActivity(intent);
				OtherActivity.this.finish();
			}
		});
        
        Button stop = (Button)findViewById(R.id.stop);
        stop.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				OtherActivity.this.finish();
			}
		});
        
    }
    
    protected void onDestroy(){
    	Log.i(TAG,"onDestroy");
    	super.onDestroy();
    }
    
    protected void onPause(){
    	Log.i(TAG,"onPause");
    	super.onPause();
    }
    
    protected void onRestart(){
    	Log.i(TAG,"onRestart");
    	super.onRestart();
    }
    
    protected void onResume(){
    	Log.i(TAG,"onResume");
    	super.onResume();
    }
    
    protected void onStart(){
    	Log.i(TAG,"onStart");
    	super.onStart();
    }
    
    protected void onStop(){
    	Log.i(TAG,"onStop");
    	super.onStop();
    }
	
}

  代码没啥好讲的罗,很简单的。主要还是要理解生命周期。

下面我们看一下运行的效果:

当我们进行启动的时候:

它首先启动onCreate,其次是onStart,再来就是onResume。这三个特定,不用怀疑。

界面如下:

这时我们点击启动另一个Activity看看效果,这里是MainActivity,点击后将会跳转到OtherActivity。

我们看看效果:

这里已经跳转到另一个Activity,因为我们用了同样的layout,所以显示的是一样的,只是标题不一样。

    我们来看看它的信息:

  我们看到MainActivity会首先暂停,然后再进行新的Activity的创建过程,创建完成后就调用销毁MainActivity。

 

大家估计会怀疑,因为我在MainActivity中把finish写在startActivity后面,肯定是因为这个才在后面调用stop的。首先不是肯定的这么快,我们来把finish放到前面来看看。

我们把MainActivity中的onCreate中的部分代码修改成下面的:

start.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				MainActivity.this.finish();
				Intent intent = new Intent(MainActivity.this,OtherActivity.class);
				startActivity(intent);
			}
		});

  这里我们把finish放到前面了,我们重新运行后可以看到效果:

  我们看到效果是一样的。但为了代码的易读,建议还是放到后面,符合生命周期的调用顺序。

 

现在我们在OtherActivity中,我们想要回到MainActivity中,还是同样启动另一个Activity:

  这里的调用过程也是一样,首先暂停,创建,最后销毁。

现在我们直接关闭MainActivity有:

  这里我们看到它首先调用onPause方法,之后才是正式停止和销毁。从这里我们猜想,当发生一个Activity的切换时,都会先调用当前Activity的onPause方法。这里,我们先不说正不正确,接下去看看,实践证明一切。

 

4)我们在前面是手动finish了这个Activity,下面我们不结束了,我们看看修改的代码:

OtherActivity中还是会调用finish来销毁这个页面,因为不需要了。

OtherActivity如下:

Button start = (Button)findViewById(R.id.start);
        start.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				OtherActivity.this.finish();
			}
		});

  MainActivity如下:

Button start = (Button)findViewById(R.id.start);
        start.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				Intent intent = new Intent(MainActivity.this,OtherActivity.class);
				startActivity(intent);
			}
		});

  这样我们就改好了,其他地方并不需要修改。

我们看看效果,当我们启动MainActivity后,我们点击启动另一个Activity来启动OtherActivity,我们来看看信息:

  我们看到它并没有调用onDestroy,这表明这个onDestroy是当我们调用finish方法才会调用的。

下面我们在OtherActivity中点击启动另一个Activity来启动另一个Activity,注意,这里的“启动”并不是真正启动,不是通过startActivity来启动的,只是结束当前的Activity。

我们看看信息:

这里我们再点击启动另一个Activity,实际上只是停止当前的OtherActivity。我们看看打印出来的信息:

这里我们看到它并不是调用MainActivity的onCreate方法,因为MainActivity并没有被销毁,而只是停止了而已。当OtherActivity被销毁,要切换的时候,会重新启动MainActivity。这时就会调用onRestart。

 

5)注意,我们这里以把OtherActivity作为一个整的Activity,即是占整个界面的。下面我们来看另外一种情况,即我们启动的是一个对话框。

我们需要修改androidManifest.xml,修改后如下:

<activity android:name=".OtherActivity"
        		  android:label="@string/other"
        		  android:theme="@android:style/Theme.Dialog">
        </activity>

  只需要修改OtherActivity的定义即可,这里我们把它定义成Dialog即对话框类型,它并不会占据整个界面,而原来的Activity后退到后台运行。

为了效果的演示,我们先把MainActivity中启动另一个Activity中的finish代码去掉,而把OtherActivity中的启动另一个Activity的代码去掉,留下finish代码。这样就可以看到重新启动的效果。

去掉后的代码如下:

MainActivity中的部分代码:

Button start = (Button)findViewById(R.id.start);
        start.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				Intent intent = new Intent(MainActivity.this,OtherActivity.class);
				startActivity(intent);
			}
		});

  OtherActivity中的代码:

Button start = (Button)findViewById(R.id.start);
        start.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				OtherActivity.this.finish();
			}
		});

  我们运行后点击启动另一个Activity可以看到:

  这里我们看到MainActivity只调用了一个onPause,也就是说它并没有停止,只是在后台运行。

我们看效果:

我们看到主的Activity跑到后面并形成半透明的状态,这是它正在后台运行。

当我们点击启动另一个Activity,注意,我们这里并不启动另一个Activity,而只是直接结束当前的Activity。

现在当我们点击启动另一个Activity时,当前的OtherActivity会关闭,而回到原来的MainActivity。

我们来看看效果:

而后台的信息如下:

    它直接调用onResume重新恢复MainActivity,而不是重新启动。这是因为MainActivity还在后台运行,我们不需要再重新启动一个。

 

其实这个生命周期并不难,难的是每个阶段要理解。随着接触的东西越来越多,相信对这个周期的理解会越来越深的。

下面给一个android官方的生命周期的图大家一起学习:

有了上面的例子,相信理解起来应该不难。

文章评论

Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员和编码员之间的区别
程序员和编码员之间的区别
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
我是如何打败拖延症的
我是如何打败拖延症的
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员必看的十大电影
程序员必看的十大电影
老程序员的下场
老程序员的下场
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
10个调试和排错的小建议
10个调试和排错的小建议
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
 程序员的样子
程序员的样子
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
那些争议最大的编程观点
那些争议最大的编程观点
Java程序员必看电影
Java程序员必看电影
代码女神横空出世
代码女神横空出世
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
我的丈夫是个程序员
我的丈夫是个程序员
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
鲜为人知的编程真相
鲜为人知的编程真相
每天工作4小时的程序员
每天工作4小时的程序员
旅行,写作,编程
旅行,写作,编程
一个程序员的时间管理
一个程序员的时间管理
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
编程语言是女人
编程语言是女人
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员都该阅读的书
程序员都该阅读的书
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有