Android组件系列----当前Activity跳转到另一个Activity的详细过程

【声明】

欢迎转载,但请保留文章原始出处→_→

生命壹号:http://www.cnblogs.com/smyhvae/

文章来源:http://www.cnblogs.com/smyhvae/p/3863720.html

联系方式:[email protected] 

 

【正文】 

一、如何在一个应用程序当中定义多个Activity:

步骤如下:

(1)定义一个类,继承Activity

(2)在该类当中,复写Activity当中的onCreate()方法

(3)在AndroidManifest.xml文件中注册该Activity

详细解释如下:

(1)定义一个类,继承Activity:在src文件夹里面的包中新建一个class文件,可命名为:SecondActivity.java

(2)在该类当中,复写Activity当中的onCreate()方法:在菜单栏选择Source--->Override/Implement Methods,弹出框,选择其中的onCreate()方法:

clip_image004

注:onCreate()方法是Activity运行的入口。

紧接着,在layout文件夹中,为该Activity添加布局文件:(文件名必须为小写)

clip_image006

在该布局文件中添加一个 <TextView />

在SecondActivity.java中设置该Activity所使用的布局文件,即在onCreate()方法中添加如下代码:

setContentView(R.layout.second) ;
(3)在AndroidManifest.xml文件中注册该Activity:(想要启动的Activity一定要先在Manifest文件中进行注册

打开AndroidManifest.xml文件,注意里面的Activity标签,即以下代码:

1         <activity 2             android:name="com.example.test0201_activity01.MainActivity"

3  android:label="@string/app_name" >

4             <intent-filter>

5                 <action android:name="android.intent.action.MAIN" />

6                 <category android:name="android.intent.category.LAUNCHER" />

7             </intent-filter>

8         </activity> 

代码解释如下:

02行:代表Activity的名字:包名+类名。

03行:label指定活动中标题栏的内容。

04至08行:Activity的子标签,即:

1             <intent-filter>

2                 <action android:name="android.intent.action.MAIN" />

3                 <category android:name="android.intent.category.LAUNCHER" />

4             </intent-filter>

以上这段代码放在哪个Activity里,那个Activity就作为应用程序默认启动的Activity。即程序运行后的默认启动的Activity。

现在将SecondActivity注册进去,在第一个Activity后面,添加如下代码:

1         <activity 2             android:name="com.example.test0201_activity01.SecondActivity"

3  android:label="SecondActivity" >            

4         </activity> 
 

二、Android当中的back stack(后退栈):(栈:子弹上膛,先进后出)

Android组件系列----当前Activity跳转到另一个Activity的详细过程

 

android操作系统只显示back stack中最上面的元素(只显示栈顶端的activity)。

在上方的图中,当用户点击后退按钮时,出现以下情况:(最上方的activity将被移除,依此类推)

Android组件系列----当前Activity跳转到另一个Activity的详细过程

 

三、启动一个Activity的方法:即在默认启动的Activity中启动另一个Activity

核心代码如下: 

Intent intent = new Intent();

intent.setClass(MainActivity.this, SecondActivity.class); 

步骤如下:

(1)生成一个意图对象 Intent

(2)调用setClass方法设置所要启动的Activity

(3)调用startActivity方法启动Activity

具体解释如下:

【实例】在第一个Activity点击按钮,来启动第二个Activity;在第二个Activity点击按钮,返回到第一个Activity

(1)生成一个意图对象 Intent (Intent封装了你想做什么这件事)

在布局文件activity_main.xml文件中添加一个button,并在MainActivity.java中生成button的监听器,

生成意图对象的代码如下:

Intent intent = new Intent() ;

(2)调用setClass方法设置所要启动的Activity:

Intent中的setClass方法格式如下:

intent.setClass(packageContext, cls) ;

参数解释如下:

第一个参数:这个context对象即当前activity对象。Activity是context类的子类,此时Activity向上转型了。

第二个参数:表示意图启动的那个Activity 。

(3)调用startActivity方法启动Activity

总而言之,监听器部分的【核心代码】如下:

    class ButtonListener implements OnClickListener { public void onClick(View v) {  Intent intent = new Intent(); //setClass函数的第一个参数是一个Context对象 //Context是一个类,Activity是Context类的子类,也就是说,所有的Activity对象,都可以向上转型为Context对象 //setClass函数的第二个参数是一个Class对象,在当前场景下,应该传入需要被启动的Activity类的class对象

 intent.setClass(MainActivity.this, SecondActivity.class);  startActivity(intent); } }

核心代码为第04行至第09行。

【完整代码】如下:方案一

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

 2     xmlns:tools="http://schemas.android.com/tools"

 3     android:layout_width="match_parent"

 4     android:layout_height="match_parent"

 5     android:paddingBottom="@dimen/activity_vertical_margin"

 6     android:paddingLeft="@dimen/activity_horizontal_margin"

 7     android:paddingRight="@dimen/activity_horizontal_margin"

 8     android:paddingTop="@dimen/activity_vertical_margin"

 9     tools:context=".MainActivity" >

10 

11     <Button 12         android:id="@+id/button1"

13         android:layout_width="match_parent"

14         android:layout_height="wrap_content"

15         android:text="启动第二个Activity" />

16 

17 </RelativeLayout>
activity_main.xml

 

 1 package com.example.activiychange;  2 

 3 import android.app.Activity;  4 import android.content.Intent;  5 import android.os.Bundle;  6 import android.view.Menu;  7 import android.view.View;  8 import android.view.View.OnClickListener;  9 import android.widget.Button; 10 

11 public class MainActivity extends Activity { 12 

13     private Button button ; 14     

15  @Override 16     protected void onCreate(Bundle savedInstanceState) { 17         super.onCreate(savedInstanceState); 18  setContentView(R.layout.activity_main); 19         

20         button = (Button)findViewById(R.id.button1) ; 21         

22        // button.setOnClickListener(new ButtonListener()) ; 23         

24        //为Button绑定监听器,采用匿名内部类

25         button.setOnClickListener(new OnClickListener() { 26             

27  @Override 28             public void onClick(View arg0) { 29                 //下面这一行,有两种方法。方法一:

30                 Intent intent = new Intent(MainActivity.this,SecondActivity.class) ; 31 /* //方法二: 32  Intent intent = new Intent(); 33  intent.setClass(MainActivity.this, SecondActivity.class);*/

34                 //备注:setClass函数的第一个参数是一个Context对象 35                 //备注:Context是一个类,Activity是Context类的子类,也就是说,所有的Activity对象,都可以向上转型为Context对象 36                 //备注:setClass函数的第二个参数是一个Class对象,在当前场景下,应该传入需要被启动的Activity类的class对象

37                 

38  startActivity(intent) ; 39  } 40  } ); 41 

42  } 43 

44 /* class ButtonListener implements OnClickListener { 45 

46  @Override 47  public void onClick(View arg0) { 48  Intent intent = new Intent(); 49  intent.setClass(MainActivity.this, SecondActivity.class); 50  startActivity(intent) ; 51  } 52         

53  }*/

54     

55     

56  @Override 57     public boolean onCreateOptionsMenu(Menu menu) { 58         // Inflate the menu; this adds items to the action bar if it is present.

59  getMenuInflater().inflate(R.menu.main, menu); 60         return true; 61  } 62     

63 }
MainActivity.java

 

 1 <?xml version="1.0" encoding="utf-8"?>

 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

 3  android:layout_width="match_parent"

 4  android:layout_height="match_parent" >

 5 

 6     <Button  7         android:id="@+id/button1"

 8  android:layout_width="wrap_content"

 9  android:layout_height="wrap_content"

10  android:layout_alignParentRight="true"

11  android:layout_alignParentTop="true"

12  android:layout_marginRight="82dp"

13  android:text="返回" /> 

14 

15 </RelativeLayout>
second.xml

 

 1 package com.example.activiychange;  2 

 3 import android.app.Activity;  4 import android.content.Intent;  5 import android.os.Bundle;  6 import android.view.View;  7 import android.view.View.OnClickListener;  8 import android.widget.Button;  9 

10 public class SecondActivity extends Activity { 11     

12     private Button button1 ; 13  @Override 14     protected void onCreate(Bundle savedInstanceState) { 15         super.onCreate(savedInstanceState); 16  setContentView(R.layout.second); 17         

18         button1 = (Button)findViewById(R.id.button1) ; 19         

20         //为返回按钮绑定监听器

21         button1.setOnClickListener(new OnClickListener() { 22 

23  @Override 24             public void onClick(View arg0) { 25                 Intent intent = new Intent(SecondActivity.this,MainActivity.class) ; 26  startActivity(intent) ; 27  } 28             

29  }); 30 

31         

32  } 33 }
SecondActivity.java

并在清单文件中注册SecondActivity,添加如下代码:

1         <activity 2             android:name=".SecondActivity"

3  android:label="SecondActivity"  >            

4         </activity>
AndroidManifest.xml

 

或者如果不绑定监听器的话,可以对布局文件中的Button添加如下代码:android:onClick="gotoSecondActivity"

【完整代码】如下:方案二

 

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

 2  xmlns:tools="http://schemas.android.com/tools"

 3  android:layout_width="match_parent"

 4  android:layout_height="match_parent"

 5  android:paddingBottom="@dimen/activity_vertical_margin"

 6  android:paddingLeft="@dimen/activity_horizontal_margin"

 7  android:paddingRight="@dimen/activity_horizontal_margin"

 8  android:paddingTop="@dimen/activity_vertical_margin"

 9  tools:context=".MainActivity" >

10 

11     <TextView 12         android:id="@+id/textView1"

13  android:layout_width="wrap_content"

14  android:layout_height="wrap_content"

15  android:text="@string/hello_world" />

16 

17     <Button 18         android:id="@+id/button1"

19  android:layout_width="wrap_content"

20  android:layout_height="wrap_content"

21  android:layout_below="@+id/textView1"

22  android:layout_marginTop="22dp"

23  android:onClick="gotoSecondActivity"

24  android:text="启动第二个Activity" />

25 

26 </RelativeLayout>
activity_main.xml

 

 

 1 package com.example.smyh004activity01;  2 

 3 import android.app.Activity;  4 import android.content.Intent;  5 import android.os.Bundle;  6 import android.view.Menu;  7 import android.view.View;  8 

 9 public class MainActivity extends Activity { 10 

11  @Override 12     protected void onCreate(Bundle savedInstanceState) { 13         super.onCreate(savedInstanceState); 14  setContentView(R.layout.activity_main); 15         System.out.println("MainActivity-onCreate"); 16  } 17     

18  @Override 19     protected void onStart() { 20         super.onStart(); 21         System.out.println("MainActivity-onStart"); 22  } 23     

24  @Override 25     protected void onResume() { 26         super.onResume(); 27         System.out.println("MainActivity-onResume"); 28  } 29     

30  @Override 31     protected void onPause() { 32         super.onPause(); 33         System.out.println("MainActivity-onPause"); 34  } 35 

36  @Override 37     protected void onStop() { 38         super.onStop(); 39         System.out.println("MainActivity-onStop"); 40  } 41     

42 

43  @Override 44     protected void onRestart() { 45         super.onRestart(); 46         System.out.println("MainActivity-onRestart"); 47  } 48 

49 

50  @Override 51     protected void onDestroy() { 52         super.onDestroy(); 53         System.out.println("MainActivity-onDestroy"); 54  } 55 

56 

57     /*

58  * 通过这个方法跳转到SecondActivity界面 59      */

60     public void gotoSecondActivity(View view){ 61         //创建一个意图

62         Intent intent = new Intent(MainActivity.this,SecondActivity.class); 63  startActivity(intent); 64  } 65     

66  @Override 67     public boolean onCreateOptionsMenu(Menu menu) { 68         // Inflate the menu; this adds items to the action bar if it is present.

69  getMenuInflater().inflate(R.menu.main, menu); 70         return true; 71  } 72     

73 }
MainActivity.java

 

 1 <?xml version="1.0" encoding="utf-8"?>

 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 3  android:layout_width="match_parent"

 4  android:layout_height="match_parent"

 5  android:orientation="vertical" >

 6     

 7      <TextView  8         android:id="@+id/textView1"

 9  android:layout_width="wrap_content"

10  android:layout_height="wrap_content"

11  android:text="@string/hello_world" />

12 

13     <Button 14         android:id="@+id/button1"

15  android:layout_width="wrap_content"

16  android:layout_height="wrap_content"

17  android:layout_below="@+id/textView1"

18  android:layout_marginTop="22dp"

19  android:onClick="gotoMainActivity"

20  android:text="回到 第一个Activity" />   

21 

22 </LinearLayout>
second.xml

 

 1 package com.example.smyh004activity01;  2 

 3 import android.app.Activity;  4 import android.content.Intent;  5 import android.os.Bundle;  6 import android.view.Menu;  7 import android.view.View;  8 

 9 public class SecondActivity extends Activity{ 10 

11  @Override 12     protected void onCreate(Bundle savedInstanceState) { 13         // TODO Auto-generated method stub

14         super.onCreate(savedInstanceState); 15  setContentView(R.layout.second); 16        System.out.println("SecondActivity-onCreate"); 17  } 18     

19  @Override 20     protected void onStart() { 21         super.onStart(); 22         System.out.println("SecondActivity-onStart"); 23  } 24     

25  @Override 26     protected void onResume() { 27         super.onResume(); 28         System.out.println("SecondActivity-onResume"); 29  } 30     

31  @Override 32     protected void onPause() { 33         super.onPause(); 34         System.out.println("SecondActivity-onPause"); 35  } 36 

37  @Override 38     protected void onStop() { 39         super.onStop(); 40         System.out.println("SecondActivity-onStop"); 41  } 42     

43 

44  @Override 45     protected void onRestart() { 46         super.onRestart(); 47         System.out.println("SecondActivity-onRestart"); 48  } 49 

50 

51  @Override 52     protected void onDestroy() { 53         super.onDestroy(); 54         System.out.println("SecondActivity-onDestroy"); 55  } 56 

57     /*

58  * 通过这个方法跳转到SecondActivity界面 59      */

60     public void gotoMainActivity(View view){ 61         //创建一个意图

62         Intent intent = new Intent(SecondActivity.this,MainActivity.class); 63  startActivity(intent); 64         finish();//结束当前的Activity 65         //如果没有上面的finish(),那么当跳转到MainActivity之后,SecondActivity只会onStop,不会ondestroy。即仍然还在栈中 66         //需要注意的是,当它跳到MainActivity时,会去重新创建一个新的MainActivity,即执行MainActivity中的onCreate()方法;

67  } 68     

69 }
SecondActivity.java

并在清单文件中注册SecondActivity,添加如下代码:

1         <activity 2             android:name=".SecondActivity"

3  android:label=".SecondActivity">            

4         </activity>

生命周期描述如下:

当用户点击当前默认的MainActivity中的按钮后,会跳到SecondActivity。生命周期如下:

启动默认Activity时:

MainActivity:onCreate

MainActivity:onStart

MainActivity: onResume

点击按钮后,跳到SecondActivity:(MainActivity被保留至栈底)

MainActivity:onPause

SecondActivity:onCreate

SecondActivity:onStart

SecondActivity: onResume

MainActivity: onStop

按返回菜单后,回到MainActivity:(SecondActivity被销毁)

SecondActivity: onPause

MainActivity:onRestart

MainActivity:onStart

MainActivity: onResume

SecondActivity: onStop

SecondActivity: onDestroy

 

当用户打开应用程序,之后按Home键返回到主页(或者按电源键,效果是一样的),再回到原来的程序。生命周期描述如下:

启动默认Activity时:

MainActivity:onCreate

MainActivity:onStart

MainActivity: onResume

按Home键返回到主页:

MainActivity:onPause

MainActivity:onStop

再回到原来的程序:

MainActivity:onRestart

MainActivity:onStart

MainActivity:onResume

 

方案二的【工程文件】

链接:http://pan.baidu.com/s/1dDhBd7r 

密码:jfm9

你可能感兴趣的:(Activity)