Activity还提供了一个startActivityForResult(Intent intent,int requestCode)方法来启动其他Activity。该方法用于启动指定Activity,而且期望获取指定Activity返回的结果。这种请求对于实际应用也是很常见的,例如应用程序第一个界面需要用户进行选择一旦需要选择的列表数据比较复杂,必须启动另一个Activity让用户选择。当用户在第二个Activity选择完成后,程序返回第一个Activity,第一个Activity必须能获取并显示用户在第二个Activity选择的结果。在这种应用场景下,也是通过Bundle进行数据交换的。

为了获取被启动Activity所返回的结果,需要从两方面着手:

  • 当前Activity需要重写onActivityResult(int requestCode,int resultCode,Intent intent),当被启动的Activity返回结果时,该方法将会被触发,其中requestCode代表请求码,而resultCode代表Activity返回的结果码,这个结果码也是由开发者根据业务自行设定的。
  • 被启动的Activity需要调用setResult()方法设置处理结果。

一个Activity中可能包含多个按钮,并调用多个startActivityForResult()方法来打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都将回调前面Activity的onActivityResult(int requestCode,int resultCode,Intent data)方法。为了知道该方法是由哪个请求的结果所触发的,可利用requestCode请求码;为了知道返回的数据来自于哪个新的Activity,可利用requestCode结果码。

下面通过一个示例来介绍如何启动Activity并获取被启动Activity的结果。

实例:用第二个Activity让用户选择信息

    下面程序也包含两个Activity,第一个Activity的界面布局比较简单,它只包含一个按钮和一个文本框。界面布局文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
> <Button
android:id="@+id/bn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择您所在城市" /> <EditText
android:id="@+id/city"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:editable="false"
android:cursorVisible="false"
>
</EditText>
</LinearLayout>

第一个Activity对应的Java代码如下:

package com.example.studyactivity;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText; public class ActivityForResult extends Activity {
Button bn;
EditText city;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity_for_result);
//获取上面的组件
bn=(Button)findViewById(R.id.bn);
city=(EditText)findViewById(R.id.city);
//为按钮绑定事件监听器
bn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//创建需要对应于目标Activity的Intent
Intent intent=new Intent(ActivityForResult.this,SelectCityActivity.class);
//启动指定Activity并等待返回的结果,其中0是请求码,用于标识该请求
startActivityForResult(intent,0);
}
}); } @Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
// TODO Auto-generated method stub
//当requestCode、resultCode同时为0时,也就是处理特定的结果
if(requestCode==0&&resultCode==0)
{
//取出Intent里面的Extras数据
Bundle data=intent.getExtras();
//取出Bundle中的数据
String resultCity=data.getString("city");
//修改city文本框的内容
city.setText(resultCity); }
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_for_result, menu);
return true;
} }

上面的程序中粗体字代码用于启动ActivityForResult,并等待该Activity返回的结果——但问题是:该Activity如何获取ActivityForResult返回的结果呢?当前Activity启动SelectCityActivity之后,SelectCityActivity何时返回结果是不确定的,因此当前Activity无法去获取SelectCityActivity返回的结果。

为了让当前Activity获取SelectCityActivity所返回的结果,开发者应该重写onActivityResult()方法——当被启动的SelectCityActivity返回结果时,onActivityResult()方法将会被回调。因此上面代码重写了onActivityResult()方法。

运行程序,将看到如图4.14所示的界面。

单击图4.14所示界面中“选择您所在的城市”按钮,系统将会启动SelectCityActivity,该SelectCityActivity将会显示一个可展开的列表。该SelectCityActivity无需界面布局文件。该SelectCityActivity的Java代码如下。

package com.example.studyactivity;

import android.os.Bundle;
import android.app.Activity;
import android.app.ExpandableListActivity;
import android.content.Intent;
import android.database.DataSetObserver;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; public class SelectCityActivity extends ExpandableListActivity { //定义省份数组
private String[] provinces=new String[]{"广东","广西","湖南"};
private String[][] cities=new String[][]{
{"广州","深圳","珠海","中山"},
{"贵州","柳州","南宁","北海"},
{"长沙","岳阳","衡阳","株洲"}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ExpandableListAdapter adapter=new ExpandableListAdapter(){ @Override
public boolean areAllItemsEnabled() {
// TODO Auto-generated method stub
return false;
} @Override
public Object getChild(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return cities[groupPosition][childPosition];
} @Override
public long getChildId(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return childPosition;
}
//该方法决定每个子选项的外观
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
TextView textView=getTextView();
textView.setText(getChild(groupPosition,childPosition).toString());
return textView;
}
private TextView getTextView()
{
AbsListView.LayoutParams lp=new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,64);
TextView textView=new TextView(SelectCityActivity.this);
textView.setLayoutParams(lp);
textView.setGravity(Gravity.CENTER_VERTICAL|Gravity.LEFT);
textView.setPadding(36, 0, 0, 0);
textView.setTextSize(20);
return textView; }
@Override
public int getChildrenCount(int groupPosition) {
// TODO Auto-generated method stub
return cities[groupPosition].length;
} @Override
public long getCombinedChildId(long groupId, long childId) {
// TODO Auto-generated method stub
return 0;
} @Override
public long getCombinedGroupId(long groupId) {
// TODO Auto-generated method stub
return 0;
} @Override
public Object getGroup(int groupPosition) {
// TODO Auto-generated method stub
return provinces[groupPosition];
} @Override
public int getGroupCount() {
// TODO Auto-generated method stub
return provinces.length;
} @Override
public long getGroupId(int groupPosition) {
// TODO Auto-generated method stub
return groupPosition;
} @Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
LinearLayout ll=new LinearLayout(SelectCityActivity.this);
ll.setOrientation(0);
ImageView logo=new ImageView(SelectCityActivity.this);
ll.addView(logo);
TextView textView=getTextView();
textView.setText(getGroup(groupPosition).toString());
ll.addView(textView);
return ll;
} @Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return false;
} @Override
public boolean isChildSelectable(int groupPosition,
int childPosition) {
// TODO Auto-generated method stub
return true;
} @Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return false;
} @Override
public void onGroupCollapsed(int groupPosition) {
// TODO Auto-generated method stub } @Override
public void onGroupExpanded(int groupPosition) {
// TODO Auto-generated method stub } @Override
public void registerDataSetObserver(DataSetObserver observer) {
// TODO Auto-generated method stub
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
// TODO Auto-generated method stub }
};
//设置该窗口显示列表
setListAdapter(adapter);
getExpandableListView().setOnChildClickListener(new OnChildClickListener(){ @Override
public boolean onChildClick(ExpandableListView parent, View source,
int groupPosition, int childPosition, long id) {
// TODO Auto-generated method stub
//获取启动该Activity之间的Activity对应的Intent
Intent intent=getIntent();
intent.putExtra("city", cities[groupPosition][childPosition]);
//设置该SelectActivity的结果码,并设置结束之后退回的Activity
SelectCityActivity.this.setResult(0,intent);
//结束SelectCityActivity
SelectCityActivity.this.finish();
return false;
} }); } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.select_city, menu);
return true;
} }

上面的Activity只是一个普通的显示可展开列表的Activity,程序还为该Activity的各子列表项绑定了事件监听器,当用户单击子列表项时,该Activity将会把用户选择城市返回给上一个Activity。

当上一个Activity获取SelectCityActivity选择城市之后,将会把该程序显示在图4.14所示界面右边的文本框内。

建立、配置和使用Activity——启动其他Activity并返回结果的更多相关文章

  1. 建立、配置和使用Activity——启动、关闭Activity

    一个Android应用通常都会包含多个Activity,但只有一个Activity会作为程序的入口——当该Android应用运行时将会自启动并执行该Activity.至于应用中的其他Activity, ...

  2. Activity启动模式 及 Intent Flags 与 栈 的关联分析

     http://blog.csdn.net/vipzjyno1/article/details/25463457    Android启动模式Flags栈Task   目录(?)[+] 什么是栈 栈 ...

  3. Android零基础入门第74节:Activity启动和关闭

    上一期我们学习了Activity的创建和配置,当时留了一个悬念,如何才能在默认启动的Activity中打开其他新建的Activity呢?那么本期一起来学习如何启动和关闭Activity. 一.概述 经 ...

  4. Android 面试必备 - 系统、App、Activity 启动过程“一锅端”

    Android 系统启动过程 从系统层看: linux 系统层 Android系统服务层 Zygote 从开机启动到Home Launcher: 启动bootloader (小程序:初始化硬件) 加载 ...

  5. Activity启动创建 (AcitivtyManageService,ActivityThread,Activity)

    ActivityThead,ActivityManagerService,Activity  <<Android内核剖析>>中有一章节专门介绍 Activity框架和管理结构A ...

  6. Activity启动模式的深入分析

    网上关于Activity启动模式的文章许多.可是看起来都千篇一律,看完之后我们都能理解这4种启动模式.只是官方api对singleTask这个启动模式解释有些争议,导致我事实上并没有真正理解这几种模式 ...

  7. 庖丁解牛 Activity 启动流程

    前言 这是 Android 9.0 AOSP 系列 的第五篇了,先来回顾一下前面几篇的大致内容. Java 世界的盘古和女娲 -- Zygote 主要介绍了 Android 世界的第一个 Java 进 ...

  8. Android开发之---Activity启动模式

    在Android开发中,启动一个新的activity我们可以使用startActivity或startActivityForResult,Android系统使用栈的方式来管理一个APP的页面显示与保存 ...

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

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

随机推荐

  1. mysql查询数据库约束

    SELECT * FROM information_schema.`TABLE_CONSTRAINTS` where TABLE_SCHEMA='mold' and TABLE_NAME='tplmi ...

  2. MyEclipse快捷键全

    Ctrl + Shift + O: 引入imports语句 Ctrl + Shift + T: 打开Open Type查找类文件 Ctrl + Shift + F4: 关闭打开的所有窗口 Ctrl + ...

  3. Quartus14.1中Qsys创建custom component时编译出错原因

    利用Quartus14.1中Qsys工具新建自定义组件时会产生“part-select direction is opposite from prefix index direction”错误,这是由 ...

  4. Struts2--Action属性接收参数

    1. JSP文件调用格式: <a href="user/user!add?name=a&age=8">添加用户</a> 2. struts.xml文 ...

  5. JAVA基础--toString, equals方法

    ==比较的是地址 equals比较的是内容. 所以要重写object的equals方法. public class TestEquals { public static void main(Strin ...

  6. Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE

    Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE 晚上在测一个widget,前面测的好好的,后面再安装的时候发现如下错误:[2009-06- ...

  7. spark 文件系统Alluxio(之前名为Tachyon)

    http://www.alluxio.org/documentation/v1.0.0/cn/ http://www.winseliu.com/blog/2016/04/15/alluxio-quic ...

  8. astah* professional 6.9.0

    下载地址:http://members.change-vision.com/files/astah_professional/6_9_0 破解方法:按照Astah Professional 6.9后打 ...

  9. PHP 反射应用之一(插件框架)

    http://www.zui88.com/blog/view-205.html 反射,非常有用的一套东西,用来在运行时,分析代码,分析类的属性,方法,参数,实例化类,调用类的方法等等,从而实现框架,实 ...

  10. IBATIS事务处理 - - 博客频道 - CSDN.NET

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...