在不同Activity传递数据(四种方式)

四种传递方法:

1.通过Intent传递数据;

2.通过静态变量传递数据;

3.通过剪切板传递数据;

4.通过全局对象传递数据;

分类介绍:

1.通过Intent传递数据;

代码如下:

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="${relativePackage}.${activityClass}" >

   <Button
       android:id="@+id/btnintent"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="通过Intent传递数据"
       android:textSize="18sp"
       />

</LinearLayout>

可序列化类的代码:

package com.example.transdata;

import java.io.Serializable;

public class Data implements Serializable{

	public int id;
	public String name;

}

第一个Activity的代码:

package com.example.transdata;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn = (Button) findViewById(R.id.btnintent);
        btn.setOnClickListener(this);
    }

	@Override
	public void onClick(View v) {
		Intent intent = null;
		switch (v.getId()) {
		case R.id.btnintent:
			intent = new Intent(this, OtherActivity.class);
			intent.putExtra("intent_string", "通过Intent传递的字符串");
			intent.putExtra("intent_integer", 300);
			Data data = new Data();
			data.id = 1000;
			data.name = "Android";
			intent.putExtra("intent_object", data);
			startActivity(intent);
			break;

		default:
			break;
		}

	}
}

第二个Activity的代码:

package com.example.transdata;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class OtherActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_other);
		TextView tvWord = (TextView) findViewById(R.id.tv_word);

		String intentString = getIntent().getStringExtra("intent_string");

		int intentInteger = getIntent().getExtras().getInt("intent_integer");

		Data data = (Data) getIntent().getExtras().get("intent_object");

		StringBuffer sb = new StringBuffer();

		sb.append(intentString);

		sb.append("\n");

		sb.append(intentInteger);

		sb.append("\n");

		sb.append(data.id);
		sb.append(data.name);

		tvWord.setText(sb.toString());
	}

}

注意:需要注意的是传输三种数据类型的不同,传输:String类型、Integer类型、可序列化类型;

intent.putExtra("intent_string", "通过Intent传递的字符串");
			intent.putExtra("intent_integer", 300);
			Data data = new Data();
			data.id = 1000;
			data.name = "Android";
			intent.putExtra("intent_object", data);

在第二个Activity中收到第一个Activity传递的数据也不同:

	String intentString = getIntent().getStringExtra("intent_string");

		int intentInteger = getIntent().getExtras().getInt("intent_integer");

		Data data = (Data) getIntent().getExtras().get("intent_object");

另外显示数据的时候,用到了StringBuffer(可变,线程安全):

StringBuffer sb = new StringBuffer();

		sb.append(intentString);

		sb.append("\n");

		sb.append(intentInteger);

		sb.append("\n");

		sb.append(data.id);
		sb.append(data.name);

		tvWord.setText(sb.toString());

2.通过静态变量传递数据;

Intent传递数据具有局限性,Intent无法传递不能序列化的对象。这时候使用静态变量传递数据可以解决。

新建的一个Activity的代码如下:

package com.example.transdata;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class OtherActivity2 extends Activity {

	public static String name;

	public static int id;

	public static Data data;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_other2);

		TextView tvWord = (TextView) findViewById(R.id.tv_word);

		StringBuffer sb = new StringBuffer();

		sb.append(name);

		sb.append("\n");

		sb.append(id);
		sb.append("\n");

		sb.append(data.id);
		sb.append("\n");

		sb.append(data.name);

		tvWord.setText(sb.toString());

	}

}

主界面的布局中,添加一个新的按钮,主要的逻辑代码如下:

case R.id.btnstatic:
			intent = new Intent(this, OtherActivity2.class);
			OtherActivity2.id = 3000;
			OtherActivity2.name="保时捷";
			OtherActivity2.data = new Data();
			OtherActivity2.data.id = 1000;
			OtherActivity2.data.name = "Android";
			startActivity(intent);
			break;

3.通过剪切板传递数据;

剪切板只能存储简单类型的数据类型或可序列化的对象,对于某些不可序列化的对象如果可以将其转换为字节流(字节数组),也可以将这些对象保存到剪切板中。本例中不是直接将Data对象保存在剪切板中,而是将Data对象转换为Base64编码后以字符串的形式存储在剪切板中。

MainActivity主要代码如下:

case R.id.btnClipboard:
			intent = new Intent(this, OtherActivity3.class);
			//获取剪切板的对象
			ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);

			Data clipdata = new Data();

			clipdata.id = 6666;

			clipdata.name = "testclipdata";
			//创建字节数组输出流对象,用于将Data对象转换为字节流
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			//存储的字符串
			String base64Str = "";

			try {
				//对象流
				ObjectOutputStream oos = new ObjectOutputStream(baos);

				oos.writeObject(clipdata);
				//将字节流进行Base64编码
				base64Str = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);

				oos.close();

			} catch (IOException e) {
				e.printStackTrace();
			}
			//获取存储文本数据的剪切板数据的对象
			ClipData text = ClipData.newPlainText("data", base64Str);
			//设置主剪切板
			clipboard.setPrimaryClip(text);

			startActivity(intent);
			break;

核心代码已经加上注释了。

显示数据的Activity:

package com.example.transdata;

import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.util.Base64;
import android.widget.TextView;

@SuppressLint("NewApi") public class OtherActivity3 extends Activity {

	@TargetApi(Build.VERSION_CODES.HONEYCOMB) @SuppressLint("NewApi") @Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_other3);

		TextView tvWord = (TextView) findViewById(R.id.tv_word);

		ClipboardManager manager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
		//从剪切板中获取Base64编码的字符串
		String base64Str = manager.getPrimaryClip().getItemAt(0).getText().toString();
		//将Base64编码字符串解码成字节数组
		byte[] buffer = Base64.decode(base64Str, Base64.DEFAULT);

		ByteArrayInputStream bais = new ByteArrayInputStream(buffer);

		try {
			ObjectInputStream ois = new ObjectInputStream(bais);

			//将字节流还原为Data对象
			Data data = (Data) ois.readObject();

			tvWord.setText(base64Str+":" + data.id + ":" + data.name);

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

4.通过全局对象传递数据;

使用静态变量具有局限性(1.大量使用静态变量会造成内存溢出;2.静态变量在很多类中出现容易造成代码难以维护和混乱的情况)。

全局对象所对应的类必须从android.app.Application继承。

全局类:

package com.example.transdata;

import android.app.Application;

public class MyApplication extends Application {

	//必须有一个无参的构造器
	public String country;

	public Data data = new Data();

}

MainActivity的点击事件:

case R.id.btnApplication:

			//必须先获取全局对象
			MyApplication application = (MyApplication) getApplicationContext();

			application.country = "china";

			application.data.id = 123;

			application.data.name = "testapplication";

			intent = new Intent(this, OtherActivity4.class);

			startActivity(intent);

			break;

显示的Activity:

package com.example.transdata;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class OtherActivity4 extends Activity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_other4);

		TextView tvWord = (TextView) findViewById(R.id.tv_word);

		MyApplication application = (MyApplication) getApplicationContext();

		tvWord.setText(application.country + ":" + application.data.id + ":" + application.data.name);

	}

}

总结:

传递基本类型或可序列化的数据,用Intent;

传递不可序列化的对象,最好使用全局对象;如果想让某些数据长时间驻留在内存,最好使用全局对象。

时间: 2024-08-01 16:10:27

在不同Activity传递数据(四种方式)的相关文章

ios页面间传递参数四种方式

ios页面间传递参数四种方式 1.使用SharedApplication,定义一个变量来传递. 2.使用文件,或者NSUserdefault来传递 3.通过一个单例的class来传递 4.通过Delegate来传递. IOS开发使用委托delegate在不同窗口之间传递数据是本文要介绍的内容,主要是来讲解如何使用委托delegate在不同窗口之间传递数据,具体内容来看详细内容.在IOS开发里两个UIView窗口之间传递参数方法有很多,比如 前面3种方法,暂且不说,这次主要学习如何使用通过Dele

Activity启动的四种方式

Activity启动方式有四种,分别是: standardsingleTopsingleTasksingleInstance 可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity等问题. 设置Activity的启动模式,只需要在AndroidManifest.xml里对应的<activity>标签设置Android:launchMode属性,例如: [html] view plain copy <activity android:name=&

IOS开发笔记(2)页面之间传递数据几种方式比较

今天分享一下页面之间传值的几种方式 1.@property属性 这个不用多说了吧,当页面A 跳转到页面B,在class B中声明属性 @property (nonatomic, copy) NSString *name; 初始化B FirstViewController *firstVC = [FirstViewController new]; firstVC.name = @"name"; [self presentViewController:firstVC animated:YE

Struts2中表单与Action传递数据三种方式

1.       Action中的属性与表单中的属性一致就可以 JSP中的表单 <form action="login.action" method="post"> 用户名:<input type="text" name="username"/>    <br/> 密码:  <input type="password" name="password&quo

Json传递数据两种方式

@PostMapping(value = "/list") @ResponseBody public void invoiceDetail2(String ids) { JSONObject jsonobject = JSONObject.parseObject(ids); JSONArray jsonArray = JSONArray.parseArray(jsonobject.get("list1").toString()); List<String>

EF5(7) 后台使用SelectListItem传值给前台显示Select下拉框;mvc后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式

一:后台使用SelectListItem 传值给前台显示Select下拉框 我们先来看数据库的订单表,里面有3条订单,他们的用户id对应了 UserInfo用户表的数据,现在我们要做的是添加一个Order控制器,显示订单列表,并且在修改订单的时候,把用户的id 用 select 下拉框显示出来,并且可以提交修改数据   1.1 我们通过比较原始的方法,来把数据 传递到前台后,前台使用  循环来显示 select 并且显示是哪个元素被选中 我们在前台的cshtml中,使用 @model 命令 指定

Android——数据存储(四种方式之一)SharedPrefereces

Android--数据存储(四种方式) 1.SharedPrefereces   轻量级.XML  存储文件名,数据保存在data/data/basepackage/shared_prefs/myopt.xml中   实例-收藏-记住密码自动登录 //一种轻量级的数据存储方式//通过KEY 存入数据--putxxxx(key,value) 取出数据--getxxxx(key  default)   2.读写SD卡  SD的根目录  适用于数据流读写 3.SQLite  轻量级.dp文件多用于手机

IOS数据本地存储的四种方式--

注:借鉴于:http://blog.csdn.net/jianjianyuer/article/details/8556024 在IOS开发过程中,不管是做什么应用,都会碰到数据保存问题.将数据保存到本地,能够让程序更加流畅,不会出现让人厌恶的菊花状,使得用户的体验更好.下面是介绍数据保存的方式 第一.NSKeyedArchiver:采用归档的形式来保存数据.(归档——解档)———大量数据和频繁读写不合适使用 1.归档器的作用是将任意的对象集合转换为字节流.这听起来像是NSPropertyLis

Android——数据存储(四种方式之二)读写SD卡

Android--数据存储(四种方式) 1.SharedPrefereces 只能保存一些简单的数轻量级.XML  存储文件名, 数据保存在data/data/basepackage/shared_prefs/myopt.xml中    实例-收藏-记住密码自动登录 //一种轻量级的数据存储方式//通过KEY 存入数据--putxxxx(key,value) 取出数据--getxxxx(key  default) 2.读写SD卡  SD的根目录  适用于数据流读写 实现步骤:加入读写SD卡权限

Android开发之数据存储的四种方式之SharedPreferences

Android项目开发中使用的数据存储方式有:网络存储.sqlite存储.File存储和SharedPreferences存 储,四种存储方式对应的Demo别人是NetworkDemo.SqliteDemo.FileDemo和SharedPreferencesDemo, 根据应用的场景选择其中一种或多种方式,比如在登录界面验证,需要将用户名和密码通过SharedPreferences方式保存,注册信息的时候需要通 过网络将数据存储到后台数据库中.结合一个登录界面的验证,使用SharedPrefe