《转》调用另一个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的手法。

运行结果

 
(点击查看大图)图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。

 package irdc.ex03_09;  

 /* import相关class */
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.content.Intent; public class EX03_09 extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
/* 载入main.xml Layout */
setContentView(R.layout.main); /* 以findViewById()取得Button对象,并添加onClickListener */
Button b1 = (Button) findViewById(R.id.button1);
b1.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v)
{
/* new一个Intent对象,并指定要启动的class */
Intent intent = new Intent();
intent.setClass(EX03_09.this, EX03_09_1.class); /* 调用一个新的Activity */
startActivity(intent);
/* 关闭原本的Activity */
EX03_09.this.finish();
}
});
}
}
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())。

package irdc.ex03_09;  

/* import相关class */
import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.widget.Button; public class EX03_09_1 extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
/* 载入mylayout.xml Layout */
setContentView(R.layout.mylayout); /* 以findViewById()取得Button对象,并添加onClickListener */
Button b2 = (Button) findViewById(R.id.button2);
b2.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v)
{
/* new一个Intent对象,并指定要启动的class */
Intent intent = new Intent();
intent.setClass(EX03_09_1.this, EX03_09.class); /* 调用一个新的Activity */
startActivity(intent);
/* 关闭原本的Activity */
EX03_09_1.this.finish();
}
}); }
}
res/layout/main.xml

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

  1. <?xml version="1.0" encoding="utf-8"?>
    <AbsoluteLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/black"
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <TextView
    android:id="@+id/text1"
    android:textSize="24sp"
    android:layout_width="186px"
    android:layout_height="29px"
    android:layout_x="70px"
    android:layout_y="32px"
    android:text="@string/act1"
    >
    </TextView>
    <Button
    android:id="@+id/button1"
    android:layout_width="118px"
    android:layout_height="wrap_content"
    android:layout_x="100px"
    android:layout_y="82px"
    android:text="Go to Activity2"
    >
    </Button>
    </AbsoluteLayout>
    res/layout/mylayout.xml

在mylayout.xml中定义其背景色为白色,输出文字为"This is Activity 2!!"。

  1. <?xml version="1.0" encoding="utf-8"?>
    <AbsoluteLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/white"
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <TextView
    android:id="@+id/text2"
    android:textSize="24sp"
    android:layout_width="186px"
    android:layout_height="29px"
    android:layout_x="70px"
    android:layout_y="32px"
    android:textColor="@drawable/black"
    android:text="@string/act2"
    >
    </TextView>
    <Button
    android:id="@+id/button2"
    android:layout_width="118px"
    android:layout_height="wrap_content"
    android:layout_x="100px"
    android:layout_y="82px"
    android:text="Go to Activity1"
    >
    </Button>
    </AbsoluteLayout>
    AndroidManifest.xml

由于本范例中添加了一个Activity,所以必须在AndroidManifest.xml中定义一个新的activity,并给予名称name,否则程序将无法编译运行。

   

<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="irdc.ex03_09"
android:versionCode="1"
android:versionName="1.0.0">
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
<activity
android:name=".EX03_09"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="EX03_09_1"></activity>
</application>
</manifest>

扩展学习

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

  

<activity android:name="EX03_09_1"></activity> 

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

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

  

<activity android:name=".EX03_09"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</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的更多相关文章

  1. 调用另一个Activity 分类: H1_ANDROID 2013-09-22 14:11 2217人阅读 评论(0) 收藏

    参考自Google官方文档Traning/Getting Started/Building a simple user interface, Startinganother activity,http ...

  2. startActivityForResult调用另外一个Activity获取返回结果

    startActivityForResult(intent,requestCode)可以调用另外一个Activity,并返回结果. 换头像案例 activity_main.xml <?xml v ...

  3. Android中调用另一个Activity并返回结果-以模拟选择头像功能为例

    场景 Android中点击按钮启动另一个Activity以及Activity之间传值: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...

  4. android中按back键返回上一个activity,如何重新调用上一个activity的oncreate方法?

    默认情况下是不会调用的. @Override public void onBackPressed() { String titleStr = edittitle.getText().toString( ...

  5. 在一个apk中调用另外一个apk中的activity

    今天忽然想到如果要在一个activity中调用另外一个activity该怎么办呢? 感觉这个应该比较简单,应为activity的启动方式就两种:显式启动.隐式启动: 显式启动的话肯定不行,那就只能使用 ...

  6. android开发中一个activity如何调用另一个xml中的控件

    有时候,我们需要在一个activity中使用另一个activity中的控件,这时候就不能直接findViewById,不然会报错指向空对象,这时就需要像下面这样做. LayoutInflater fa ...

  7. Android 只开启一个Activity实例

    在一个Activity中,多次调用startActivity()来启动另一个Activity,要想只生成一个Activity实例,方法有两种. 方法一:设置起动模式 一个Activity有四种启动模式 ...

  8. 每建一个Activity都要注册权限Manifest.xml

    每建一个Activity都要注册权限Manifest.xml 但是有时候自动注册好了,注意!不然的话是不能调用的!!!!!<activity android:name=".MainVi ...

  9. android技巧(一):如何方便知晓当前Activity?如何管理应用中的Activity?如何最佳的启动一个Activity?

    1.如何方便知晓当前Activity? 可以不看代码根据当前界面就知道界面所在Activity的写法: 建立BaseActivity,继承自Activity,在BaseActivity的OnCreat ...

随机推荐

  1. [转帖]HOWTO rename column name in Sqlite3 database

    原文在此 Say you have a table and need to rename "colb" to "col_b": First you rename ...

  2. unity web player的debug和log信息

    win8模式下 unity web player的报错信息在如下目录下:C:\Users\xxx\AppData\Local\Temp\UnityWebPlayer\log 注:目录里的文件可能被隐藏 ...

  3. Oracle 物化视图 说明

    一.    物化视图概述 Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化视图存储基于远程表的数据,也可以称为快照. 物化视图可 ...

  4. java框架篇---spring aop两种配置方式

    第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Befor ...

  5. 获取当前 Python 版本

    方法一 >>> from platform import python_version >>> print python_version() 2.7.8 方法二 & ...

  6. CSS 块状元素和内联元素

    在用CSS布局页面的时候,我们会将HTML标签分成两种,块状元素和内联元素(我们平常用到的div和p就是块状元素,链接标签a就是内联元素) 块状元素一般是其他元素的容器,可容纳内联元素和其他块状元素, ...

  7. WINDOWS 2008Server 配置nginx 反向代理服务器

    本案例有用过可行 0.先要在域名官网上面配置域名对应的IP地址,然后要在自己路由器上面将80端口映射到要装nginx服务器的IP地址. 1.从官网上面下载nginx1.6.2   WINDOWS版本的 ...

  8. Mina、Netty、Twisted一起学(四):定制自己的协议

    在前面的博文中,介绍一些消息分割的方案,以及MINA.Netty.Twisted针对这些方案提供的相关API.例如MINA的TextLineCodecFactory.PrefixedStringCod ...

  9. 后端码农谈前端(HTML篇)第三课:常见属性

    一.HTML全局属性 1.核心属性 属性 描述 id 设置元素的唯一 id. class 设置元素的一个或多个类名(引用样式表中的类). style 设置元素的行内样式(CSS内联样式). title ...

  10. JavaScript的学习--正则表达式

    今天用正则表达式的时候遇到了不少问题,就研究了一下,参考了不少博客,特此记录. 正则表达式的参数    参考 /i (忽略大小写)/g (全文查找出现的所有匹配字符)/m (多行查找)/gi(全文查找 ...