android-Android Intent 如何接收到指定的Intent传递过来的值呢?

问题描述

Android Intent 如何接收到指定的Intent传递过来的值呢?

写了2个Activity,A、B,2个Activity之间可以相互跳转。
1、A中有一个发送按钮可实现传值到B中,同时还有一个独立的跳转按钮。
2、在B中有接收A传值过来的的代码
3、执行中,如果直接执行了跳转按钮,B的接收Intent代码中,就会出现空指针异常,目前通过 try{}catch临时确保能正常运行。
想请问:能否有方法可以让B接收传值的代码能够识别那个Intent才是传值过来的,避免空指针异常出现。

A传值代码如下:
/*
* 1、获取到界面中输入的信息
* 2、将获取到的值,传递到ReceiveActivity中。
* */
Button _OkSend = (Button)findViewById(R.id.buttonOkSend);
_OkSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText editText1 = (EditText)findViewById(R.id.editText);
name=editText1.getText().toString();
Log.i("YuryLog","SendActivity name: "+name);

            EditText editText2 = (EditText)findViewById(R.id.editText2);
            eatSomething = editText2.getText().toString();
            Log.i("YuryLog","SendActivity eatSomething: "+eatSomething);

            EditText editText3 = (EditText)findViewById(R.id.editText3);
            copies = editText3.getText().toString();
            Log.i("YuryLog","SendActivity copies: "+copies);

// 将值传递到ReceiveActivity中
Intent _intent = new Intent(SendActivity.this, ReceiveActivity.class) ;
_intent.putExtra("sendName",name);
_intent.putExtra("sendeatSomething",eatSomething);
_intent.putExtra("sendcopies",copies);

           startActivity(_intent);
        }
    });

B接收代码如下:
// 接收SendActivity中传递过来的值;
// 需要确定,只有SendActivity中传递过来的值才能触发,否则第一次执行的时候会出现空指针异常;
try {
Intent _getIntent = this.getIntent();
if( _getIntent.getExtras().getString("sendName") != null){
Log.i("YuryLog","理论上只有点了确认键才执行");
receiveName = _getIntent.getExtras().getString("sendName");
receiveEatSomething = _getIntent.getExtras().getString("sendeatSomething");
receiveCopies = _getIntent.getExtras().getString("sendcopies");

            Log.i("YuryLog",receiveName + receiveEatSomething + receiveCopies);
            //        在界面中显示接收到的值
            //        获取到TextView的id,再动态的更改它的值
            TextView _textView =(TextView) findViewById(R.id.textView4);
            TextView _textView2 =(TextView) findViewById(R.id.textView5);

            _textView.setText(receiveName+": ");
            _textView2.setText("来" + receiveCopies + "份" + receiveEatSomething);
        }
    }catch (Exception e){
        e.printStackTrace();
    }

万分感谢各位能提供一个思路,谢谢。

解决方案

首先,尽量不要用try{}catch去捕捉能用判断规避的异常,那样会影响效率,每次出现异常,虚拟机要抓错误调用堆栈。所以,最好的方式是通过判断去规避。
按你的思路,可以先判断getIntent.getExtras()是否为null。
Intent _getIntent = this.getIntent();
if( _getIntent.getExtras() != null){
Log.i("YuryLog","理论上只有点了确认键才执行");
receiveName = _getIntent.getExtras().getString("sendName");
receiveEatSomething = _getIntent.getExtras().getString("sendeatSomething");
receiveCopies = _getIntent.getExtras().getString("sendcopies");
......

要指出的是,上述代码,最好使用getXXXExtra这类方法,它不会出现空指针(除了少数几个,比方说getStringExtra)。
需要设定默认值的,在没有值时它会返回默认值;没有设置默认值的,在没有值时会返回null,针对这类判空一下。
可以看下getBooleanExtra的源码:
public boolean getBooleanExtra(String name, boolean defaultValue) {
return mExtras == null ? defaultValue :
mExtras.getBoolean(name, defaultValue);
}

而getExtras()在没有值时会返回null,看下源码:
public Bundle getExtras() {
return (mExtras != null)
? new Bundle(mExtras)
: null;
}

所以,最好不要用getIntent().getExtras()这种方式,换用getIntent().getXXXExtras(),这样针对有设置默认值的就不需要判空了。

activity之间传值,是没有机制可以确定哪个activity传过来的。这是考虑到代码的可扩展性,解耦。要确定哪个activity发过来,在intent创建那里多传个布尔值就行,比方说下面的代码。
发送
intent.putExtra("fromXXActivity", true);

    接收
    if (getIntent().getBooleanExtra("fromXXActivity", false)) {
        ......
                    // 这里,你就可以安全的接收那个activity发过来的所有值。
    }

解决方案二:

使用Bundle来传递数据...具体可以百度Bundle的用法...
大概是这样:
1、传数据:
Bundle bundle = new Bundle();
bundle.putString("itemName", "name");
bundle.putString("itemClass", "class");
Intent intent = new Intent();
intent.setClass(MainActivity.this, InformationActivity.class);
intent.putExtras(bundle);
startActivityForResult(intent, 1);
2、收数据方:
Bundle bundle = this.getIntent().getExtras();
String name = bundle.getString("itemName");
String cla = bundle.getString("itemClass");

解决方案三:

简单来说就是通过关键字来区分

时间: 2024-12-05 07:27:04

android-Android Intent 如何接收到指定的Intent传递过来的值呢?的相关文章

Android中BroadcastReceiver(异步接收广播Intent)的使用_Android

Broadcast Receiver简介 Broadcast Receiver是Android的五大组件之一,使用频率也很高. 用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().Context.sendOrderedBroadcast()或者Context.sendStickyBr

Android中BroadcastReceiver(异步接收广播Intent)的使用

Broadcast Receiver简介 Broadcast Receiver是Android的五大组件之一,使用频率也很高. 用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().Context.sendOrderedBroadcast()或者Context.sendStickyBr

Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)

原文:[置顶] Android菜鸟的成长笔记(8)--Intent与Intent Filter(上) Intent代表了Android应用的启动"意图",Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,取决于Intent的各个属性. 一.显式的Intent 明确指定了要启动的组件的Intent我们称为显式的Intent 例如: package com.example.testintent; import android.app.Activity; impor

Android中原生的动作意图(native activity intent)简介

原生动作(Native Activity), 都是Intent类中的静态字符串常量(static final String). 在创建隐式的Intent来启动应用程序内的Activity或者SubActivity时, 可以应用这些动作. Android APIs: http://developer.android.com/reference/android/content/Intent.html 主要包括: ACTION_ALL_APPS: 列出所有已安装程序; ACTION_ANSWER: 处

Android简明开发教程七:Intents和Intent Filters

Android应用中的三个核心组件:Activities,Services和broadcast receivers都是通过称为"Intent"的消息来激活的. Android应用一个特点是"低耦合",各个Activities,Services和broadcast receivers相当独立,可以看成是一个个"迷你应 用",而Intent是这些"迷你应用"的粘合剂,Intent不但可以用于同一个Application之间Acti

Android菜鸟的成长笔记(9)——Intent与Intent Filter(下)

原文:[置顶] Android菜鸟的成长笔记(9)--Intent与Intent Filter(下) 接着上一篇的内容,下面我们再来看看Intent的Data与Type属性. 一.Data属性与Type属性 Data属性通常用于向Action属性提供操作的数据,Data属性接受一个Uri对象 格式:scheme://host:port/path 例如: content://com.android.contacts/contacts/1 tel:123 其中prot部分被省略了,contacts/

Android编程实现全局获取Context及使用Intent传递对象的方法详解

本文实例讲述了Android编程实现全局获取Context及使用Intent传递对象的方法.分享给大家供大家参考,具体如下: 一.全局获取 Context Android 开发中很多地方需要用到 Context,比如弹出 Toast.启动活动.发送广播.操作数据库-- 由于很多操作都是在活动中进行的,而活动本身就是一个 Context 对象,所以获取 Context 并不是那么困难. 但是,当应用程序的架构逐渐开始复杂起来的时候,很多的逻辑代码都将脱离 Activity 类,由此在某些情况下,获

udp-PC端用UDP组播文件,android上如何来接收到该文件

问题描述 PC端用UDP组播文件,android上如何来接收到该文件 如题所说,我在PC端用工具将.zip升级包通过命令的方式广播出来,我的android盒子端如何去接收到升级包文件,又如何判断包的完整性 解决方案 http://blog.csdn.net/cuiran/article/details/40558085

android下java可以接收普通短信吗?

问题描述 android下java可以接收普通短信吗?不会象J2ME一样要端口号吧? 解决方案 解决方案二:可以接收,不需要端口号,使用SmsManager即可完成