Android跨应用间的数据传输

本文介绍Android应用间通过Intent和Bundle进行数据传输的方法,包括直接数据传输、序列化传输及 Parcelable 对象传输,并提供示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android跨应用间的数据传输

分类: Android   140人阅读  评论(1)  收藏  举报

在有些项目中,会有多个应用出现,这样应用间的数据传输就成了必然。那应用间的数据传输要怎么实现呢?我们知道,在跨Activity之间的数据传输可以通过Bundle和Intent结合来实现,那应用间的数据传输是否也可以使用这种方式呢?答案是可以的!

在使用Bundle来传输数据时,又有多种途径,比如直接数据传输、序列化数据传输、打包数据传输等。下面是从TransDataA应用传输到TransDataB应用的效果图。





在直接传输数据时,我们传输的是图片数据,序列化传输和打包传输时传输的是相应的结构信息,下面是实现的代码:

TransDataA项目的MainActivity.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.transdataa;  
  2.   
  3. import com.example.data.DirectData;  
  4. import com.example.data.SerialData;  
  5. import com.example.data.ParcelData;  
  6.   
  7. import com.kitsp.contentsp.IntentSp;  
  8.   
  9. import android.app.Activity;  
  10. import android.content.ComponentName;  
  11. import android.content.Intent;  
  12. import android.graphics.Bitmap;  
  13. import android.graphics.BitmapFactory;  
  14. import android.os.Bundle;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.widget.Button;  
  18.   
  19. public class MainActivity extends Activity {  
  20.   
  21.     private Button _directTrans_button = null;  
  22.     private Button _serialTrans_button = null;  
  23.     private Button _pracelTrans_button = null;  
  24.   
  25.     @Override  
  26.     protected void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.activity_main);  
  29.         Init();  
  30.     }  
  31.   
  32.     private void Init() {  
  33.         FetchUIControls();  
  34.         BindingEvents();  
  35.     }  
  36.   
  37.     private void FetchUIControls() {  
  38.         _directTrans_button = (Button) findViewById(R.id.activity_main_directTrans);  
  39.         _serialTrans_button = (Button) findViewById(R.id.activity_main_serialTrans);  
  40.         _pracelTrans_button = (Button) findViewById(R.id.activity_main_ParcelTrans);  
  41.     }  
  42.   
  43.     private void BindingEvents() {  
  44.         if(_directTrans_button!=null)  
  45.         {  
  46.             _directTrans_button.setOnClickListener(new OnClickListenerEx());  
  47.         }  
  48.           
  49.         if (_serialTrans_button != null) {  
  50.             _serialTrans_button.setOnClickListener(new OnClickListenerEx());  
  51.         }  
  52.   
  53.         if (_pracelTrans_button != null) {  
  54.             _pracelTrans_button.setOnClickListener(new OnClickListenerEx());  
  55.         }  
  56.     }  
  57.   
  58.     private class OnClickListenerEx implements OnClickListener {  
  59.   
  60.         @Override  
  61.         public void onClick(View v) {  
  62.             Bundle bundle = null;     
  63.             switch (v.getId()) {  
  64.             case R.id.activity_main_directTrans:  
  65.             {  
  66.                 bundle=DirectGenerateData();  
  67.                 break;  
  68.             }  
  69.             case R.id.activity_main_serialTrans: {  
  70.                 bundle = SerializeData();  
  71.                 break;  
  72.             }  
  73.             case R.id.activity_main_ParcelTrans: {  
  74.                 bundle = ParcelableData();  
  75.                 break;  
  76.             }  
  77.             default: {  
  78.                 break;  
  79.             }  
  80.             }  
  81.             TransData(bundle);  
  82.         }         
  83.       
  84.         private Bundle DirectGenerateData()  
  85.         {  
  86.             Bundle bundle = new Bundle();  
  87.             Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.test);  
  88.             bundle.putParcelable(DirectData.KEY, bitmap);  
  89.             return bundle;  
  90.         }  
  91.           
  92.         private Bundle SerializeData() {  
  93.             SerialData serialData = new SerialData();  
  94.             serialData.SetSerialNo("123456789");  
  95.             serialData.SetWeight(180.82);  
  96.             Bundle bundle = new Bundle();  
  97.             bundle.putSerializable(SerialData.KEY, serialData);  
  98.             return bundle;  
  99.         }  
  100.   
  101.         private Bundle ParcelableData() {  
  102.             ParcelData parcelData = new ParcelData();  
  103.             parcelData.SetAccount("Test");  
  104.             parcelData.SetPassword("ABCDEFG");  
  105.             parcelData.SetAge(25);  
  106.             Bundle bundle = new Bundle();  
  107.             bundle.putParcelable(ParcelData.KEY, parcelData);  
  108.             return bundle;  
  109.         }  
  110.   
  111.         private void TransData(Bundle bundle) {  
  112.             if (bundle == null) {  
  113.                 return;  
  114.             }  
  115.             Intent intent = new Intent();  
  116.             ComponentName cn = new ComponentName("com.example.transdatab",  
  117.                     "com.example.transdatab.MainActivity");  
  118.             if (cn != null) {  
  119.                 intent.setComponent(cn);  
  120.                 intent.putExtras(bundle);  
  121.                 startActivity(intent);  
  122.             }  
  123.   
  124.         }  
  125.     }  
  126. }  
注:

1、数据都是以Bundle的形式添加到Intent中的。一定要记得在Intent中putExtras(bundle)。这是将数据添加到Intent的必须步骤,有时可能会遗忘。

2、在跨应用时,使用Intent来启动另一个应用。这里采用ComponentName的形式来启动另一个应用。\

3、在使用Intent传输数据时有上限的限制,不然会导致应用卡死或黑屏。具体上限是多少,网上有很多说法,有说40kb的、有说100kb的,有说1M的,我实际测试的结果是200kb左右。我的结论是可能与具体的设备有关。

TransDataB项目的MainActivity.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.transdatab;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.graphics.Bitmap;  
  6. import android.graphics.drawable.BitmapDrawable;  
  7. import android.graphics.drawable.Drawable;  
  8. import android.os.Bundle;  
  9. import android.widget.TextView;  
  10.   
  11. import com.example.data.DirectData;  
  12. import com.example.data.SerialData;  
  13. import com.example.data.ParcelData;  
  14.   
  15. public class MainActivity extends Activity {  
  16.   
  17.     private SerialData _serialData = null;  
  18.     private ParcelData _parcelData = null;  
  19.     private Bitmap _bitmap=null;  
  20.     private TextView _info_textView = null;  
  21.   
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.         Init();  
  27.     }  
  28.   
  29.     private void Init() {  
  30.         FetchUIControls();  
  31.         InitParams();  
  32.         InitUI();  
  33.     }  
  34.   
  35.     private void InitParams() {  
  36.         try {  
  37.             Intent intent = getIntent();  
  38.             if (intent == null) {  
  39.                 _info_textView.setText("Intent is null");  
  40.                 return;  
  41.             }  
  42.   
  43.             if(intent.hasExtra(DirectData.KEY))  
  44.             {  
  45.                 _bitmap=intent.getParcelableExtra(DirectData.KEY);  
  46.             }  
  47.               
  48.             if (intent.hasExtra(SerialData.KEY)) {  
  49.                 _serialData = (SerialData) intent  
  50.                         .getSerializableExtra(SerialData.KEY);  
  51.                 _info_textView.setText("MachineData");  
  52.             }  
  53.   
  54.             if (intent.hasExtra(ParcelData.KEY)) {  
  55.                 _info_textView.setText("RegisterData");  
  56.                 _parcelData = (ParcelData) intent  
  57.                         .getParcelableExtra(ParcelData.KEY);  
  58.             }  
  59.   
  60.         } catch (Exception e) {  
  61.             _info_textView.setText("Exception");  
  62.         }  
  63.     }  
  64.   
  65.     private void FetchUIControls() {  
  66.         _info_textView = (TextView) findViewById(R.id.activity_main_info);  
  67.     }  
  68.   
  69.     private void InitUI() {  
  70.   
  71.         if (_info_textView == null) {  
  72.   
  73.             return;  
  74.         }  
  75.                   
  76.         String info = "";  
  77.   
  78.         if(_bitmap!=null)  
  79.         {  
  80.             BitmapDrawable bitmapDrawble= new BitmapDrawable(MainActivity.this.getResources(), _bitmap);   
  81.             bitmapDrawble.setBounds(00, _bitmap.getWidth(),_bitmap.getHeight());  
  82.             _info_textView.setCompoundDrawables(null, bitmapDrawble, nullnull);  
  83.         }  
  84.           
  85.         if (_serialData != null) {  
  86.             info = "SerialData\nSerialNo=" + _serialData.GetSerialNo() + "\nWeight="  
  87.                     + _serialData.GetWeight() + "\n";  
  88.         }  
  89.   
  90.         if (_parcelData != null) {  
  91.             info = "ParcelData\nAccount=" + _parcelData.GetAccount() + "\n" + "Password="  
  92.                     + _parcelData.GetPassword() + "\n" + "Age="  
  93.                     + _parcelData.GetAge() + "\n";  
  94.         }  
  95.         _info_textView.setText(info);  
  96.     }  
  97. }  
注:

1、在接收数据的一端,先获取Intent,再判断是否有相应的KEY,然后再解开数据。

2、在获取直接传输过来的数据时,采用intent.getParcelableExtra来获取数据。

在TransDataA和TransDataB中传输序列化和打包的数据时,一定要用同样的KEY和同样的类,不然数据会解不开。这里,他们共用的是TransData项目中的类,下面是代码。

TransData项目的DirectData.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.data;  
  2.   
  3. public class DirectData {  
  4.     public final static String KEY="{56896229-BFCD-4630-B1EF-4D8FA6CA90FE}";  
  5. }  
注:直接传输数据,只需要一个唯一的KEY就可能 了。KEY采用GUID以确保唯一性,也可以自己命名,只要能确保唯一性就可以。

TransData项目的SerialData.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.data;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class SerialData implements Serializable {  
  6.   
  7.     public static final String KEY="{1D7D9EF2-06F6-4A55-9DF6-293471209D15}";  
  8.       
  9.     /** 
  10.      *  
  11.      */  
  12.     private static final long serialVersionUID = 1464294135398038125L;  
  13.   
  14.     private String _serialNo="";  
  15.     private double _weight_kg=0;  
  16.       
  17.     public void SetSerialNo(String serialNo)  
  18.     {  
  19.         _serialNo=serialNo;  
  20.     }  
  21.       
  22.     public String GetSerialNo()  
  23.     {  
  24.         return _serialNo;  
  25.     }  
  26.       
  27.     public void SetWeight(double weight_kg)  
  28.     {  
  29.         _weight_kg=weight_kg;  
  30.     }  
  31.       
  32.     public double GetWeight()  
  33.     {  
  34.         return _weight_kg;  
  35.     }  
  36.       
  37. }  
注:

1、需实现Serializable。

2、每一个变量都必须要有对应的Set和Get方法。

TransData项目的ParcelData.java

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.data;  
  2.   
  3. import android.os.Parcel;  
  4. import android.os.Parcelable;  
  5.   
  6. public class ParcelData implements Parcelable {  
  7.   
  8.     public final static String KEY="{00D2DF54-B448-415F-AB7C-E0C6B6D3E608}";  
  9.       
  10.     private String _account="";  
  11.     private String _password="";  
  12.     private int _age=0;  
  13.       
  14.     public void SetAccount(String account)  
  15.     {  
  16.         _account=account;  
  17.     }  
  18.       
  19.     public String GetAccount()  
  20.     {  
  21.         return _account;  
  22.     }  
  23.       
  24.     public void SetPassword(String password)  
  25.     {  
  26.         _password=password;  
  27.     }  
  28.       
  29.     public String GetPassword()  
  30.     {  
  31.         return _password;  
  32.     }  
  33.       
  34.     public void SetAge(int age)  
  35.     {  
  36.         _age=age;  
  37.     }  
  38.       
  39.     public int GetAge()  
  40.     {  
  41.         return _age;  
  42.     }  
  43.       
  44.       
  45.     @Override  
  46.     public int describeContents() {  
  47.         // TODO Auto-generated method stub  
  48.         return 0;  
  49.     }  
  50.   
  51.     @Override  
  52.     public void writeToParcel(Parcel dest, int flags) {  
  53.         // TODO Auto-generated method stub  
  54.         dest.writeString(_account);  
  55.         dest.writeString(_password);  
  56.         dest.writeInt(_age);  
  57.     }  
  58.   
  59.     public static final Parcelable.Creator<ParcelData> CREATOR=new Creator<ParcelData>() {  
  60.   
  61.         @Override  
  62.         public ParcelData createFromParcel(Parcel source) {  
  63.             ParcelData registerData=new ParcelData();  
  64.             registerData._account=source.readString();  
  65.             registerData._password=source.readString();  
  66.             registerData._age=source.readInt();  
  67.             return registerData;  
  68.         }  
  69.   
  70.         @Override  
  71.         public ParcelData[] newArray(int size) {  
  72.               
  73.             return new ParcelData[size];  
  74.         }  
  75.           
  76.     };  
  77. }  
注:

1、需实现Parcelable。

2、每一个变量都必须要有对应的Set和Get方法。

3、需重载writeToParcel写入数据。

4、必须实现Parcelable.Creator<ParcelData> CREATOR,而且必须为public静态。在实现时还要重载createFromParcel来读取数据。

5、TransData需要被TransDataA和TransDataB共同引用,为了确保正确,可以将TransData设置为Library,然后在TransDataA和TransDataB中引用。可参看下图



转载请注明出处 Android跨应用间的数据传输


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值