首页 > 代码库 > 在不同Activity传递数据(四种方式)
在不同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 = http://www.mamicode.com/new Data();>
第二个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 = http://www.mamicode.com/(Data) getIntent().getExtras().get("intent_object");>
注意:需要注意的是传输三种数据类型的不同,传输:String类型、Integer类型、可序列化类型;
intent.putExtra("intent_string", "通过Intent传递的字符串"); intent.putExtra("intent_integer", 300); Data data = http://www.mamicode.com/new Data();>
在第二个Activity中收到第一个Activity传递的数据也不同:
String intentString = getIntent().getStringExtra("intent_string"); int intentInteger = getIntent().getExtras().getInt("intent_integer"); Data data = http://www.mamicode.com/(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 = http://www.mamicode.com/new Data();>
3.通过剪切板传递数据;剪切板只能存储简单类型的数据类型或可序列化的对象,对于某些不可序列化的对象如果可以将其转换为字节流(字节数组),也可以将这些对象保存到剪切板中。本例中不是直接将Data对象保存在剪切板中,而是将Data对象转换为Base64编码后以字符串的形式存储在剪切板中。
MainActivity主要代码如下:
case R.id.btnClipboard: intent = new Intent(this, OtherActivity3.class); //获取剪切板的对象 ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); Data clipdata = http://www.mamicode.com/new Data();>
核心代码已经加上注释了。显示数据的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 = http://www.mamicode.com/(Data) ois.readObject();>
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 = http://www.mamicode.com/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;
传递不可序列化的对象,最好使用全局对象;如果想让某些数据长时间驻留在内存,最好使用全局对象。
在不同Activity传递数据(四种方式)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。