Android:通过Intent传递对象、Parcelable

简介:

1.对要传递的对象类型实现Parcelable:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public  class  User  implements  Parcelable //对象必须实现Parcelable接口才可以putExtra(或者序列化)
{
     String name;
     String psw;
     public  User(String name, String psw)
     {
         super ();
         this .name = name;
         this .psw = psw;
     }
     @Override
     public  String toString()
     {
         return  "User [name="  + name +  ", psw="  + psw +  "]" ;
     }
     @Override
     public  int  describeContents()
     {
         return  0 ;
     }
     @Override
     public  void  writeToParcel(Parcel dest,  int  flags) //将属性写入Parcel对象
     {
         dest.writeString(name);
         dest.writeString(psw);
     }
                                  
     public  static  final  Parcelable.Creator<User> CREATOR =  new  Parcelable.Creator<User>()
     {
         public  User createFromParcel(Parcel in)
         {
             return  new  User(in); //创建一个有参构造函数
         }
                                      
         public  User[] newArray( int  size)
         {
             return  new  User[size];
         }
     };
                                  
     public  User(Parcel in) //根据写入的顺序依次读取
     {
         name = in.readString();
         psw = in.readString();
     }
}


2.第一个activity传递user对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public  class  MainActivity  extends  Activity
{
     private  EditText editText1;
     private  EditText editText2;
     @Override
     protected  void  onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
                     
         editText1 = (EditText) findViewById(R.id.editText1);
         editText2 = (EditText) findViewById(R.id.editText2);
                     
         findViewById(R.id.button1).setOnClickListener( new  OnClickListener()
         {
             @Override
             public  void  onClick(View v)
             {
                 String namestr = editText1.getText().toString();
                 String pswstr = editText2.getText().toString();
                 User user =  new  User(namestr, pswstr);
                 Intent intent =  new  Intent(MainActivity. this , NextActivity. class );
                 intent.putExtra( "user" , user); //传入对象,对象类必须实现Parcelable或者序列化
                 startActivity(intent);
             }
         });
     }
                 
     @Override
     public  boolean  onCreateOptionsMenu(Menu menu)
     {
         getMenuInflater().inflate(R.menu.activity_main, menu);
         return  true ;
     }
}


3.第二个activity接收user对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public  class  NextActivity  extends  Activity
{
     @Override
     protected  void  onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_next);
           
         TextView textView = (TextView) findViewById(R.id.textView1);
           
         Intent intent = getIntent();
         User user = intent.getParcelableExtra( "user" ); //得到一个对象
         textView.setText(user.toString());
     }
       
     @Override
     public  boolean  onCreateOptionsMenu(Menu menu)
     {
         getMenuInflater().inflate(R.menu.activity_next, menu);
         return  true ;
     }
}


其他笔记:

1.带有数组类型属性的类

1
2
3
4
5
6
7
8
9
10
     @Override
     public  void  writeToParcel(Parcel dest,  int  flags)
     {
         dest.writeStringList(CompanyIntroList);
     }
     public  EstateInfoJson(Parcel in)
     {
         CompanyIntroList =  new  ArrayList<String>();
         in.readStringList(CompanyIntroList);
     }


2.带有其他类的属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
     public  EstateParamJson EstateParam;
     
     @Override
     public  void  writeToParcel(Parcel dest,  int  flags)
     {
         dest.writeValue(EstateParam);
     }
     
     @Override
     public  EstateInfoJson(Parcel in)
     {
         
         EstateParam = (EstateParamJson) in.readValue(EstateParamJson. class .getClassLoader());
     }



3.带有其他类的数组类型的属性

1
2
3
4
5
6
7
8
9
10
11
     public  ArrayList<PicJson> shiJing; //实景图
     @Override
     public  void  writeToParcel(Parcel dest,  int  flags)
     {
         dest.writeTypedList(shiJing);
     }
     public  GalleryJson(Parcel in)
     {
         shiJing =  new  ArrayList<PicJson>();
         in.readTypedList(shiJing, PicJson.CREATOR);
     }


4.带有子类父类的情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public  abstract  class  implements  Parcelable {  
     private  int  a;  
 
     protected  A( int  a) {  
         this .a = a;  
     }  
 
     public  void  writeToParcel(Parcel out,  int  flags) {  
         out.writeInt(a);  
     }  
 
     protected  A(Parcel in) {  
         a = in.readInt();  
     }  
}  
 
public  class  extends  A {  
     private  int  b;  
 
     public  B( int  a,  int  b) {  
         super (a);  
         this .b = b;  
     }  
 
     public  static  final  Parcelable.Creator<B> CREATOR =  new  Parcelable.Creator<B>() {  
         public  B createFromParcel(Parcel in) {  
             return  new  B(in);  
         }  
 
         public  B[] newArray( int  size) {  
             return  new  B[size];  
         }  
     };  
 
     public  int  describeContents() {  
         return  0 ;  
     }  
 
     public  void  writeToParcel(Parcel out,  int  flags) {  
         super .writeToParcel(out, flags);  
         out.writeInt(b);  
     }  
 
     private  B(Parcel in) {  
         super (in);  
         b = in.readInt();  
     }  
}




本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1217554,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
Android开发 开发者
Android基础知识:什么是Intent?有哪些类型的Intent?
Android基础知识:什么是Intent?有哪些类型的Intent?
414 0
|
1月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
62 0
|
3月前
|
Java Android开发 UED
安卓scheme_url调端:如果手机上多个app都注册了 http或者https 的 intent。 调端的时候,调起哪个app呢?
当多个Android应用注册了相同的URL Scheme(如http或https)时,系统会在尝试打开这类链接时展示一个选择对话框,让用户挑选偏好应用。若用户选择“始终”使用某个应用,则后续相同链接将直接由该应用处理,无需再次选择。本文以App A与App B为例,展示了如何在`AndroidManifest.xml`中配置对http与https的支持,并提供了从其他应用发起调用的示例代码。此外,还讨论了如何在系统设置中管理这些默认应用选择,以及建议开发者为避免冲突应注册更独特的Scheme。
|
5月前
|
存储 Java Android开发
Android上在两个Activity之间传递Bitmap对象
Android上在两个Activity之间传递Bitmap对象
39 2
|
5月前
|
Java Android开发
程序与技术分享:Android使用Dagger注入的方式初始化对象的简单使用
程序与技术分享:Android使用Dagger注入的方式初始化对象的简单使用
142 0
|
6月前
|
定位技术 Android开发
Intent在Android中的几种用法
Intent在Android中的几种用法
73 1
|
6月前
|
XML Android开发 数据格式
Android五大布局对象---FrameLayout,LinearLayout ,Absolute
Android五大布局对象---FrameLayout,LinearLayout ,Absolute
37 1
|
6月前
|
Java Android开发
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
111 1
|
6月前
|
Android开发 对象存储
OSS对象储存android开发进行下载到本地文件时异步操作失效
android vivo80使用官方示例代码进行文件下载,但是使用oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>()时onSuccess和onFailure不执行
|
6月前
|
JSON Android开发 数据格式
android 使用GSON 序列化对象出现字段被优化问题解决方案
android 使用GSON 序列化对象出现字段被优化问题解决方案
123 0