博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓权威编程指南 - 第五章学习笔记(两个Activity)
阅读量:5946 次
发布时间:2019-06-19

本文共 5027 字,大约阅读时间需要 16 分钟。

学习安卓编程权威指南第五章的时候自己写了个简单的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

 

转载于:https://www.cnblogs.com/1228073191Blog/p/7511703.html

你可能感兴趣的文章
解决vim中不能使用小键盘
查看>>
jenkins权限管理,实现不同用户组显示对应视图views中不同的jobs
查看>>
我的友情链接
查看>>
CentOS定时同步系统时间
查看>>
批量删除用户--Shell脚本
查看>>
如何辨别android开发包的安全性
查看>>
Eclipse Java @Override 报错
查看>>
交换机之间的VLAN通信(trunk)
查看>>
heartbeat-gui
查看>>
51CTO博客中直接粘贴截图的方法
查看>>
N26-第二周作业
查看>>
关于一阶逻辑中实例化的可满足性问题
查看>>
cut命令用法讲解
查看>>
我的第一篇日志。
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
企业实战:mysql5.6数据库备份、恢复脚本
查看>>
RabbitMQ(消息队列)Linux安装相关问题解决
查看>>
我的友情链接
查看>>
CentOS7安装mysql
查看>>