【正文】
一、如何在一个应用程序当中定义多个Activity:
步骤如下:
(1)定义一个类,继承Activity
(2)在该类当中,复写Activity当中的onCreate()方法
(3)在AndroidManifest.xml文件中注册该Activity
详细解释如下:
(1)定义一个类,继承Activity:在src文件夹里面的包中新建一个class文件,可命名为:SecondActivity.java
(2)在该类当中,复写Activity当中的onCreate()方法:在菜单栏选择Source--->Override/Implement Methods,弹出框,选择其中的onCreate()方法:
注:onCreate()方法是Activity运行的入口。
紧接着,在layout文件夹中,为该Activity添加布局文件:(文件名必须为小写)
在该布局文件中添加一个 <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>
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 }
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>
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,添加如下代码:
1 <activity
2 android:name=".SecondActivity"
3 android:label="SecondActivity" >
4 </activity>
或者如果不绑定监听器的话,可以对布局文件中的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>
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 }
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>
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,添加如下代码:
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