调用另一个Activity

Intent对象的使用

范例说明

前一个范例介绍了如何运用切换Layout的方式,进行手机页面间的转换。如果要转换的页面并不单只是背景、颜色或文字内容的不同,而是Activity的置换,那就不是单单改变Layout就能完成的,尤其是需要传递的变量不像网页可以通过Cookie或Session,在程序里要移交主控权到另外一个Activity,光靠先前的Layout技巧是办不到的。

那要如何解决Activity控制权的移交呢?在Android的程序设计中,可在主程序里使用startActivity() 这个方法来调用另一个Activity(主程序本身即是一个Activity),但当中的关键并不在startActivity这个方法,而是Intent这个特有的对象,Intent就如同其英文字义,是"想要"或"意图"之意,在主Activity当中,告诉程序自己是什么,并想要前往哪里,这就是Intent对象所处理的事了。本范例并没有特别的Layout布局,而是直接在主Activity(Activity1)当中部署一个按钮,当点击按钮的同时,告诉主Activity前往Activity2,并在Activity2里创建一个回到Activity1的按钮,本范例将利用此简易的程序描述,示范如何在一个Activity中调用另一个Activity的手法。

运行结果

调用另一个Activity
(点击查看大图)图3-9 在两个Activity间做切换

范例程序

 
 
  1. src/irdc.ex03_09/EX03_09.java

主程序中加载的Layout为main.xml,屏幕上显示的是黑色背景的"This is Activity 1!!",在Button被点击时调用另一个Activity(EX03_09_1,参考AndroidManifest.xml里的说明),并将主Activity关闭finish(),接着将主控权交给下一个Activity,即Activity2。

 
 
  1. packageirdc.ex03_09;
  2. /*import相关class*/
  3. importandroid.app.Activity;
  4. importandroid.os.Bundle;
  5. importandroid.view.View;
  6. importandroid.widget.Button;
  7. importandroid.content.Intent;
  8. publicclassEX03_09extendsActivity
  9. {
  10. /**Calledwhentheactivityisfirstcreated.*/
  11. @Override
  12. publicvoidonCreate(BundlesavedInstanceState)
  13. {
  14. super.onCreate(savedInstanceState);
  15. /*载入main.xmlLayout*/
  16. setContentView(R.layout.main);
  17. /*以findViewById()取得Button对象,并添加onClickListener*/
  18. Buttonb1=(Button)findViewById(R.id.button1);
  19. b1.setOnClickListener(newButton.OnClickListener()
  20. {
  21. publicvoidonClick(Viewv)
  22. {
  23. /*new一个Intent对象,并指定要启动的class*/
  24. Intentintent=newIntent();
  25. intent.setClass(EX03_09.this,EX03_09_1.class);
  26. /*调用一个新的Activity*/
  27. startActivity(intent);
  28. /*关闭原本的Activity*/
  29. EX03_09.this.finish();
  30. }
  31. });
  32. }
  33. }
  34. src/irdc.ex03_09/EX03_09_1.java

EX03_09_1.java程序是第二个Activity的主程序,其加载的Layout为mylayout.xml,屏幕上所显示的是白色背景的"This is Activity 2!!",当主Activity(Activity1)调用这个Activity(Activity2)后,同样为Button添加onClickListener(),使Button被点击时,重新调用Activity1(EX03_09),并将Activity2(EX03_09_1)关闭(finish())。

 
 
  1. packageirdc.ex03_09;
  2. /*import相关class*/
  3. importandroid.app.Activity;
  4. importandroid.os.Bundle;
  5. importandroid.content.Intent;
  6. importandroid.view.View;
  7. importandroid.widget.Button;
  8. publicclassEX03_09_1extendsActivity
  9. {
  10. /**Calledwhentheactivityisfirstcreated.*/
  11. @Override
  12. publicvoidonCreate(BundlesavedInstanceState)
  13. {
  14. super.onCreate(savedInstanceState);
  15. /*载入mylayout.xmlLayout*/
  16. setContentView(R.layout.mylayout);
  17. /*以findViewById()取得Button对象,并添加onClickListener*/
  18. Buttonb2=(Button)findViewById(R.id.button2);
  19. b2.setOnClickListener(newButton.OnClickListener()
  20. {
  21. publicvoidonClick(Viewv)
  22. {
  23. /*new一个Intent对象,并指定要启动的class*/
  24. Intentintent=newIntent();
  25. intent.setClass(EX03_09_1.this,EX03_09.class);
  26. /*调用一个新的Activity*/
  27. startActivity(intent);
  28. /*关闭原本的Activity*/
  29. EX03_09_1.this.finish();
  30. }
  31. });
  32. }
  33. }
  34. res/layout/main.xml

为了凸显Activity间切换的效果,特别将两个Layout的背景及输出文字有所区别。在main.xml中定义其背景色为黑色,输出文字为"This is Activity 1!!"。

 
 
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <AbsoluteLayout
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:background="@drawable/black"
  6. xmlns:android="http://schemas.android.com/apk/res/android"
  7. >
  8. <TextView
  9. android:id="@+id/text1"
  10. android:textSize="24sp"
  11. android:layout_width="186px"
  12. android:layout_height="29px"
  13. android:layout_x="70px"
  14. android:layout_y="32px"
  15. android:text="@string/act1"
  16. >
  17. </TextView>
  18. <Button
  19. android:id="@+id/button1"
  20. android:layout_width="118px"
  21. android:layout_height="wrap_content"
  22. android:layout_x="100px"
  23. android:layout_y="82px"
  24. android:text="GotoActivity2"
  25. >
  26. </Button>
  27. </AbsoluteLayout>
  28. res/layout/mylayout.xml
在mylayout.xml中定义其背景色为白色,输出文字为"This is Activity 2!!"。
 
 
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <AbsoluteLayout
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:background="@drawable/white"
  6. xmlns:android="http://schemas.android.com/apk/res/android"
  7. >
  8. <TextView
  9. android:id="@+id/text2"
  10. android:textSize="24sp"
  11. android:layout_width="186px"
  12. android:layout_height="29px"
  13. android:layout_x="70px"
  14. android:layout_y="32px"
  15. android:textColor="@drawable/black"
  16. android:text="@string/act2"
  17. >
  18. </TextView>
  19. <Button
  20. android:id="@+id/button2"
  21. android:layout_width="118px"
  22. android:layout_height="wrap_content"
  23. android:layout_x="100px"
  24. android:layout_y="82px"
  25. android:text="GotoActivity1"
  26. >
  27. </Button>
  28. </AbsoluteLayout>
  29. AndroidManifest.xml
由于本范例中添加了一个Activity,所以必须在AndroidManifest.xml中定义一个新的activity,并给予名称name,否则程序将无法编译运行。
 
 
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifest
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. package="irdc.ex03_09"
  5. android:versionCode="1"
  6. android:versionName="1.0.0">
  7. <application
  8. android:icon="@drawable/icon"
  9. android:label="@string/app_name">
  10. <activity
  11. android:name=".EX03_09"
  12. android:label="@string/app_name">
  13. <intent-filter>
  14. <actionandroid:name="android.intent.action.MAIN"/>
  15. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  16. </intent-filter>
  17. </activity>
  18. <activityandroid:name="EX03_09_1"></activity>
  19. </application>
  20. </manifest>

扩展学习

当系统中新添加Activity时,必须在AndroidManifest.xml里定义一个新的activity:

 
 
  1. <activityandroid:name="EX03_09_1"></activity>

否则系统将会因为找不到Activity而发生编译错误。

另外,当程序中出现两个以上的Activity时,系统要如何决定主程序是哪一支(entry point)呢?以本范例来说,AndroidManifest.xml中Activity EX03_09的定义如下:

 
 
  1. <activityandroid:name=".EX03_09"
  2. android:label="@string/app_name">
  3. <intent-filter>
  4. <actionandroid:name="android.intent.action.MAIN"/>
  5. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  6. </intent-filter>
  7. </activity>

其中有一行为 <category android:name="android.intent.category.LAUNCHER" />,这就代表程序启动时,会先运行EX03_09这个Activity,而非EX03_09_1。需注意的是,这个参数必须要被定义,如果xml中没有一支Activity有设置这个参数,则程序将不会被运行。

此外,在两支Java程序中的最后一行都调用了finish() 这个方法,它代表这个Activity已运作完毕,当系统接收到这个命令时,即会关闭此Activity,所以此时点击模拟器的返回(Back)键,并不会回到上一个Activity的画面,如果要让模拟器的返回键有回上一页的效果,可以将此行程序注释掉。同理,当两个Activity在切换时,并非真的只有两个Activity在切换,而是在点击按钮时,再重新调用起一个新的Activity。

你可能感兴趣的:(Activity)