Android四大组件之Activity详解——传值和获取结果
废话不多说,先来看效果图

项目源码:
http://download.csdn.net/detail/ginodung/8331535
程序说明:
- 在MainActivity中输入用户名和密码,然后提交到SecondActivity
- 在SecondActivity中获取提交的数据,通过Toast显示该数据
- 在SecondActivity设置新的用户名和密码,然后返回给MainActivity
- MainActivity获取到SecondActivity返回的数据后从新设置用户名和密码的值,然后用Toast显示其他返回值
用到的知识:
主要还是基于Intent的使用,因为Intent本身就是一个信使对象。
基本原理:
- 使用Intent的putXxxExtra()方法保存值
- Bundle对象的使用:
- 使用Intent的putExtras(Bundle bundle)方法
- 使用Intent的setData()方法
- startActivityForResult()方法的使用
- onActivityResult()方法的使用
代码分析:
先来看一下MainActivity的代码
package com.example.activitydemo; import java.util.List; import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity
{ private EditText nameText;
private EditText passText;
public static final int REQUESTCODE = 1; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 查找我们在布局中创建的按钮
Button startSecondActivity = (Button) findViewById(R.id.btnlogin);
nameText = (EditText) findViewById(R.id.username);
passText = (EditText) findViewById(R.id.password); // 为按钮绑定点击事件
startSecondActivity.setOnClickListener(new View.OnClickListener()
{ @Override
public void onClick(View v)
{ String username = nameText.getText().toString();
String password = passText.getText().toString(); Intent intent = new Intent(
"com.example.activitydemo.mysecondactivity"); // 把要发送的数据以键值对的方式保存在intent对象中
intent.putExtra("username", username);
intent.putExtra("password", password); // 创建PackageManager类
PackageManager packageManager = getPackageManager(); // 获取包含能处理给定intent的activity列表
List<ResolveInfo> activities = packageManager
.queryIntentActivities(intent, 0); if (activities.size() > 0)
// 启动SecondActivity
startActivityForResult(intent, REQUESTCODE);
else
Toast.makeText(getBaseContext(), "Activity not found",
Toast.LENGTH_SHORT).show();
}
});
} @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == REQUESTCODE)
{
if (resultCode == RESULT_OK)
{ // 获取从SecondActivity通过Bundle返回的值
Bundle extras = data.getExtras();
String newUserName = extras.getString("newusername");
String newPassword = extras.getString("newPassword"); nameText.setText(newUserName);
passText.setText(newPassword); // 获取从SecondActivity通过setData返回的值
String strFromSec = data.getData().toString();
Toast.makeText(this, strFromSec, Toast.LENGTH_SHORT).show();
}
}
}
}
看上面的代码,主要的还是下面的两句
intent.putExtra("username", username);
intent.putExtra("password", password);
我们使用putExtra方法把数据保存到要启动的Intent中去,
然后使用startActivityForResult方法启动这个Intent.
这里要说一下startActivityForResult方法,当我们需要从被启动的Activity获取返回值的时候就应该调用这个方法
它有两个参数,第一个Intent就不用说了.主要是第二个参数requestcode,它是一个整数。
requestCode参数的作用是:
当出现调用多个有返回值的Activity时,我们就需要requestCode去辨认是哪一个Activity所返回的值
当这个参数大于零的时候它才有意义,当requestCode设置为-1的时候,
就相当于调用startActivity方法。
再看onActivityResult方法,这个方法是响应其他Activity的setResult方法的,
意思就是当一个有返回值的Activity返回时会调用onActivityResult方法,所以我们必须实现这个方法
在这个方法中,我们通过requestCode识别是哪一个Activity返回的值,
以及使用resultCode检测数据是否成功返回。
onActivityResult中其他的内容我们先不说,先看SecondActivity的内容
package com.example.activitydemo; import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class SecondActivity extends Activity
{
private EditText userNameEditText;
private EditText passwordEditText; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// 绑定activity_second布局到SecondActivity
setContentView(R.layout.activity_second); // 获取传递过来的Intent对象,这个对象是MainActivity从传递过来的
Intent intent = getIntent(); // 从Intent对象中获取数据
String username = intent.getStringExtra("username");
String passowrd = intent.getStringExtra("password"); Toast.makeText(this, username, Toast.LENGTH_SHORT).show();
Toast.makeText(this, passowrd, Toast.LENGTH_SHORT).show(); Button btnFinish = (Button) findViewById(R.id.btnfinish); btnFinish.setOnClickListener(new View.OnClickListener()
{ @Override
public void onClick(View v)
{
userNameEditText = (EditText) findViewById(R.id.newusername);
passwordEditText = (EditText) findViewById(R.id.newpassword);
Intent data = new Intent();
data.setData(Uri.parse("从SecondActivity返回的值")); Bundle bundle = new Bundle(); bundle.putString("newusername", userNameEditText.getText().toString());
bundle.putString("newPassword", passwordEditText.getText().toString()); data.putExtras(bundle); setResult(RESULT_OK, data); finish();
}
});
}
}
看看下面几行代码
getIntent方法用于获取启动这个Activity的Intent的对象
Intent intent = getIntent();
对象获取后就可以使用getStringExtra方法取得对象中保存的值
因为我们之前使用putExtra方法保存的是String对象,所以使用getStringExtra方法
如果保存的是Int对象,就可以使用getIntExtra方法,其他的以此类推。
String username = intent.getStringExtra("username");
String passowrd = intent.getStringExtra("password");
接着分析setData和putExtras方法
data.setData(Uri.parse("从SecondActivity返回的值"));
setData方法保存的是一个Uri对象,所以数据要先转换成Uri类型,
需要注意的是,setData方法一次只能保存一个数据,如果调用多次setData方法,
那么最后的数据就会覆盖之前的数据。
再来看Bundle的使用
Bundle bundle = new Bundle();
bundle.putString("newusername", userNameEditText.getText().toString());
bundle.putString("newPassword", passwordEditText.getText().toString());
data.putExtras(bundle);
Bundle对象主要用来保存键值对的数据,它有一系列的put方法,具体可以查看文档,不详细说明。
可以将Bundle对象看成是将要保存的数据打一个包,然后使用Intent的putExtras保存这个包裹然后发送出去。
数据准备好后,就可以使用setResult方法将数据返回
setResult(RESULT_OK, data);
我们返回MainActivity的onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == REQUESTCODE)
{
if (resultCode == RESULT_OK)
{ // 获取从SecondActivity通过Bundle返回的值
Bundle extras = data.getExtras();
String newUserName = extras.getString("newusername");
String newPassword = extras.getString("newPassword"); nameText.setText(newUserName);
passText.setText(newPassword); // 获取从SecondActivity通过setData返回的值
String strFromSec = data.getData().toString();
Toast.makeText(this, strFromSec, Toast.LENGTH_SHORT).show();
}
}
}
方法中的参数中有一个Intent类型的数据data,SecondActivity中的数据就是保存在这个参数中的。
如果数据返回成功,即resultCode等于RESULT_OK,我们就可以使用对应的get方法获取数据
如:
getExtras获取Bundle对象,getData获取使用setData设置的数据
Android四大组件之Activity详解——传值和获取结果的更多相关文章
- Android四大组件之Activity详解——创建和启动Activity
前面我们已经对Activity有过简单的介绍: Android开发——初始Activity Android开发——响应用户事件 Android开发——Activity生命周期 先来看一下最终结果 项目 ...
- Android四大组件之Activity详解
一.Activity的概要说明 我看过Activity的源码,Activity类注释大概是这样解释的:几乎所有的Activity都是与用户交互用的,我想用了一个几乎的意思应该是排除一些纯展示界面吧,因 ...
- Android四大组件之一 -- Service详解
相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序 ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- Android四大组件之——Activity的开启:StartActivity()和StartActivityForResult()(图文详解)
如需转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com ...
- Android四大组件之Activity(活动)及其布局的创建与加载布局
Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...
- 【Android开发日记】之入门篇(四)——Android四大组件之Activity
在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页 ...
- Android四大组件之——Activity(一)定义、状态和后退栈(图文详解)
什么是Activity 关键字:应用组件.四大组件.用户界面,交互. An Activity is an application component that provides a screen wi ...
- Android学习之基础知识十三 — 四大组件之服务详解第一讲
一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...
随机推荐
- 利用网络流传的WebShell默认密码库寻找WebShell
声明:本文提到的技术,仅可用作网络安全加固等合法正当目的.本文作者无法鉴别判断读者阅读本文的真实目的,敬请读者在本国法律所允许范围内阅读本文,读者一旦因非法使用本文提到技术而违反国家相关的法律法规,所 ...
- 初试MarkDown
· 要写个文档,突然就想到要不要试试学学MarkDown,整理一下大致过程 · 首先搜到这篇文章 ,简单介绍了MarkDown,以及OS X 平台上一个简单的工具 mou (目前仍免费) 相关新闻不做 ...
- 实现跨云应用——基于DNS的负载均衡
“公有云可以作为传统IT资源的延展,能帮助客户应对不断变化的需求”——这是我们在向客户介绍公有云产品时经常说的一句话.我们来看一个具体的需求: 某客户有一个web站点,部署在自有的数据中心(on-pr ...
- C++浅析——继承类中构造和析构顺序
先看测试代码,CTEST 继承自CBase,并包含一个CMember成员对象: static int nIndex = 1; class CMember { public: CMember() { p ...
- 《2016ThoughtWorks技术雷达峰会----js爆炸下的技术选型》
JS爆炸下的技术选型 刘尚奇 ThoughtWorks, 高级咨询师 JS每6个星期出现一个新框架,那么如何进行JS的选型.以下从四个方面来分析. 1.工具 NPM for all the t ...
- windows 10 & Office 2016 安装
Office 2016 VOL版 http://blog.sina.com.cn/s/blog_470614a90102vtmc.html 专业版合集: magnet:?xt=urn:btih: ...
- 以最简单的登录为例,诠释JS面向对象的简单实例
JavaScript,是前端开发人员必须会的一门技术,从JS演变出来的有很多框架,先说说几个热门的框架吧: JQuery:这个技术必须会,如果不会,那一定要会查api,知道怎么写,要看得懂英文文档,这 ...
- 为什么使用Sass
为什么使用Sass 作为前端(html.javascript.css)的三大马车之一的css,一直以静态语言存在,HTML5火遍大江南北了.javascript由于NODE.JS而成为目前前后端统一开 ...
- 嵌入式linux根文件系统制作
编译Busybox 从http://www.busybox.net/downloads/下载busybox工具.这里我们下载的上最新版: busybox-1.24.2.tar.bz2 解压Busybo ...
- java 24 - 11 GUI之制作登陆注册页面
简单说说,懒得发了... 步骤: A:首先写出登陆注册需要用到类以及代码(IO流) B:然后创建登陆窗口和注册窗口 C:各个监听事件: a:登录窗口 1.重置:把2个文本框的内容全部清空 2.注册:关 ...