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


【声明】

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

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

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

 

【正文】 

一、如何在一个应用程序当中定义多个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操作系统只显示back stack中最上面的元素(只显示栈顶端的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

 

我的公众号

想学习代码之外的软技能?不妨关注我的微信公众号:生命团队(id:vitateam)。

扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM