Intent跳转传list集合

本文介绍了如何在Android应用程序的不同Activity之间通过Intent传递ArrayList对象的方法。具体实现了将一个包含自定义类型元素的ArrayList从MainActivity传递到InfoActivity的过程。

先把List<>改为ArrayList<>

ArrayList<Good> list=new ArrayList<Good>();
Intent intent = new Intent(MainActivity.this,InfoActivity.class);
intent.putExtra("list", list); startActivity(intent);
Intent intent = getIntent();
ArrayList<Good> list= (ArrayList<Good>) intent.getSerializableExtra("list");

转载于:https://www.cnblogs.com/1426837364qqcom/p/5397979.html

<think>我们正在讨论Android开发中通过Intent递参数的方法。根据引用内容,我们可以总结出几种常见的方式: 1. 使用`putExtra`方法递基本数据类型或字符串(如引用[1]所示)。 2. 递可序列化对象(如引用[5]提到的通过实现`Serializable`接口递自定义类的ArrayList)。 3. 使用`startActivityForResult`方法启动Activity并期待返回结果(如引用[3]所示)。 4. 使用Application类来保存全局状态(如引用[2]所示),但注意这不是通过Intent递,而是全局共享。 另外,引用[4]提到,对于复杂的参数,如果不想使用Intent递,可以考虑静态变量,但要注意其生命周期。 下面我将详细介绍这些方法,并给出示例代码。 ### 1. 递基本数据类型和字符串 Intent可以携带基本数据类型(如int, float, boolean等)以及字符串。使用`putExtra`方法添加数据,在目标Activity中使用`getXXXExtra`方法获取。 **示例:** 发送Activity中: ```java Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("key_string", "Hello"); intent.putExtra("key_int", 100); startActivity(intent); ``` 目标Activity中: ```java Intent intent = getIntent(); String str = intent.getStringExtra("key_string"); int num = intent.getIntExtra("key_int", 0); // 第二个参数为默认值 ``` ### 2. 递可序列化对象 如果递自定义对象,需要实现`Serializable`或`Parcelable`接口。`Parcelable`是Android推荐的,效率更高。 **示例(使用Serializable):** 自定义类: ```java public class User implements Serializable { private String name; private int age; // 构造方法、getter和setter } ``` 发送Activity: ```java Intent intent = new Intent(this, TargetActivity.class); User user = new User("Tom", 25); intent.putExtra("user", user); startActivity(intent); ``` 目标Activity: ```java User user = (User) getIntent().getSerializableExtra("user"); ``` **示例(使用Parcelable):** 自定义类: ```java public class User implements Parcelable { private String name; private int age; // 构造方法、getter和setter protected User(Parcel in) { name = in.readString(); age = in.readInt(); } public static final Creator<User> CREATOR = new Creator<User>() { @Override public User createFromParcel(Parcel in) { return new User(in); } @Override public User[] newArray(int size) { return new User[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } } ``` 发送和接收的代码与上面类似,只是使用`getParcelableExtra`方法获取: ```java User user = getIntent().getParcelableExtra("user"); ``` ### 3. 集合 可以递`ArrayList`,但要求其中的元素是可序列化的(如引用[5]所示)。 **示例:** 发送Activity: ```java ArrayList<User> users = new ArrayList<>(); // 添加User对象 Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("users", users); startActivity(intent); ``` 目标Activity: ```java ArrayList<User> users = (ArrayList<User>) getIntent().getSerializableExtra("users"); ``` ### 4. 使用`startActivityForResult`递数据并返回结果 当需要从目标Activity返回数据给源Activity时,可以使用此方法。 **示例:** 源Activity: ```java Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("request_key", "some data"); startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE是一个自定义的int请求码 ``` 在目标Activity中设置返回结果: ```java Intent resultIntent = new Intent(); resultIntent.putExtra("result_key", "result data"); setResult(RESULT_OK, resultIntent); finish(); ``` 在源Activity中重写`onActivityResult`方法: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { String result = data.getStringExtra("result_key"); // 处理返回结果 } } ``` ### 5. 全局变量(非Intent方式) 如果数据需要在多个Activity中共享,可以考虑使用Application类(如引用[2]所示)或使用单例模式。 **示例:** 自定义Application类: ```java public class MyApp extends Application { private String globalData; public String getGlobalData() { return globalData; } public void setGlobalData(String globalData) { this.globalData = globalData; } } ``` 在AndroidManifest.xml中声明: ```xml <application android:name=".MyApp" ...> </application> ``` 在任何Activity中都可以获取和设置: ```java MyApp app = (MyApp) getApplicationContext(); app.setGlobalData("global value"); String data = app.getGlobalData(); ``` ### 注意事项 - 使用Intent递数据时,注意数据大小限制。根据Android系统的限制,递的数据量不宜过大(引用[1]提到,但未给出具体限制,实际中一般不超过1MB,不同设备可能不同),否则可能导致TransactionTooLargeException异常。 - 对于大量数据的递,建议使用全局变量、数据库、文件或ContentProvider等方式。 ### 总结 通过Intent递参数是Android中Activity之间递数据的主要方式,支持基本类型、字符串、序列化对象和集合。对于需要返回结果的情况,使用`startActivityForResult`。对于复杂或大量数据,考虑使用全局变量或其他方式。 §§相关问题§§ 1. 如何解决Intent递数据量过大导致TransactionTooLargeException的问题? 2. Parcelable和Serializable在性能上有什么区别?如何选择? 3. 除了Intent,还有哪些在Activity之间递数据的方式? 4. 如何安全地在Application类中保存全局变量?</think>### Android Intent 递参数的方法总结 在Android开发中,Intent递参数主要通过`putExtra()`方法实现,支持多种数据类型。以下是具体方法和示例: #### 1. **基本数据类型递** ```java // 发送方Activity Intent intent = new Intent(SourceActivity.this, TargetActivity.class); intent.putExtra("STRING_KEY", "文本数据"); // 字符串 intent.putExtra("INT_KEY", 100); // 整型 intent.putExtra("BOOLEAN_KEY", true); // 布尔值 startActivity(intent); ``` ```java // 接收方Activity Intent intent = getIntent(); String str = intent.getStringExtra("STRING_KEY"); int num = intent.getIntExtra("INT_KEY", 0); // 0是默认值 boolean flag = intent.getBooleanExtra("BOOLEAN_KEY", false); ``` #### 2. **集合对象** 需实现`Serializable`或`Parcelable`接口: ```java // 自定义类实现Serializable public class User implements Serializable { private String name; private int age; // 构造方法/getter/setter } ``` ```java // 发送ArrayList ArrayList<User> userList = new ArrayList<>(); intent.putExtra("USER_LIST", userList); ``` ```java // 接收方 ArrayList<User> list = (ArrayList<User>) getIntent().getSerializableExtra("USER_LIST"); ``` #### 3. **递Parcelable对象(推荐)** 更高性能的序列化方式: ```java public class Product implements Parcelable { private String id; private String name; // Parcelable实现代码(含CREATOR、writeToParcel等方法) } ``` ```java // 递对象 intent.putExtra("PRODUCT", new Product("P123", "手机")); ``` ```java // 接收方 Product product = getIntent().getParcelableExtra("PRODUCT"); ``` #### 4. **带返回值的参数递** 使用`startActivityForResult()`: ```java // 发送方 Intent intent = new Intent(this, SelectActivity.class); startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE=1 ``` ```java // 接收方(SelectActivity) Intent resultIntent = new Intent(); resultIntent.putExtra("SELECTED_ITEM", "选项A"); setResult(RESULT_OK, resultIntent); finish(); ``` ```java // 发送方接收返回数据 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == REQUEST_CODE && resultCode == RESULT_OK) { String item = data.getStringExtra("SELECTED_ITEM"); } } ``` #### 5. **全局参数递(非Intent方式)** 当参数过大或需跨多页面共享时: ```java // 自定义Application类 public class MyApp extends Application { private static Map<String, Object> globalParams = new HashMap<>(); public static void setParam(String key, Object value) { globalParams.put(key, value); } public static Object getParam(String key) { return globalParams.get(key); } } ``` ```java // 使用全局参数 MyApp.setParam("CONFIG_DATA", largeConfigObject); // 在其他Activity获取 Config config = (Config) MyApp.getParam("CONFIG_DATA"); ``` ### ⚠️ 注意事项 1. **数据大小限制**:Intent输数据不宜超过1MB,否则可能触发`TransactionTooLargeException`[^1] 2. **序列化性能**:`Parcelable`比`Serializable`效率高30倍以上,推荐优先使用[^5] 3. **数据类型支持**:Intent额外支持`Bundle`、`Parcelable[]`、`SparseArray`等类型 4. **安全提示**:避免通过Intent递敏感数据(如密码),可用`SecureSharedPreferences` ### 典型应用场景 - 页面跳转递ID/名称等简单数据 → `putExtra()` - 商品详情页递复杂对象 → `Parcelable` - 城市选择器返回结果 → `startActivityForResult()` - 应用配置信息共享 → `Application`全局存储
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值