安卓权威编程指南 - 第五章学习笔记(两个Activity)
学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正。
IntentActivityDemo学习笔记
题目:ActivityA登录界面(用户名、密码、登陆按钮),ActivityB(Edit,返回按键:SubmitButton)。A界面输入用户名和密码传到B中,B验证用户输入的用户名和密码,如果错误就返回A,并用Toast 显示用户名和密码错误;如果正确,就在第二个 activity中显示一个Edit,用户输入后点击SubmitButton回到A,用 Toast 提示用户计算结束。
这里使用的方法是显式的intent。
一个activity启动另一个activity最简单的方式是使用以下startActivity方法:
public void startActivity(Intent intent)
调用请求发送给了操作系统的ActivityManager,ActivityManager负责创建activityB实例并调用其onCreate(...)方法,示意图如下:

intent是一种多用途通信工具。 Intent类提供了多个构造方法,以满足不同的使用需求。
public Intent(Context packageContext, Class<?> cls)
传入该方法的Class类型参数告诉ActivityManager应该启动哪个activity; Context参数告诉ActivityManager在哪里可以找到它。原理如图:

如果是简单的启动一个Activity这个方法就可以了,我们这里需要传递username,password到ActivityB中,需要两个Activity之间相互传递数据。我们使用startActivityForResult函数,在这之前,先说一下intent extra。之后再说startActivityForResult(0x02)
Extra也是一种键值结构,要将extra数据信息添加给intent,需要调用Intent.putExtra(...)方法。确切地说,是调用
public Intent putExtra(String name, boolean value)
Intent.putExtra(...)方法形式多变。不变的是,它总是有两个参数。一个参数是固定为String类型的键,另一个参数值可以是多种数据类型。该方法返回intent自身,因此,需要时可进行链式调用。
相对应的还有获得extra的信息的方法:
要从extra获取数据,会用到如下方法:
public boolean getBooleanExtra(String name, boolean defaultValue)
第一个参数是extra的名字。 getBooleanExtra(...)方法的第二个参数是指定默认值(默认答案),它在无法获得有效键值时使用,当无法获得有效值的时候,true\false会根据这个函数的设置而确定。
接下来我们开始写简单的代码了。
0x01
首先,A中输入username、password点击loginButton,所以我们在loginButton添加事件监听,并且将我们输入的username和password传到B中。
Activity可能启动自不同的地方,我们应该为activity获取和使用的extra定义键。 并且使用包名修饰extra数据信息,可以避免来自不同应用的extra间发生命名冲突, 如代码所示:
//login username 键值
private static
final String EXTRA_LOGIN_USERNAME =
"com.example.zc.practice_geoquiz.login_usename";
//login password
键值
private static
final String EXTRA_LOGIN_PASSWORD =
"com.example.zc.practice_geoquiz.login_password";
现在,可以返回到QuizActivity并将extra附加到intent上。不过我们有个更好的实现方法。
对于ActivityB处理extra信息的实现细节,ActivityA和应用的其他代码无需知道。因而,我们可转而在newIntent(...)方法中封装这些逻辑。
在ActivityB中,创建newIntent(...)方法,如代码所示。
public static Intent newIntent(
Context packageContext, String username, String password)
{
Intent i = new Intent(packageContext, ActivityB.class); //username 放到EXTRA_LOGIN_USERNAME 键值中
i.putExtra(EXTRA_LOGIN_USERNAME, username);
i.putExtra(EXTRA_LOGIN_PASSWORD, password); return i;
}
之后会上源代码,源代码中的注释会详细一些。
好的这里调试一下看是否得到:

这里我设置的正确的是123 123
故意输错 22 22:

好的这里得到了。
0x02
我们接着来,我们在B中要判断username和password正确与否并且要将这个验证结果返还给A。
因为我们需要从B中获得数据到A中所以我们之前的启动Activity使用的是startActivityForResult。
public void startActivityForResult(Intent intent, int requestCode)
该方法的第一个参数同前述的intent。第二个参数是请求代码。 请求代码是先发送给子activity,然后再返回给父activity的用户定义整数值。当一个activity启动多个不同类型的子activity,
且需要判断区分消息回馈方时,通常会用到该请求代码。虽然QuizActivity只启动一种类型的子activity,但为应对未来的需求变化,现在就应设置请求代码常量。
代码如下;
/*REQUEST_LOGININFO
onActivityResult(int requestCode, int resultCode, Intent intent)
中的requestCode
*/
startActivityForResult(v1, REQUEST_LOGININFO);
0x03
设置结果值
因为B要告诉A你给我传过来的那些username和password对不对,所以我们这里同样也是使用键值EXTRA_IS_LOGIN,然后使用setResult来设置结果值反给A,A自动走onActivityResult(后面我们要自己重写),注意B这里后面必须调用finish()函数或者是back动作后,才会到A的onActivityResult中。
代码如下:
private void IsLogIn(boolean IsLogIn)
{
Intent v1 = new Intent();
v1.putExtra(EXTRA_IS_LOGIN, IsLogIn);
setResult(RESULT_OK, v1); /*
第二个页面finish()动作或者back动作后,会回调第一个页面的onActivityResult()方法
*/
finish();
}
调试一下,就能否到A的onActivityResult中:

然后

好的走到了,接下来就是来看看你给我的是什么信息。
在B中,代码如下:
public static boolean IsInfor(Intent intent)
{
return intent.getBooleanExtra(EXTRA_IS_LOGIN, true);
/*
第二参数有影响,如果没有被设置就是默认值!!!!
这个没有被设置的情况就是 B中的edit给A的情况
*/
}
然后A中,代码如下:
mIsLoginSuccess = ActivityB.IsInfor(intent); if(mIsLoginSuccess == false)
{
Toast.makeText(this, "用户名和密码错误", Toast.LENGTH_SHORT)
.show();
}
调试一下:
1) 输入 22 22 错误的情况:


2) 输入123 123 正确进入
到这里我们的第一步,登录界面的东西就写完了也就是A到B 可以了,接下来B到A:
0x04
在submitbutton点击事件监听中,代码如下:
mResultText = (EditText) findViewById(R.id.result_text);
existedText = mResultText.getText().toString(); Intent v1 = new Intent();
v1.putExtra(EXTRA_EDITVIEW_RESULT, existedText);
setResult(RESULT_OK, v1);
/*
第二个页面finish()动作或者back动作后,会回调第一个页面的onActivityResult()方法
*/
finish();
一样也是使用putExtra把数据设置到键值中,使用setResult和finish到A中调用onActivityResult。
A中代码如下:
if(mIsLoginSuccess == false)
{
Toast.makeText(this, "用户名和密码错误", Toast.LENGTH_SHORT)
.show();
} else
{
Result = ActivityB.GetResult(intent);
Toast.makeText(this, Result, Toast.LENGTH_SHORT)
.show(); }
自定义方法GetResult:
public static String GetResult(Intent intent)
{
return intent.getStringExtra(EXTRA_EDITVIEW_RESULT);
}
调试:
B:

A:

成功。
0x05
之前getBooleanExtra方法中第二参数一开始不了解,后来通过调试理解什么意思:
正确的代码:

这里我们将第二参数设置为false:

对于username和password错误的情况没有问题:

对于B给A传数据的时候,由于有这一句:


因为第二次的条件下,我们的username,password是正确的,所以不会走到这个里面:

所以,我们B给A数据的时候会走默认:

所以会返回false,进入:

示意图如下:
0x01:

密码正确,用户名正确
0x02:

点击submit
0x03:

所以可以理解那个默认的意思了。
源代码:
链接:http://pan.baidu.com/s/1bplhlXt 密码:x0x2
安卓权威编程指南 - 第五章学习笔记(两个Activity)的更多相关文章
- 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...
- 《Linux内核设计与实现》第五章学习笔记
<Linux内核设计与实现>第五章学习笔记 姓名:王玮怡 学号:20135116 一.与内核通信 在Linux中,系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核 ...
- Spring实战第五章学习笔记————构建Spring Web应用程序
Spring实战第五章学习笔记----构建Spring Web应用程序 Spring MVC基于模型-视图-控制器(Model-View-Controller)模式实现,它能够构建像Spring框架那 ...
- 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记
第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...
- 《Linux内核设计与实现》 第五章学习笔记
第五章 系统调用 在现代操作系统中,内核提供了进程与内核进行交互的一组接口.有如下作用: 让应用程序受限的访问硬件设备 提供了创新进程并与已有进程进行通信的机制 提供了申请操作系统其它资源的能力 保证 ...
- Linux 第五章 学习笔记
---恢复内容开始--- 第五章 系统调用 一.与内核通信 1.系统调用在用户控件进程和硬件设备之间添加了一个中间层. 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进程都运 ...
- 安卓权威编程指南-笔记(第22章 深入学习intent和任务)
本章,我们会使用隐式intent创建一个替换android默认启动器的应用.名为NerdLauncher. NerdLauncher应用能列出设备上的其他应用,点选任意列表项会启动相应应用. 1. 解 ...
- 安卓权威编程指南-笔记(第27章 broadcast intent)
本章需求:首先,让应用轮询新结果并在有所发现时及时通知用户,即使用户重启设备后还没有打开过应用.其次,保证用户在使用应用时不出现新结果通知. 1. 一般intent和broadcast intent ...
- 安卓权威编程指南-笔记(第21章 XML drawable)
在Andorid的世界里,凡事要在屏幕上绘制的东西都可以叫drawable,比如抽象图形,Drawable的子类,位图图形等,我们之前用来封装图片的BitmapDrawable就是一种drawable ...
随机推荐
- shutil模块(高级的文件、文件夹、压缩包处理模块)
shutil 模块 高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中 import shutil s ...
- crontab 例子
一个简单的 crontab 示例 0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh 在这个示例中,我们的命令在 7 月的每个星期五和星期六晚上 10 ...
- MogileFS-2.44 安装与配置
MogileFS-2.44 安装与配置 (转:https://my.oschina.net/u/1259000/blog/182277) 目录 一.MogileFS 介绍 1.1.环境 二.Mogil ...
- xencenter如何安装系统
首先点击增加服务器 输入xenserver的ip和用户名以及密码 添加资源池,注意下面那个add new server也要指定一个server,例如刚刚创建的那个 还要搞一个存储的,注意iso要选择s ...
- chrome自带调试工具介绍
Chrome浏览器不仅可以调试页面.JS.请求.资源.cookie,还可以模拟手机进行调试等等,为开发者提供了很多方便,下面就介绍一下我常用到的调试技巧. 1.chrome浏览页面常用快捷键 Ctrl ...
- mysql杂谈
本文主要记录一些零碎知识点 1.mysql默认存储引擎变更InnoDB as Default Storage Engine从mysql-5.5.5开始,InnoDB作为默认存储引擎,InnoDB作为支 ...
- Wireshark常用过滤使用方法
过滤源ip.目的ip. 在wireshark的过滤规则框Filter中输入过滤条件.如查找目的地址为192.168.101.8的包,ip.dst==192.168.101.8:查找源地址为ip.src ...
- [转]Spring IOC父子容器简介
通过HierarchicalBeanFactory接口,Spring的IoC容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的Bean,但父容器不能访问子容器的Bean.在容器内,Bean的 ...
- Linux 安装MySql启动Can't locate Data/Dumper.pm in @INC
通过RPM包CentOS7 安装MySQL的时候提示“Can't locate Data/Dumper.pm in @INC (@INC contains: /usr/local/lib64/perl ...
- ML平台_微博深度学习平台架构和实践
( 转载至: http://www.36dsj.com/archives/98977) 随着人工神经网络算法的成熟.GPU计算能力的提升,深度学习在众多领域都取得了重大突破.本文介绍了微博引入深度学 ...