2019独角兽企业重金招聘Python工程师标准>>>

Intent是Activity与Activity之间,Activity与Service之间传递参数的介质

Intent传递的参数类型有:

1. 传递List<String>和List<Integer>

以下以传递List<String>为例,发送List<String>语法为:

intent.putStringArrayListExtra(key, list);

接收List<String>的语法为:

list = (ArrayList<String>)getIntent().getStringArrayListExtra(key);

以下是一个运用实例:

// =============发送List<String>=============
ArrayList<String> stringList = new ArrayList<String>();
stringList.add("string1");
stringList.add("string2");
stringList.add("string3");
Intent intent = new Intent();
intent.setClass(ListDemoActivity.this, StringListActivity.class);
intent.putStringArrayListExtra("ListString", stringList);
startActivity(intent);
// ====================接收List<String>======================
ArrayList<String> stringList = (ArrayList<String>) getIntent().getStringArrayListExtra("ListString");

List<Integer>类似以上的操作调用下面的方法也可以实现发送和接收:

intent.putIntegerArrayListExtra(key, list);

list =(ArrayList<Integer>) getIntent().getIntegerArrayListExtra(key);

2. 使用Serializable和Parcelable两种方式传递Object

Android的Intent之间传递对象有两种方法,一种是 Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key,Object)。 方法中的Object要满足一定的条件,前者实现了Serializable接口,而后者实现了Parcelable接口。

以下是实现了Serializable接口的User类,命名为SerializableUser纯粹是从类名方便区分实现了Parcelable接口的User类,实际开发中不建议这么命名:

public class SerializableUser implements Serializable {  private String userName;  private String password;  public SerializableUser() {  }  public SerializableUser(String userName, String password) {  this.userName = userName;  this.password = password;  }  public String getUserName() {  return userName;  }  public void setUserName(String userName) {  this.userName = userName;  }  public String getPassword() {  return password;  }  public void setPassword(String password) {  this.password = password;  }
}

以下是实现了Parcelable接口的User类:

public class ParcelableUser implements Parcelable {  private String userName;  private String password;  public ParcelableUser() {  }  public ParcelableUser(String userName, String password) {  this.userName = userName;  this.password = password;  }  public String getUserName() {  return userName;  }  public void setUserName(String userName) {  this.userName = userName;  }  public String getPassword() {  return password;  }  public void setPassword(String password) {  this.password = password;  }  public static final Parcelable.Creator<ParcelableUser> CREATOR = new Creator<ParcelableUser>() {  @Override  public ParcelableUser createFromParcel(Parcel source) {  ParcelableUser parcelableUser = new ParcelableUser();  parcelableUser.userName = source.readString();  parcelableUser.password = source.readString();  return parcelableUser;  }  @Override  public ParcelableUser[] newArray(int size) {  return new ParcelableUser[size];  }  };  @Override  public int describeContents() {  // TODO Auto-generated method stub  return 0;  }  @Override  public void writeToParcel(Parcel dest, int flags) {  // TODO Auto-generated method stub  dest.writeString(userName);  dest.writeString(password);  }
}

使用两种方式传递的语法分别为:

bundle.putSerializable(key,object);

bundle.putParcelable(key,object);

使用两种方式接收的语法分别为:

object=(Object) getIntent().getSerializableExtra(key);

object=(Object) getIntent().getParcelableExtra(key);

// ==========分别使用Serializable和Parcelable发送Object===============
SerializableUser serializableUser = new SerializableUser("user1", "123456");
ParcelableUser parcelableUser = new ParcelableUser("user2","654321");
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putSerializable("serializableUser", serializableUser);
bundle.putParcelable("parcelableUser", parcelableUser);
intent.setClass(ListDemoActivity.this,ObjectActivity.class);
intent.putExtras(bundle);
startActivity(intent);
// ====================接收Object======================
SerializableUser serializableUser = (SerializableUser) getIntent().getSerializableExtra("serializableUser");
ParcelableUser parcelableUser = (ParcelableUser) getIntent().getParcelableExtra("parcelableUser");

可能有人注意到,实现Serializable接口就是把对象序列化,然后再传输,和Java的常用编程没什么明显区别,而且User不需要明显改变,比较简单。我也推荐用这种方式。

然而,后一种实现Parcelable接口的类比较复杂,Parcelable是个什么东西呢?

Android提供了一种新的类型:Parcel,被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。 除了基本类型以外,只有实现了Parcelable接口的类才能被放入Parcel中。

实现Parcelable接口需要实现三个方法:


1)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中。

声明:writeToParcel (Parcel dest, int flags)。

2)describeContents方法。直接返回0就可以。


3)静态的Parcelable.Creator<T>接口,本接口有两个方法:


createFromParcel(Parcel in) 实现从in中创建出类的实例的功能。

newArray(int size) 创建一个类型为T,长度为size的数组, returnnew T[size];即可。本方法是供外部类反序列化本类数组使用。

通过log测试输出可知程序的运行情况,在 bundle.putParcelable(“parcelableUser”, parcelableUser);时,调用了ParcelableUser类中的publicvoid writeToParcel(Parcel dest, int flags)方法,并向dest写数据,在 ParcelableUserparcelableUser= (ParcelableUser)getIntent().getParcelableExtra(“parcelableUser”);的时候,调用了 ParcelableUser类中的public ParcelableUsercreateFromParcel(Parcel source) 方法,创建了一个ParcelableUser对象,并给这个对象的属性赋值,这里的Parcel source和Parcel dest是相同的,然后返回这个ParcelableUser对象。最后就可以打印出parcelableUser的属性信息了。

3. 传递List<Object>类型

如果我们要传递的是Object组成的List列表,即List<Object>,该怎么办呢?首先需要将Object对象实现Serializable接口,然后把list强制类型转换成Serializable类型,最后通过:

Intent.putExtra(key, (Serializable)objectList);

这样的语法来传递,接收方在接收的时候也需要强制类型转换成List<Object>,接收 List<Object>使用的语法是:

objectList= (List<Object>) getIntent().getSerializableExtra(key);

以下是一个应用实例,这里使用的SerializableUser类在上一步有给出,这里就不再重复给出。

// ==============发送List<Object>===========
SerializableUser user1 = new SerializableUser("user1", "123456");
SerializableUser user2 = new SerializableUser("user2", "654321");
List<SerializableUser> objectList = new ArrayList<SerializableUser>();
objectList.add(user1);
objectList.add(user2);
Intent intent = new Intent();
intent.setClass(ListDemoActivity.this, ObjectListActivity.class);
intent.putExtra("ListObject", (Serializable) objectList);
startActivity(intent);
// ====================接收List<Object>======================
List<SerializableUser> objectList = (List<SerializableUser>) getIntent().getSerializableExtra("ListObject");

4. 传递全局变量等等参数

如果一些特殊的应用级别的参数,不方便使用intent来传递参数,我们很容易想到是不是有全局变量或静态变量可以使用?Java中的静态变量在这里是适合的,但其值在Activity调用了System.exit(0)或finish()后就丢失了。

而在android中有个更优雅的方式是使用ApplicationContext。这种全局变量方法相对静态类更有保障,直到应用的所有Activity全部被destory掉之后才会被释放掉。

Android的SDK中有说道,Application是用来保存全局变量的,并且 是在package创建的时候就存在了。所以当我们需要创建全局变量的时候,不需要再像J2SE那样需要创建public权限的static变量,而直接 在application中去实现。只需要调用Context的 getApplicationContext或者Activity的getApplication方法来获得一个Application对象,就可以设置 或读取全局变量的值。

启动Application时,系统会创建一个PID,即进程ID,所有的 Activity就会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局 变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。

用法:

(1)创建一个属于你自己的android.app.Application的子类,为想要共享的private全局变量增加setter和getter方法。

public class MyApp extends Application{  private String globalVariable;  public String getGlobalVariable() {  return globalVariable;  }  public void setGlobalVariable(String globalVariable) {  this.globalVariable = globalVariable;  }
}

(2) 在manifest中申明一下这个类,这时Android就为此建立一个全局可用的实例。

其实就是在原来仅有的一个application标签上为application制定一个名字为这个全局实例。

<application android:name=".MyApp" android:icon="@drawable/icon" android:label="@string/app_name">

(3)可以在其他任何地方使用Context.getApplicationContext()方法获取这个实例,进而获取其中的状态(变量)。

// ============使用全局变量传递参数==============
MyApp myApp = ((MyApp) getApplicationContext());//获得我们的应用程序MyApp
myApp.setGlobalVariable("全局变量");
Intent intent = new Intent();
intent.setClass(ListDemoActivity.this, GlobalActivity.class);
startActivity(intent);
// ============接收全局变量的参数==============
MyApp myApp = ((MyApp) getApplicationContext());
String globalVariable = myApp.getGlobalVariable();

转载于:https://my.oschina.net/u/1858156/blog/311754

Android的intent之间复杂参数的传递相关推荐

  1. Android基础教程(六)之------- 参数的传递(Bundle)

    Activity间的简单数据传递 Bundle 记录如下: 1.建2个Activity 跳转 2: 第一个文件 Intent intent = new Intent();             in ...

  2. Android10apk怎么传数据,Android不同apk之间传递参数与数据

    转载出处:http://dongyang555-126-com.iteye.com/blog/1308586 android编程的时候,有时候需要在不同的apk之间传递参数或数据,下面是一个简单的例子 ...

  3. android intent参数是上次的结果,【Android】7.0 Intent向下一个活动传递数据、返回数据给上一个活动...

    1.0 可以利用Intent吧数据传递给上一个活动,新建一个叫"hellotest01"的项目. 新建活动FirstActivity,勾选"Generate Layout ...

  4. 【unity】与Android Activity交互并调用JAVA代码传递参数

    http://www.xuanyusong.com/archives/667 Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以 ...

  5. android final参数,Android应用开发之Android Jetpack-Navigation 使用中参数的传递方法

    本文将带你了解Android应用开发之Android Jetpack-Navigation 使用中参数的传递方法,希望本文对大家学Android有所帮助. 由于使用了Navigation,导致Frag ...

  6. 大叔也说Xamarin~Android篇~Activity之间传递数组

    大叔也说Xamarin~Android篇~Activity之间传递数组 原文:大叔也说Xamarin~Android篇~Activity之间传递数组 我们在开发应用程序时,不可能只使用一个Layout ...

  7. 使用Intent来启动Activity并传递参数

    1.背景: 要创建并显示一个Activity,可以调用startActivity,并传递给它一个Intent,如下面的代码所示: startActivity(Intent myIntent); 可以构 ...

  8. android 打印流程图,Android实现Activities之间进行数据传递的方法

    本文实例讲述了Android实现Activities之间进行数据传递的方法.分享给大家供大家参考.具体分析如下: 首先,先说明一下Activity的启动及关闭: 1. startActivity(In ...

  9. ReactNative入门之android与rn初始化参数的传递

    1.基本理念 RN APP本质上也是原生APP,只是在原生APP中加入了React Native视图的支持. 因此获取RN APP的启动参数的方法原生APP是一样的,获取启动参数后再通过合适的方法传递 ...

最新文章

  1. 基于 OpenCV 的人脸追踪
  2. SylixOS移植时mk_time函数问题
  3. 使用帮助   history 用法   echo输出闪烁作业
  4. (转)我的座驾见谁灭谁!
  5. Mysql根据日期查询
  6. 抛弃PHP,WordPress.com以JavaScript重写
  7. pb 应用 迁移 linux_功能化生物炭应用研究取得系列进展
  8. es6 --- set实现并集(Union)、交集(Intersect)和差集(Difference)
  9. 一个桌面系统的微信公众号开发
  10. select、poll、epoll的区别
  11. python基础笔记(六)_数据清洗及建模
  12. 斐波那契数列(II)
  13. 职场饭局上被别人夸奖,该如何回复才能不尬场?|智测优聘总结
  14. 开源mock server系统
  15. AD18无法仿真问题的解决
  16. Windows系统上搭建私有云OwnCloud【保姆级别的教程】
  17. 机器学习中为什么需要梯度下降_机器学习101:一文带你读懂梯度下降
  18. 慕学在线--2、开发准备及布署上线
  19. 宝塔面版配置本机访问测试站点
  20. 微信小程序报错{errMsg:hideLoading:fail:toast can't be found}

热门文章

  1. MFC 缩放和显示IplImage
  2. cachehelper java,初识EHCache缓存框架(2.x版本)
  3. (原創) 如何对array或struct做初始化? (memset()) (C/C++) (C)
  4. MySql语句查询优化
  5. 为什么我们对90后的迎合难以成功?
  6. VHD工具-VHDTOOL
  7. VS11在Win8上的Metro应用
  8. 简述MVC思想与PHP如何实现MVC
  9. 单例模式(singleton)解析例子
  10. 黄斑裂孔Macular Hole