文档章节

糊里糊涂学Android(1)——Activity之间的数据传递

笑缘心归
 笑缘心归
发布于 2014/03/15 23:51
字数 1332
阅读 157
收藏 7

    在Activity之间传递数据,主要的方法有四种:

  • 利用静态字段传递;

  • 利用Intent传递;

  • 利用ClipboardManager传递;

  • 利用全局变量传递。

    下面就一一道来,首先呢,创建一个Android Application Project,自取名DataTransfer,class为Main.java。要实现数据传递,至少要两个Activity,所以分别添加一个class——Other.java(继承自Activity),和一个layout文件——other.xml,并在AndroidManifest.xml中写入Other这个Activity。然后在main.xml中添加一个按钮Button,在other.xml中添加一个TextView,实现在点击Button时,跳转到Other,并显示传递的数据。(注:具体代码在最后给出)

1.利用静态字段传递

    这种方法应该是最简单的一种了,利用每个Activity子类的公有静态字段传递,无论是当前Activity中的字段,还是要跳转到的Activity中的字段,都可以作为数据传递的载体。因为静态字段是类的对象所共有的,与具体实例无关,所以用该方法可以实现数据传递。具体实现是比较简单的,比如在Main和Other中各添加一个公有静态String字段,在响应按钮点击事件的方法中,分别将两个字段赋值,然后在TextView中显示出来就可以了。

2.利用Intent传递

   这是比较通用的方法,因为在Activity之间跳转,就需要使用Intent来实现,意图就是来表明你要干什么。Intent对象中有一个putExtra方法,该方法大约有20多种重载,几乎包含了所有值类型和引用类型,几乎可以传递各种数据。另外,还有接收数据的方法,例如接收int数据,可以用getIntExtra方法。使用Intent传递就是在Main中使用putExtra方法使要传递的数据保存到内存中,然后在Other中使用相对应的方法来接收数据,并在TextView中显示出来。

3.利用ClipboardManager传递

    该方法算是比较巧妙的一种,利用系统提供的剪切板的服务来实现的,将要传递的数据数据放到剪切板上,然后在剪切板上取相应的数据。在两个Activity中声明ClipboardManager的对象,在Main中使用该对象的setText方法传递,在Other中使用getText方法获得数据。

4.利用全局变量传递

    该方法是指利用继承Application类保存全局变量来传递,SDK中对于该类的解释:Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your AndroidManifest.xml's <application> tag, which will cause that class to be instantiated for you when the process for your application/package is created。通俗的说就是,在程序或包创建的时候,该类就随之建立了,因此,该类中的数据始终存在,对于所有的其他类来说,就相当于是全局变量,可以设置,也可以获取。该方法是比较好的一种,要使用该方法,首先新建一个类,并继承自Application,在里面添加字段。再使用Activity的getApplication方法来获得一个application对象,分别使用该对象的get和set方法传递和获取数据。

具体代码实现:

/*Main.java*/
package com. example.transfer ;

import com. example.transfer .R;

import android. R.string ;
import android. os.Bundle ;
import android. app.Activity ;
import android. content.ClipboardManager ;
import android. content.Intent ;
import android. view.Menu ;
import android. view.View ;
import android. widget.Button ;

public class Main extends Activity {

     Button button;
     MyData myData;
      public static String major = "软件工程" ;

      @Override
      protected void onCreate( Bundle savedInstanceState) {
           super. onCreate(savedInstanceState );
           setContentView(R .layout. main);
           button = (Button ) this. findViewById(R .id. button);
           button.setOnClickListener (new View.OnClickListener() {

               @Override
               public void onClick( View v) {
                    // TODO 自动生成的方法存根
                    // 利用Intent使Activity跳转
                    // 可以直接使用构造方法实现;
                    // Intent intent = new Intent(Main.this, OtherActivity.class);
                    // 也可以使用其中的setClass方法实现
                   Intent intent = new Intent();
                   intent .setClass( Main.this, OtherActivity.class);

                    // 利用Intent传递数据
                   intent .putExtra( "College", "西南交通大学" );
                   intent .putExtra( "Grade", 2011 );
                    // 利用静态变量传递数据,直接给静态变量赋值
                   OtherActivity .myclass = "三班" ;
                    // 利用剪切板传递数据
                   ClipboardManager clipboardManager = (ClipboardManager) getSystemService( CLIPBOARD_SERVICE);
                   String address = "成都";
                   clipboardManager .setText(address);
                    // 利用全局变量传递数据
                    myData = (MyData ) getApplication ();
                    myData.setName ("笑缘心归");

                    startActivity(intent );// 启动Intent
               }
           });
      }
}

/**
 * OtherActivity.java
 */
package com.example.transfer;

import com.example.transfer.R;

import android.app.Activity;
import android.content.ClipboardManager;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

/**
 * @author Mlion
 * 
 */
public class OtherActivity extends Activity {
	MyData myData;
	private TextView textView;
	public static String myclass = new String();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO 自动生成的方法存根
		super.onCreate(savedInstanceState);
		setContentView(R.layout.other);// 加载布局文件
		// 获取Intent传入的数据并显示
		// 使用get...Extra方法获得Intent传递的值,直接使用静态变量传值
		Intent intent = getIntent();
		textView = (TextView) this.findViewById(R.id.msg);
		ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
		String address = clipboardManager.getText().toString();
		myData = (MyData) getApplication();

		textView.setText("姓名:" + myData.getName() + "\n学校:"
				+ intent.getStringExtra("College") + "\n年级:"
				+ intent.getIntExtra("Grade", 0) + "\n专业:" + Main.major
				+ "\n班级:" + myclass + "\n地址:" + address);
	}
}

/*MyData.java*/
package com.example.transfer;

import android.app.Application;

public class MyData extends Application {
	public String name = new String();

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

在Manifest.xml中的<Application >标签中添加以下代码

android:name=".MyData"
<activity android:name="com.example.transfer.OtherActivity" >
</activity>

在main.xml中添加:

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="数据传递" />

在other.xml中添加:

    <TextView
        android:id="@+id/msg"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

运行结果:



© 著作权归作者所有

共有 人打赏支持
笑缘心归
粉丝 2
博文 3
码字总数 3174
作品 0
成都
程序员
私信 提问
Flutter 即学即用系列博客——09 MethodChannel 实现原生与 Flutter 通信(二)

前言 上一篇我们讲解了如何通过 EventChannel 实现 Android -> Flutter 的通信。 并且也看到了 Flutter 内部 EventChannel 源码也是对 MethodChannel 的封装。 因此这篇我们来说下如何通过 ...

AndroidTraveler
03/23
0
0
Android SDK Document 框架导读的翻译和注解[7]——Intents and Intent Filters

Android应用程序中三个主要的组件——Activity, Service, Broadcast receiver——都是由Intent中传递过来的消息激活的, Intent消息传递是这样一个基础手段,它把相同或者不同应用程序的组件...

晨曦之光
2012/03/09
92
0
Android SDK Document 框架导读的翻译和注解[7]——Intents and Intent Filters

Android应用程序中三个主要的组件——Activity, Service, Broadcast receiver——都是由Intent中传递过来的消息激活的, Intent消息传递是这样一个基础手段,它把相同或者不同应用程序的组件...

晨曦之光
2012/03/07
189
0
Intent跳转问题

问题: 四个按钮不能成功跳转!!!! 求解决~~~ package com.niuniu.activity; import com.niuniu.dao.KcDAO; import com.niuniu.dao.KjDAO; import com.niuniu.dao.StudentsDAO; import co......

JoneWisso
2014/05/19
122
0
Android:SharedPreferences解析和实现记住用户名

SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,它提供了Android平台常规的Long长整形、Int整形、String字符串型的保存。S...

岑浩源
2012/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。

import java.util.Stack; public class Solution { public boolean IsPopOrder(int [] pushA,int [] popA) { if(pushA.length==0||popA.length==0) return false; Stack......

南桥北木
13分钟前
0
0
互联网浪潮下,Java程序员如何追赶技术革新的脚步?

一:时代背景 身处互联网行业的我们一直处在变革的最前端,受到行业发展浪潮的洗礼,不停歇地追赶着技术革新的脚步。特别是近几年来, 互联网架构不断演化,经历了从集中式架构到分布式架构,...

老道士
20分钟前
0
0
flink系列(9)-flink启动流程分析

连续写了几天的flink StreamGraph的代码,今天闲来说一下flink的启动

yiduwangkai
33分钟前
0
0
取变量的地址赋值给另一个变量,C通过,C++编译出错

取变量的地址赋值给另一个变量,C通过。正常运行,C++编译出错。 代码如下: #include <stdio.h>int main(int argc, char *argv[]){int x = 3;int *p = &x;int y = p;/*c ...

SamXIAO
今天
1
0
利用隐写术实施攻击

尽管隐写术是一种低频攻击途径,但网络犯罪分子已经开始利用它结合社交媒体的普遍性和快速传播性来传递恶意有效负载。 低调但有效的隐写技术虽然是旧把戏,但将代码隐藏在看似正常的图像中,...

Linux就该这么学
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部