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