Android中的Parcel机制 实现Bundle传递对象

Android Bundle使用指南与性能优化 Bundle是Android开发中用于组件间数据传递的核心类,采用键值对存储结构,支持基本数据类型及实现了Parcelable/Serializable接口的对象。其底层基于Parcel序列化机制,在跨进程通信时具有较高效率。Bundle广泛应用于Activity跳转、Fragment传参等场景,但需注意其1MB的跨进程传输限制。开发者应掌握Bundle的基本使用方法,包括数据存取、Intent传递等,同时了解通过实现Parcelable接口传递自定义对象等高级技巧。在性能优化方面,建议精简数据、优先使用基 阅读详情

转载自:http://chjmars.iteye.com/blog/1266256

Android中的Parcel机制

    实现了Bundle传递对象
    使用Bundle传递对象,首先要将其序列化,但是,在Android中要使用这种传递对象的方式需要用到Android Parcel机制,即,Android实现的轻量级的高效的对象序列化和反序列化机制。

    JAVA中的Serialize机制,译成串行化、序列化……,其作用是能将数据对象存入字节流当中,在需要时重新生成对象。主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。
    
    Android中的新的序列化机制
        在Android系统中,定位为针对内存受限的设备,因此对性能要求更高,另外系统中采用了新的IPC(进程间通信)机制,必然要求使用性能更出色的对象传输方式。在这样的环境下,
        Parcel被设计出来,其定位就是轻量级的高效的对象序列化和反序列化机制。
        Android中序列化有以下几个特征:
        1. 整个读写全是在内存中进行,所以效率比JAVA序列化中使用外部存储器会高很多;
        2. 读写时是4字节对齐的
        3. 如果预分配的空间不够时,会一次多分配50%;
        4. 对于普通数据,使用的是mData内存地址,对于IBinder类型的数据以及FileDescriptor使用的是mObjects内存地址。后者是通过flatten_binder()和unflatten_binder()实现的,目的是反序列化时读出的对象就是原对象而不用重新new一个新对象。

Mainactivity代码   收藏代码
  1. package com.parcel.main;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.graphics.Color;  
  6. import android.graphics.drawable.Drawable;  
  7. import android.os.Bundle;  
  8. import android.view.MotionEvent;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12. import android.widget.TextView;  
  13.   
  14. public class MyTestParcelActivity extends Activity {  
  15.   
  16.     public final static int Sub_Main = 1;  
  17.     public final static int Sub_2_Main = 2;  
  18.   
  19.     private Button setSubMain;  
  20.     private Button setSub2Main;  
  21.     private TextView mTextView;  
  22.   
  23.     private Drawable defDrawable;  
  24.     private MyParcel mMyParcel = new MyParcel();  
  25.     private BinderMyParcel mBinderMyParcel = new BinderMyParcel();  
  26.   
  27.     /** Called when the activity is first created. */  
  28.     @Override  
  29.     public void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.main);  
  32.   
  33.         initComponent();  
  34.     }  
  35.   
  36.     private void initComponent() {  
  37.         setSubMain = (Button) findViewById(R.id.btn01);  
  38.         if (setSubMain != null) {  
  39.             setSubMain.setOnClickListener(setSubMainXML);  
  40.         }  
  41.   
  42.         setSub2Main = (Button) findViewById(R.id.btn04);  
  43.         if (setSub2Main != null) {  
  44.             setSub2Main.setOnClickListener(setSub2MainXML);  
  45.         }  
  46.   
  47.         mTextView = (TextView) findViewById(R.id.main_tv);  
  48.         defDrawable = mTextView.getBackground();  
  49.     }  
  50.   
  51.     private View.OnClickListener setSubMainXML = new OnClickListener() {  
  52.   
  53.         @Override  
  54.         public void onClick(View v) {  
  55.             Intent mIntent = new Intent();  
  56.             if (mMyParcel != null) {  
  57.                 mMyParcel.setColor(Color.RED);  
  58.                 mIntent.putExtra("MyColor", mMyParcel);  
  59.             }  
  60.             mIntent.setClass(MyTestParcelActivity.this,  
  61.                     SubMyTestParcelActivity.class);  
  62.   
  63.             mTextView.setBackgroundDrawable(defDrawable);  
  64.   
  65.             startActivityForResult(mIntent, Sub_Main);  
  66.         }  
  67.     };  
  68.     private View.OnClickListener setSub2MainXML = new OnClickListener() {  
  69.   
  70.         @Override  
  71.         public void onClick(View v) {  
  72.             Intent intent = new Intent();  
  73.             if (mBinderMyParcel != null) {  
  74.                 mBinderMyParcel.setColor(Color.MAGENTA);  
  75.                 intent.putExtra("BinderMyColor", mBinderMyParcel);  
  76.             }  
  77.             intent.setClass(MyTestParcelActivity.this,  
  78.                     Sub2MyTestParcelActivity.class);  
  79.   
  80.             mTextView.setBackgroundDrawable(defDrawable);  
  81.   
  82.             startActivityForResult(intent, Sub_2_Main);  
  83.         }  
  84.     };  
  85.   
  86.     @Override  
  87.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  88.         super.onActivityResult(requestCode, resultCode, data);  
  89.         if (resultCode == RESULT_OK) {  
  90.             if (requestCode == Sub_Main) {  
  91.                 if (data.hasExtra("MyColor")) {  
  92.                     /**  
  93.                      * color=data.getParcelableExtra("MyColor"),  
  94.                      * 这说明反序列化后是一个新的MyColor对象  
  95.                      *   
  96.                      * 如果数据本身是IBinder类型,那么反序列化的结果就是原对象,而不是新建的对象  
  97.                      */  
  98.                     mMyParcel = data.getParcelableExtra("MyColor");  
  99.                     ((TextView) findViewById(R.id.main_tv))  
  100.                             .setTextColor(mMyParcel.getColor());  
  101.                 }  
  102.             } else if (requestCode == Sub_2_Main) {  
  103.                 if (data.hasExtra("BinderMyColor")) {  
  104.                     ((TextView) findViewById(R.id.main_tv))  
  105.                             .setBackgroundColor(mBinderMyParcel.getColor());  
  106.                 }  
  107.             }  
  108.         }  
  109.     }  
  110.   
  111.     @Override  
  112.     public boolean onTouchEvent(MotionEvent event) {  
  113.         return super.onTouchEvent(event);  
  114.     }  
  115.   
  116. }  
 
使用非binder类型代码   收藏代码
  1. package com.parcel.main;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.graphics.Color;  
  6. import android.graphics.drawable.Drawable;  
  7. import android.os.Bundle;  
  8. import android.view.MotionEvent;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12. import android.widget.TextView;  
  13.   
  14. public class SubMyTestParcelActivity extends Activity implements  
  15.         OnClickListener {  
  16.   
  17.     private Button setSub2XML;  
  18.     private TextView mTextView;  
  19.     private MyParcel myColor;  
  20.       
  21.     private Drawable defDrawable;  
  22.       
  23.   
  24.     /** Called when the activity is first created. */  
  25.     @Override  
  26.     protected void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.   
  29.         setContentView(R.layout.submain);  
  30.   
  31.         setSub2XML = (Button) findViewById(R.id.btn02);  
  32.         setSub2XML.setOnClickListener(this);  
  33.   
  34.         mTextView = (TextView)findViewById(R.id.sub_tv);  
  35.         defDrawable = mTextView.getBackground();  
  36.           
  37.         Intent intent = getIntent();  
  38.         if (intent != null) {  
  39.             if (intent.hasExtra("MyColor")) {  
  40.                 myColor = intent.getParcelableExtra("MyColor");  
  41.                 mTextView.setBackgroundColor(myColor.getColor());  
  42.             }  
  43.         }  
  44.     }  
  45.   
  46.     @Override  
  47.     protected void onStart() {  
  48.         super.onStart();  
  49.     }  
  50.   
  51.     @Override  
  52.     protected void onRestart() {  
  53.         super.onRestart();  
  54.     }  
  55.   
  56.     @Override  
  57.     protected void onResume() {  
  58.         super.onResume();  
  59.     }  
  60.   
  61.     @Override  
  62.     protected void onPause() {  
  63.         super.onPause();  
  64.     }  
  65.   
  66.     @Override  
  67.     protected void onStop() {  
  68.         super.onStop();  
  69.     }  
  70.   
  71.     @Override  
  72.     protected void onDestroy() {  
  73.         super.onDestroy();  
  74.     }  
  75.   
  76.     @Override  
  77.     public boolean onTouchEvent(MotionEvent event) {  
  78.         return super.onTouchEvent(event);  
  79.     }  
  80.   
  81.     @Override  
  82.     public void onClick(View v) {  
  83.         switch (v.getId()) {  
  84.         case R.id.btn02:  
  85.             Intent mIntent = new Intent(getApplicationContext(),  
  86.                     Sub2MyTestParcelActivity.class);  
  87.             if (myColor != null) {  
  88.                 myColor.setColor(Color.GREEN);  
  89.                 mIntent.putExtra("MyColor", myColor);  
  90.             }  
  91.   
  92.             mTextView.setBackgroundDrawable(defDrawable);  
  93.             setResult(RESULT_OK, mIntent);  
  94.             finish();  
  95.             break;  
  96.   
  97.         default:  
  98.             break;  
  99.         }  
  100.     }  
  101.   
  102. }  
 
使用binder类型代码   收藏代码
  1. package com.parcel.main;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.graphics.Color;  
  6. import android.graphics.drawable.Drawable;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.Button;  
  11. import android.widget.TextView;  
  12.   
  13. public class Sub2MyTestParcelActivity extends Activity implements  
  14.         OnClickListener {  
  15.   
  16.     private Button setMainXML;  
  17.     private TextView mTextView;  
  18.     private BinderMyParcel myColor;  
  19.   
  20.     private Drawable defDrawable;  
  21.   
  22.     /** Called when the activity is first created. */  
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.   
  27.         setContentView(R.layout.sub2main);  
  28.   
  29.         setMainXML = (Button) findViewById(R.id.btn03);  
  30.         setMainXML.setOnClickListener(this);  
  31.   
  32.         mTextView = (TextView) findViewById(R.id.sub_tv);  
  33.         defDrawable = mTextView.getBackground();  
  34.   
  35.         Intent intent = getIntent();  
  36.         if (intent != null) {  
  37.             if (intent.hasExtra("BinderMyColor")) {  
  38.                 myColor = intent.getParcelableExtra("BinderMyColor");  
  39.                 mTextView.setBackgroundColor(myColor.getColor());  
  40.             }  
  41.         }  
  42.     }  
  43.   
  44.     @Override  
  45.     public void onClick(View v) {  
  46.         switch (v.getId()) {  
  47.         case R.id.btn03:  
  48.             Intent mIntent = new Intent(getApplicationContext(),  
  49.                     MyTestParcelActivity.class);  
  50.             if (myColor != null) {  
  51.                 myColor.setColor(Color.WHITE);  
  52.                 mIntent.putExtra("BinderMyColor", myColor);  
  53.             }  
  54.   
  55.             mTextView.setBackgroundDrawable(defDrawable);  
  56.             setResult(RESULT_OK, mIntent);  
  57.             finish();  
  58.             break;  
  59.   
  60.         default:  
  61.             break;  
  62.         }  
  63.     }  
  64.   
  65. }  

 非Binder类型的Parcel,实现Parcelable接口即可:

Java代码   收藏代码
  1. package com.parcel.main;  
  2.   
  3. import android.graphics.Color;  
  4. import android.os.Parcel;  
  5. import android.os.Parcelable;  
  6.   
  7. public class MyParcel implements Parcelable {  
  8.     private int color = Color.BLACK;  
  9.   
  10.     public int getColor() {  
  11.         return color;  
  12.     }  
  13.   
  14.     public void setColor(int color) {  
  15.         this.color = color;  
  16.     }  
  17.   
  18.     public MyParcel() {  
  19.         color = Color.BLACK;  
  20.     }  
  21.   
  22.     public MyParcel(Parcel in) {  
  23.         color = in.readInt();  
  24.     }  
  25.   
  26.     @Override  
  27.     public int describeContents() {  
  28.         return 0;  
  29.     }  
  30.   
  31.     @Override  
  32.     public void writeToParcel(Parcel dest, int flags) {  
  33.         dest.writeInt(color);  
  34.     }  
  35.   
  36.     public static final Parcelable.Creator<MyParcel> CREATOR = new Parcelable.Creator<MyParcel>() {  
  37.   
  38.         public MyParcel createFromParcel(Parcel in) {  
  39.             return new MyParcel(in);  
  40.         }  
  41.   
  42.         public MyParcel[] newArray(int size) {  
  43.             return new MyParcel[size];  
  44.         }  
  45.     };  
  46.   
  47. }  

 对于Binder类型,首先要实现一个Binder接口(其,最主要的区别在于反序列化仍然是原来的对象,而非Binder类型的反序列化并不是原来的对象,所以在MainActivity中的onActivityResult方法中会出现mMyParcel = data.getParcelableExtra("MyColor")的写法):

Java代码   收藏代码
  1. package com.parcel.main;  
  2.   
  3. import android.os.Binder;  
  4.   
  5. public class BinderData extends Binder {  
  6.   
  7.     public int color;  
  8.   
  9. }  

 其次再实现Parcelable接口:

Java代码   收藏代码
  1. package com.parcel.main;  
  2.   
  3. import android.graphics.Color;  
  4. import android.os.Parcel;  
  5. import android.os.Parcelable;  
  6.   
  7. public class BinderMyParcel implements Parcelable {  
  8.   
  9.     private BinderData data = new BinderData();  
  10.   
  11.     public BinderMyParcel() {  
  12.         data.color = Color.BLUE;  
  13.     }  
  14.   
  15.     public BinderMyParcel(Parcel in) {  
  16.         data = (BinderData) in.readValue(BinderData.class.getClassLoader());  
  17.     }  
  18.   
  19.     public void setColor(int color) {  
  20.         data.color = color;  
  21.     }  
  22.   
  23.     public int getColor() {  
  24.         return data.color;  
  25.     }  
  26.   
  27.     @Override  
  28.     public int describeContents() {  
  29.         return 0;  
  30.     }  
  31.   
  32.     @Override  
  33.     public void writeToParcel(Parcel dest, int flags) {  
  34.         dest.writeValue(data);  
  35.     }  
  36.   
  37.     public static final Parcelable.Creator<BinderMyParcel> CREATOR = new Creator<BinderMyParcel>() {  
  38.   
  39.         @Override  
  40.         public BinderMyParcel[] newArray(int size) {  
  41.             return new BinderMyParcel[size];  
  42.         }  
  43.   
  44.         @Override  
  45.         public BinderMyParcel createFromParcel(Parcel source) {  
  46.             return new BinderMyParcel(source);  
  47.         }  
  48.     };  
  49. }  

三个XML:

1代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.     <TextView android:id="@+id/main_tv" android:layout_width="fill_parent"  
  6.         android:layout_height="wrap_content" android:text="@string/main_activity" />  
  7.     <LinearLayout android:orientation="horizontal"  
  8.         android:layout_width="wrap_content" android:layout_height="wrap_content">  
  9.         <Button android:text="SetSubMainXML" android:id="@+id/btn01"  
  10.             android:layout_width="wrap_content" android:layout_height="wrap_content" />  
  11.         <Button android:id="@+id/btn04" android:layout_height="wrap_content"  
  12.             android:layout_width="wrap_content" android:text="SetSub2MainXML" />  
  13.     </LinearLayout>  
  14.   
  15. </LinearLayout>  
 
2代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.     <TextView android:id="@+id/sub_tv" android:layout_width="fill_parent"  
  6.         android:layout_height="wrap_content" android:text="@string/sub_activity" />  
  7.     <Button android:text="setMainXML" android:id="@+id/btn02"  
  8.         android:layout_width="wrap_content" android:layout_height="wrap_content" />  
  9. </LinearLayout>  
 
3代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.     <TextView android:id="@+id/sub_tv" android:layout_width="fill_parent"  
  6.         android:layout_height="wrap_content" android:text="@string/sub2_activity" />  
  7.     <Button android:text="setMainXML" android:id="@+id/btn03"  
  8.         android:layout_width="wrap_content" android:layout_height="wrap_content" />  
  9. </LinearLayout>  
 
android入门之Bundle和Parcelables传递数据 文档:https://developer.android.com/guide/components/activities/parcelables-and-bundles https://developer.android.com/reference/android/os/Parcelable 1.简介 Parcelable和Bundle对象旨在用于活动之间以及跨配置更改存储状态。 Parcel不是通用的序列化机制,不应该将任何Parcel数据存储在磁盘上或通过网络发送。 2.活动间发送 阅读详情

相关推荐

图灵奖:计算机科学领域的诺贝尔奖

最后,图灵奖也是计算机科学领域发展的重要推动力之一,它促进了该领域的进步和繁荣。图灵奖作为计算机科学领域的诺贝尔奖,不仅是对获奖者卓越贡献的肯定,更是对整个计算机科学领域的推动和激励。在未来的发展中,我们期待看到更多的科学家和团队在图灵奖的激励下不断取得新的突破和创新成果为计算机科学的发展注入新的活力和动力。Vinton G. Cerf和Robert E. Kahn:2004年图灵奖得主,由于他们在互联网方面开创性的工作而获奖,这包括设计和实现了互联网的基础通讯协议TCP/IP,以及在网络方面的卓越领导。

wangnvshibeib的博客 2626

Bundle,Intent传递复杂的--Parcelable

通过Bundle,Intent传递复杂的数据,ArrayList等,需要Bean实现Parcelable接口 -----Bean.java public class Bean implements Parcelable { public String name; public String age; //读取 public Bean(Parcel in){ nam

沧海沐茸的博客 374

波克 上海 Unity开发笔试题 2024

主要分为四部分,如果没有准备好,不要点击笔试链接,进入就会自动开始。

z2014z的博客 3393

android信息传递方式之bundle总结

Android bundle总结 1. Bundle简介 Bundle主要用于传递数据;它保存的数据,是以key-value(键值对)的形式存在的。   我们经常使用Bundle在Activity之间传递数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。当Bundle传递的是对象或对象

u014012284的专栏 2784

两相变频交错PFC实战:从论文理论到PSIM仿真的完整避坑指南

本文详细解析了两相变频交错PFC技术从理论到PSIM仿真的完整实现过程,特别针对CRM模式下的BOOST PFC设计挑战提供实用解决方案。涵盖周期值比较法与RS触发器法的对比实施、PSIM仿真中的过零处理与收敛性优化等核心问题,并给出硬件实现的进阶建议,助力工程师高效完成高功率密度PFC设计。

weixin_30632089的博客 422

利用抖音Cookie充值接口提取支付链接,调起原生微信h5支付宝h5支付

最近开始搞一些个人支付通道的开发,方便个人不用和第三方平台签约就能收款,省去很多流程手续的成本。 然后翻了一下网上并没有太多现成的技术教程,只能自己研究着搞了。 这次要分享的是利用抖音的充值接口,去分析提取出支付链接,分别包含微信原生支付的h5支付链接,和支付宝h5支付链接。 微信h5支付: 抖币充值,抖音充值,抖音直播充值官方入口 - 抖音 支付宝h5支付 抖币充值,抖音充值,抖音直播充值官方入口 - 抖音 整个开发流程思路是以下几步: 1.抓包分析抖音的充值的整个流程,提取关键的一些

Android-逆向的博客 6567

android 多个参数传递,android之bundle传递数据--两个activities之间

登陆页面布局:layout/activity_login.xmlxmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" >android:stretchC...

weixin_39610085的博客 283

YOLOv11改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 5494

android bundle 对象,Android Bundle传递对象

首先Android的Bundle是可以传递对象的。我们可以用Bundle b = new Bundle();b.putSerializable("key", 对象引用);但是这样传递对象有可能会出现问题的。因为putSerializable("key",对象引用);存入的对象必须实现Serializable接口。即class MyObject implements Serializable。如果对...

weixin_39642981的博客 2040

十.镜头知识之畸变问题

对于理想光学系统,在一对共轭的物像平面上,像的放大率是一个常数。但是对于实际的光学系统,当视场较大或很大时,像的放大率就要随视场而异,这样就会使像相对于物体失去相似性。这种使像变形的成像缺陷称为畸变。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2124

论文阅读:ICLR 2023 FINE-TUNING ALIGNED LANGUAGE MODELS COMPROMISES SAFETY, EVEN WHEN USERS DO NOT INTEND

对大型语言模型(LLMs)进行微调以适应特定用例通常涉及对预训练的LLMs进行进一步的定制。Meta公开发布Llama模型和OpenAI的API允许在自定义数据集上微调GPT-3.5 Turbo,也鼓励这种做法。但是,这种自定义微调与安全成本有何关联?我们注意到,尽管现有的安全对齐基础设施可以在推理时限制LLMs的有害行为,但它们并未涵盖将微调权限扩展到最终用户时的安全风险。我们的红队研究发现,即使是只有几个设计有敌意的训练示例进行微调,也可以破坏LLMs的安全对齐。

CSPhD-winston的博客 811

【Android系统编译】Parcel

**前提:**大家都知道bindler是android中的一种跨进程通信的机制,而通信其实就是一个数据传递的过程。对于int值来说,其过程就只是不断复制到目标地址即可,而对于对象来说,传递的过程则是该对象的内存地址被不停的复制,但是对于不同的进程,内存地址传递了也没有意义,因为虚拟内存的原因,每个进程都有自己独立的内存空间,传递的地址也是虚拟内存分配的进程内地址,跨进城通信靠传递地址是无效的。这个时候就需要parcel了。 parcel(打包)从广义上来理解,就是一种数据的载体,相当于一艘小船,先将希望传递

qq_35709489的博客 1750

第11节:GPU 线程层级:线程、线程块、网格

层级标识变量功能线程threadIdx执行单元,处理数据线程块blockIdx管理多个线程,提供共享内存网格管理多个 blockGPU 编程中,合理安排线程层级,是提升性能的关键。

yumeiguo的博客 210

Android中的Parcel机制和Serialize机制

实现了Bundle传递对象, 使用Bundle传递对象,首先要将其序列化,但是,在Android中要使用这种传递对象的方式需要用到Android Parcel机制,即,Android实现的轻量级的高效的对象序列化和反序列化机制。       JAVA中的Serialize机制,译成串行化、序列化……,其作用是能将数据对象存入字节流当中,在需要时重新生成对象。主要应用是利用外部存储设备保存对象状态

longlyboyhe的专栏 959

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android 自动读取ecxel_Android 进程间通信(IPC)

一、IPC 基础1.1 Android 多进程对于 Android 而言,要实现多进程,有且只有一个方法:在 Android 清单文件中为四大组件声明 android:process 属性。当然还有一些 Native 层的方法,比如通过 JNI 在 Native 层 fork 一个新的进程。<!-- remote service --> <service android:...

weixin_34416354的博客 138

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Andorid-15k+的面试题

前言 最近才开的博客,希望大家多多关注,andorid开发也做了3年有余了,也面试多家企业,借此机会分享一下,我们中遇到过的问题以及解决方案吧,希望能够对正在找工作的andoird程序员有一定的帮助。学完本人博客发表《ym--andorid从零开始教程》+面试题目全理解,年薪18w以上绝对没问题。 特别献上整理过的50道面试题目 1.listView的优化方式

哆来咪er的博客 5664

简要分析Android中的Intent,Bundle,Parcel中的数据传递

Intent是进程间通信的一种简要方式,其通讯数据可以存放在Bundle中,而在实际的进程间通讯过程中,数据则是打包成Parcel对象进行处理的.查看源代码后,简要分析一下其中的数据转换逻辑. 简单的逻辑就是:进程A----Data----Bundle----Intent----Parcel------进程B------Parcel----Intent----Bundle----Data(忽略了

Programmer Training 2884

Android 用Intent 传递对象之 Parcel

Android 为

爱自在的专栏 1140

Android中的Parcel是什么

Parcel,翻译过来是“打包”的意思。打包干什么呢?是为了序列化。     如果要在进程之间传递一个整数,很简单,直接传就是行了;如果要传一个字符串,就稍微复杂了点:需先分配一块可以容纳字符串的内存,然后将字符串复制到内存中,再传递(新手可能问:为啥不直接把字符串的引用传过去呢?学过C/C++的地球人都知道:进程有自己的内存地址空间,一个进程中的1000地址可能在另一个进程中是100000,j

cruise技术博客 1869

在Android中通过Intent使用Bundle传递对象

Android开发中有时需要在应用中或进程间传递对象,下面详细介绍Intent使用Bundle传递对象的方法。 被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable。 两种序列化方式的区别: 1.在使

梁剑的专栏 716
上一篇: 友盟自动更新产品介绍
下一篇: Andoird Studio 错误: 非法字符: '\ufeff' 解决方案。
千雅爸爸
博客等级 码龄18年 292粉丝 639原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值