安卓权威编程指南-第五章学习笔记(两个activity)

生如逆旅一苇以航 生如逆旅一苇以航     2022-09-18     620

关键词:

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

然后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

 

 

  1 // IntentActivityDemo.java
  2 package com.example.zc.intentactivitydemo;
  3 
  4 import android.app.Activity;
  5 import android.content.Intent;
  6 import android.support.v7.app.AppCompatActivity;
  7 import android.os.Bundle;
  8 import android.view.View;
  9 import android.widget.Button;
 10 import android.widget.EditText;
 11 import android.widget.TextView;
 12 import android.widget.Toast;
 13 
 14 public class IntentActivityDemo extends AppCompatActivity {
 15 
 16     private EditText mUserName;
 17     private String username = "";
 18     private EditText mPassWord;
 19     private String password = "";
 20 
 21     private Button mLoginButton;
 22 
 23     private boolean mIsLoginSuccess;
 24 
 25     /*
 26     onActivityResult(int requestCode, int resultCode, Intent intent)
 27     中的requestCode
 28      */
 29     private static final int REQUEST_LOGININFO = 0;
 30 
 31     private String Result;
 32 
 33 
 34     @Override
 35     protected void onCreate(Bundle savedInstanceState)
 36     {
 37         super.onCreate(savedInstanceState);
 38         setContentView(R.layout.activity_intent_demo);
 39 
 40         mUserName = (EditText) findViewById(R.id.username);
 41         //username = mUserName.getText().toString();
 42 
 43         mPassWord = (EditText) findViewById(R.id.password);
 44         //password = mPassWord.getText().toString();
 45 
 46 
 47         //login
 48         mLoginButton = (Button) findViewById(R.id.login);//引用已生成的组件
 49         mLoginButton.setOnClickListener(
 50                 new View.OnClickListener() {
 51                     @Override
 52                     public void onClick(View v)
 53                     {
 54                         username = mUserName.getText().toString();
 55                         password = mPassWord.getText().toString();
 56 
 57                         String UserNameToCalc = username;
 58                         String PassWordToCalc = password;
 59 
 60                         Intent v1 = ActivityB.newIntent(
 61                                 IntentActivityDemo.this,UserNameToCalc,PassWordToCalc);
 62 
 63 
 64                           /*REQUEST_LOGININFO
 65                            onActivityResult(int requestCode, int resultCode, Intent intent)
 66                             中的requestCode
 67                                 */
 68                         startActivityForResult(v1, REQUEST_LOGININFO);
 69 
 70 
 71                     }
 72                 }
 73         );
 74 
 75     }
 76 
 77     /*
 78 
 79     在第二个页面finish()动作或者back动作后,会回调第一个页面的onActivityResult()方法
 80 
 81     新 增 一 个 成 员 变 量 保 存 CheatActivity 回 传 的 值 。 然 后 覆 盖
 82 onActivityResult(...)方法获取它
 83      */
 84     @Override
 85     protected void onActivityResult(int requestCode, int resultCode, Intent intent)
 86     {
 87         if (resultCode != Activity.RESULT_OK)
 88         {
 89             return;
 90         }
 91         if (requestCode == REQUEST_LOGININFO)
 92         {
 93             if (intent == null)
 94             {
 95                 return;
 96             }
 97 
 98 
 99             mIsLoginSuccess = ActivityB.IsInfor(intent);
100 
101             if(mIsLoginSuccess == false)
102             {
103                 Toast.makeText(this, "用户名和密码错误", Toast.LENGTH_SHORT)
104                         .show();
105             }
106 
107 
108             else
109             {
110                 Result = ActivityB.GetResult(intent);
111                 Toast.makeText(this, Result, Toast.LENGTH_SHORT)
112                         .show();
113 
114             }
115 
116         }
117     }
118 
119 
120 
121 
122 
123 }
  1 // ActivityB 
  2 package com.example.zc.intentactivitydemo;
  3 
  4 import android.content.Context;
  5 import android.content.Intent;
  6 import android.support.v7.app.AppCompatActivity;
  7 import android.os.Bundle;
  8 import android.view.View;
  9 import android.widget.Button;
 10 import android.widget.EditText;
 11 
 12 public class ActivityB extends AppCompatActivity
 13 {
 14 
 15     //login username 键值
 16     private static final String EXTRA_LOGIN_USERNAME =
 17             "com.example.zc.practice_geoquiz.login_usename";
 18     //login password 键值
 19     private static final String EXTRA_LOGIN_PASSWORD =
 20             "com.example.zc.practice_geoquiz.login_password";
 21 
 22     //登录信息正确与否
 23     private static final String EXTRA_IS_LOGIN =
 24             "com.example.zc.practice_geoquiz.is_login";
 25 
 26 
 27     //editview结果
 28     private static final String EXTRA_EDITVIEW_RESULT =
 29             "com.example.zc.practice_geoquiz.editview_result";
 30 
 31     private String mUsername = "";
 32     private String mPassword = "";
 33 
 34     private EditText mResultText;
 35 
 36     /*** 已经输入的字符 ***/
 37     private String existedText = "";
 38 
 39 
 40     private Button mSubmitButton;
 41 
 42 
 43     @Override
 44     protected void onCreate(Bundle savedInstanceState)
 45     {
 46         super.onCreate(savedInstanceState);
 47         setContentView(R.layout.activity_b);
 48 
 49         //取出键值到mUsername...
 50         mUsername = getIntent().getStringExtra(EXTRA_LOGIN_USERNAME);
 51         mPassword = getIntent().getStringExtra(EXTRA_LOGIN_PASSWORD);
 52 
 53         if(!mUsername.equals("123"))
 54         {
 55             if(!mPassword.equals("123"))
 56             {
 57                 IsLogIn(false);
 58             }
 59         }
 60 
 61         //返回第一个Activity
 62         mSubmitButton = (Button) findViewById(R.id.submit);
 63         mSubmitButton.setOnClickListener(
 64                 new View.OnClickListener()
 65                 {
 66                     @Override
 67                     public void onClick(View v)
 68                     {
 69                         mResultText = (EditText) findViewById(R.id.result_text);
 70                         existedText = mResultText.getText().toString();
 71 
 72                         Intent v1 = new Intent();
 73                         v1.putExtra(EXTRA_EDITVIEW_RESULT, existedText);
 74                         setResult(RESULT_OK, v1);
 75         /*
 76         第二个页面finish()动作或者back动作后,会回调第一个页面的onActivityResult()方法
 77          */
 78                         finish();
 79 
 80 
 81                     }
 82                 }
 83         );
 84 
 85 
 86     }
 87 
 88 
 89 
 90     public static Intent newIntent(
 91             Context packageContext, String username, String password)
 92     {
 93         Intent i = new Intent(packageContext, ActivityB.class);
 94 
 95         //username 放到EXTRA_LOGIN_USERNAME 键值中
 96         i.putExtra(EXTRA_LOGIN_USERNAME, username);
 97         i.putExtra(EXTRA_LOGIN_PASSWORD, password);
 98 
 99 
100 
101         return i;
102 
103 
104         /*
105         Intent.putExtra(...)方法形式多变。不变的是,它总是有两个参数。
106         一个参数是固定为String类型的键,另一个参数值可以是多种数据类型。该方法返回intent自身,
107         因此,需要时可进行链式调用。
108          */
109         /*
110         要从extra获取数据,会用到如下方法:(一种方法)
111 public boolean getBooleanExtra(String name, boolean defaultValue)
112 第一个参数是extra的名字。 getBooleanExtra(...)方法的第二个参数是指定默认值(默认
113 答案),它在无法获得有效键值时使用。
114          */
115 
116 
117     }
118 
119     private void IsLogIn(boolean IsLogIn)
120     {
121         Intent v1 = new Intent();
122         v1.putExtra(EXTRA_IS_LOGIN, IsLogIn);
123         setResult(RESULT_OK, v1);
124 
125         /*
126         第二个页面finish()动作或者back动作后,会回调第一个页面的onActivityResult()方法
127          */
128         finish();
129     }
130 
131 
132     public static boolean IsInfor(Intent intent)
133     {
134         return intent.getBooleanExtra(EXTRA_IS_LOGIN, false);
135         /*
136         第二参数有影响,如果没有被设置就是默认值!!!!
137         这个没有被设置的情况就是 B中的edit给A的情况
138          */
139     }
140 
141 
142     public static String GetResult(Intent intent)
143     {
144         return intent.getStringExtra(EXTRA_EDITVIEW_RESULT);
145     }
146 
147 
148 }

 

css-css权威指南学习笔记4

第三章1、继承的值没有特殊性,甚至连0的特殊性都没有。所以改变超链接的样式一般需要独立声明,无法通过继承改变。2、层叠——冲突的声明通过这个层叠的过程排序,并由此确定最终的文档表示。这个过程的核心是选择器... 查看详情

js-权威指南学习笔记15

第十五章脚本化文档1、文档对象模型DOM是表示和操作HTML和XML文档内容的基础API。2、Document、Element、Text是Node的子类。3、查询文档的一个或多个元素有如下方法:用指定的id属性、用指定的name属性、用指定的标签名字、用指定的... 查看详情

安卓权威编程指南-笔记(第21章xmldrawable)

在Andorid的世界里,凡事要在屏幕上绘制的东西都可以叫drawable,比如抽象图形,Drawable的子类,位图图形等,我们之前用来封装图片的BitmapDrawable就是一种drawable。本章我们还会看到更多的drawable:statelistdrawable、shapedrawable和layerli... 查看详情

css-css权威指南学习笔记7

第11章表布局1、border-spacing,单元格边框间距,可以有两个或一个值,两个值前者表示水平间距,后者垂直间距。2、border-collapse值为collapse时不可设置padding,为separate时可以有padding。3、使用HTML标签的rowspan和colspan属性可以创建... 查看详情

js-权威指南学习笔记15.3

1、如果要明确地选取一个表单元素,可以索引表单对象的elements属性:document.forms.address.elements.street--一个name为address的form下的name为street的表单元素。2、当用name索引一个HTMLCollection对象并且它包含多个元素来共享name时,返回值... 查看详情

增强学习笔记第五章蒙特卡洛方法

5.1蒙特卡洛预测分为两种:First-VisitMC和Every-VisitMC,前者用的更多。后者用于函数近似和EligibilityTraces5.2蒙特卡洛评估actionvalue如果没有模型(即不知道每个a会得到什么样的s),则应该使用actionvalue而不是statevalue5.3蒙特卡洛控制... 查看详情

js-权威指南学习笔记19.2

1、jQuery动画是异步的,会立刻返回,但动画会在后台执行,可传入函数作为动画完成的回调函数。2、jQuery动画默认是队列化的。3、stop()方法接受两个可选的布尔值参数,如果第一个参数是true,会清除该选中元素上的动画队... 查看详情

javascript高级程序设计学习笔记第五章上

 第五章 引用类型的值(对象)是引用类型的一个实例。在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为类,但这种称呼并不妥当。尽管ECMAScript从技术上讲是一门面向对象的语言,但它不具... 查看详情

《java并发编程的艺术》读后笔记-第五章java中的锁(代码片段)

文章目录《Java并发编程的艺术》读后笔记-第五章Java中的锁第五章Java中的锁1.Lock接口1-1定义1-2Lock的使用1-3Lock与synchronized区别1-4Lock的API2.队列同步器2-1定义2-2队列同步器的接口和示例2-3队列同步器的实现分析1)同步队列2ÿ... 查看详情

css-css权威指南学习笔记3

第三章结构和层叠1、确定应向一个元素应用哪些值时,用户代理不仅要考虑继承,还要考虑声明的特殊性,另外需要考虑声明本身的来源,这个过程就称为层叠。、2、特殊性。如果一个元素有两个或多个冲突的属性声明,那么... 查看详情

javascript权威指南笔记学习

//返回了一个继承自原型对象p的属性的新对象functioninherit(p){if(p==null)throwTypeError();if(Object.create){returnObject.create(p);}vart=typeofp;if(t!=="object"&&t!=="function")throwTypeError();functionf(){};f.pro 查看详情

andorid权威编程指南 笔记

1 创建fragment@Override protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.l 查看详情

java第五章循环结构学习笔记

1.for语法:  for(1参数初始化,2,条件,3,参数叠加){4.循环操作}2.break:改变程序的控制流,多用于循环中,结合条件机构和分支结构一起使用。  作用,跳出整个循环; continue:只能用于循环中,跳过循环中剩... 查看详情

《javascript权威指南》学习笔记之二十---xmlhttprequest和ajax解决方式

一、AJAX概述       AJAX是AsynchronousJavaScriptandXML的缩写。中文译作异步JavaScript和XML。AJAX不是新的编程语言,而是一种使用现有标准的新方法。在不又一次载入页面的情况下,与server交换数据并更新部分网... 查看详情

读书笔记--android编程权威指南

1.设备旋转前保存数据当屏幕旋转时会销毁当前Activity然后再新建一个Activity,这样会造成数据的丢失。通过覆盖onSaveInstanceState(BundleoutState)方法来保存数据。@OverrideprotectedvoidonSaveInstanceState(BundleoutState){super.onSaveInstanceState(outState);... 查看详情

《java编程思想》读书笔记第五章

成员初始化  Java尽力保证:所有变量在使用前都能得到恰当的初始化。  对于方法的局部变量,Java会以编译时报错的形式贯彻这种保证,比如:1voidf()2{3inti;//这里编译时就会报错,未初始化4}  但是如果是类的数据成员... 查看详情

《python深度学习》第五章-1(cnn简介)读书笔记(代码片段)

第五章深度学习用于计算机视觉5.1 卷积神经网络简介5.1.1卷积神经网络对MNIST分类使用卷积神经网络对MNIST数字进行分类,在第2章用密集连接网络做过(当时的测试精度为97.8%)。它是Conv2D层和MaxPooling2D层的堆叠。实... 查看详情

javascript权威指南学习笔记2

Javascript语言核心(2~12章) 第三章:类型、值、变量1.数字:overflow(Infinity, -Infinity)、underflow(+0,-0)非数字值:它和任何值都不相等,包括自身。if(x!=x)returnNAN;==》isNaN()判断是不是NaN或者字符串等javascript的精度... 查看详情