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设置的数据

时间: 2024-10-07 05:27:00

Android四大组件之Activity详解——传值和获取结果的相关文章

Android四大组件之Activity详解 &middot; yclog

Activity生命周期: onCreate:在Acitivty第一次创建时调用,用于做初始化的工作onStart:onCreate调用后调用,此次界面对用户来说无法看见onResume:此次界面可见并显示到前台,且当前Acitvity位于当前栈顶,并且处于运行状态onPause:表示当前Activity正在停止,常做一些存储数据.停止动画等工作(不做耗时操作)onStop:表示当前Activity即将停止,一般做微量级的回收工作onDestory:表示当前Activity即将被销毁,可做一些回

Android四大组件之Activity详解

.Activity的本质 Activity是Android提供的四大组件之一,是进行Android开发必不可少的组件.Activity是一个界面的载体,可以把它与html页面进行类比,html页面由各种各样的标签组成,而Activity则可以由各种控件组成.然而Activity也并不是那么简单.查看Activity类的源码我们就可以看到,这个类大概有六千多行代码,说明Android对Activity的处理是相当复杂的.不过我们平时进行开发的时候不需要了解到那么深入的地步,因为我们可以根据Acti

Android四大组件之Activity详解——创建和启动Activity

前面我们已经对Activity有过简单的介绍: Android开发——初始Activity Android开发——响应用户事件 Android开发——Activity生命周期 先来看一下最终结果 创建Activity: 接下来打开我们的IDE,创建一个名叫ActivityDemo的Android Application Project 工程默认已经为我们创建了一个Activity,现在我们手动添加一个名叫SecondActivity的类 点击finish完成SecondActivity类的创建.

Android 四大组件之Service详解

                   Android四大组件之Service详解    来这实习已经10多天了,今天整理整理学习时的Android笔记.正所谓好记性不如烂笔头,今天来说说service组件. service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的. Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个

Android四大组件-Service并非详解

距离上篇文章竟然快一年了.这次是想明确service一些比较重要的点. 至于什么是service,我也不想多去讨论,我只想清晰确认这么几个问题: 1.service的生命周期到底如何? 2.Activity如何让service做事? 3.service与thread之间有没有关系? 4.远程service是什么东西? 5.AIDL的使用? 6.前台service? 一.生命周期 如果需要图,可以百度,好多.我这里直接运行代码打log. 1.startService()启动Service 操作顺序

Android四大组件之——Activity的开启:StartActivity()和StartActivityForResult()(图文详解)

            如需转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:[email protected]       [Android四大组件学习系列Activity篇]        1.Android四大组件之——Activity(一)定义.状态和后退栈(图文详解) 2.Android四大组件之——Activity的生命周期(图文详解) 3.Android四大组件之——Activity的开启StartActivit

Android四大组件之Activity(活动)及其布局的创建与加载布局

Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个或多个活动. 手动创建Activity的过程详解 到现在为止,你还没有手动创建过活动呢,在第一个安卓工程中,HelloWorldActivity是ADT帮我们创建的,手动创建活动可以加深我们的理解,因此现在是时候应该自己动手了. 首先,你需要再新建一个 Android 项目,项目名可以叫做 Acti

【Android的从零单排开发日记】之入门篇(四)——Android四大组件之Activity

在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页面类似.当然,这种相似性主要体现在设计思想上.在具体实现方面,Android的Activity组件有自己的设计规范,同时,它能够更简便地使用线程.文件数据等本地资源. 一.Activity 的生命周期 Activity 的生命周期是被以下的函数控制的. 1 public class Activity

Android学习之路——Android四大组件之activity(二)

上一篇讲了activity的创建和启动,这一篇,我们来讲讲activity的数据传递 activity之间的数据传递,这里主要介绍的是activity之间简单数据的传递,直接用bundle传递基本数据类型的数据.还有一种数据类型是parcelable和serialable 用bundle 传递数据有两种情况,这篇文章就分别从两个方面说明一下. 一.利用bundle传递基本数据类型 1.启动时传递数据,使用intent的put方法,将数据写入bundle中,然后startActivity(inte