在有些项目中,会有多个应用出现,这样应用间的数据传输就成了必然。那应用间的数据传输要怎么实现呢?我们知道,在跨Activity之间的数据传输可以通过Bundle和Intent结合来实现,那应用间的数据传输是否也可以使用这种方式呢?答案是可以的!
在使用Bundle来传输数据时,又有多种途径,比如直接数据传输、序列化数据传输、打包数据传输等。下面是从TransDataA应用传输到TransDataB应用的效果图。
在直接传输数据时,我们传输的是图片数据,序列化传输和打包传输时传输的是相应的结构信息,下面是实现的代码:
TransDataA项目的MainActivity.java
- package com.example.transdataa;
- import com.example.data.DirectData;
- import com.example.data.SerialData;
- import com.example.data.ParcelData;
- import com.kitsp.contentsp.IntentSp;
- import android.app.Activity;
- import android.content.ComponentName;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class MainActivity extends Activity {
- private Button _directTrans_button = null;
- private Button _serialTrans_button = null;
- private Button _pracelTrans_button = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Init();
- }
- private void Init() {
- FetchUIControls();
- BindingEvents();
- }
- private void FetchUIControls() {
- _directTrans_button = (Button) findViewById(R.id.activity_main_directTrans);
- _serialTrans_button = (Button) findViewById(R.id.activity_main_serialTrans);
- _pracelTrans_button = (Button) findViewById(R.id.activity_main_ParcelTrans);
- }
- private void BindingEvents() {
- if(_directTrans_button!=null)
- {
- _directTrans_button.setOnClickListener(new OnClickListenerEx());
- }
- if (_serialTrans_button != null) {
- _serialTrans_button.setOnClickListener(new OnClickListenerEx());
- }
- if (_pracelTrans_button != null) {
- _pracelTrans_button.setOnClickListener(new OnClickListenerEx());
- }
- }
- private class OnClickListenerEx implements OnClickListener {
- @Override
- public void onClick(View v) {
- Bundle bundle = null;
- switch (v.getId()) {
- case R.id.activity_main_directTrans:
- {
- bundle=DirectGenerateData();
- break;
- }
- case R.id.activity_main_serialTrans: {
- bundle = SerializeData();
- break;
- }
- case R.id.activity_main_ParcelTrans: {
- bundle = ParcelableData();
- break;
- }
- default: {
- break;
- }
- }
- TransData(bundle);
- }
- private Bundle DirectGenerateData()
- {
- Bundle bundle = new Bundle();
- Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.test);
- bundle.putParcelable(DirectData.KEY, bitmap);
- return bundle;
- }
- private Bundle SerializeData() {
- SerialData serialData = new SerialData();
- serialData.SetSerialNo("123456789");
- serialData.SetWeight(180.82);
- Bundle bundle = new Bundle();
- bundle.putSerializable(SerialData.KEY, serialData);
- return bundle;
- }
- private Bundle ParcelableData() {
- ParcelData parcelData = new ParcelData();
- parcelData.SetAccount("Test");
- parcelData.SetPassword("ABCDEFG");
- parcelData.SetAge(25);
- Bundle bundle = new Bundle();
- bundle.putParcelable(ParcelData.KEY, parcelData);
- return bundle;
- }
- private void TransData(Bundle bundle) {
- if (bundle == null) {
- return;
- }
- Intent intent = new Intent();
- ComponentName cn = new ComponentName("com.example.transdatab",
- "com.example.transdatab.MainActivity");
- if (cn != null) {
- intent.setComponent(cn);
- intent.putExtras(bundle);
- startActivity(intent);
- }
- }
- }
- }
1、数据都是以Bundle的形式添加到Intent中的。一定要记得在Intent中putExtras(bundle)。这是将数据添加到Intent的必须步骤,有时可能会遗忘。
2、在跨应用时,使用Intent来启动另一个应用。这里采用ComponentName的形式来启动另一个应用。\
3、在使用Intent传输数据时有上限的限制,不然会导致应用卡死或黑屏。具体上限是多少,网上有很多说法,有说40kb的、有说100kb的,有说1M的,我实际测试的结果是200kb左右。我的结论是可能与具体的设备有关。
TransDataB项目的MainActivity.java
- package com.example.transdatab;
- import android.app.Activity;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.graphics.drawable.BitmapDrawable;
- import android.graphics.drawable.Drawable;
- import android.os.Bundle;
- import android.widget.TextView;
- import com.example.data.DirectData;
- import com.example.data.SerialData;
- import com.example.data.ParcelData;
- public class MainActivity extends Activity {
- private SerialData _serialData = null;
- private ParcelData _parcelData = null;
- private Bitmap _bitmap=null;
- private TextView _info_textView = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Init();
- }
- private void Init() {
- FetchUIControls();
- InitParams();
- InitUI();
- }
- private void InitParams() {
- try {
- Intent intent = getIntent();
- if (intent == null) {
- _info_textView.setText("Intent is null");
- return;
- }
- if(intent.hasExtra(DirectData.KEY))
- {
- _bitmap=intent.getParcelableExtra(DirectData.KEY);
- }
- if (intent.hasExtra(SerialData.KEY)) {
- _serialData = (SerialData) intent
- .getSerializableExtra(SerialData.KEY);
- _info_textView.setText("MachineData");
- }
- if (intent.hasExtra(ParcelData.KEY)) {
- _info_textView.setText("RegisterData");
- _parcelData = (ParcelData) intent
- .getParcelableExtra(ParcelData.KEY);
- }
- } catch (Exception e) {
- _info_textView.setText("Exception");
- }
- }
- private void FetchUIControls() {
- _info_textView = (TextView) findViewById(R.id.activity_main_info);
- }
- private void InitUI() {
- if (_info_textView == null) {
- return;
- }
- String info = "";
- if(_bitmap!=null)
- {
- BitmapDrawable bitmapDrawble= new BitmapDrawable(MainActivity.this.getResources(), _bitmap);
- bitmapDrawble.setBounds(0, 0, _bitmap.getWidth(),_bitmap.getHeight());
- _info_textView.setCompoundDrawables(null, bitmapDrawble, null, null);
- }
- if (_serialData != null) {
- info = "SerialData\nSerialNo=" + _serialData.GetSerialNo() + "\nWeight="
- + _serialData.GetWeight() + "\n";
- }
- if (_parcelData != null) {
- info = "ParcelData\nAccount=" + _parcelData.GetAccount() + "\n" + "Password="
- + _parcelData.GetPassword() + "\n" + "Age="
- + _parcelData.GetAge() + "\n";
- }
- _info_textView.setText(info);
- }
- }
1、在接收数据的一端,先获取Intent,再判断是否有相应的KEY,然后再解开数据。
2、在获取直接传输过来的数据时,采用intent.getParcelableExtra来获取数据。
在TransDataA和TransDataB中传输序列化和打包的数据时,一定要用同样的KEY和同样的类,不然数据会解不开。这里,他们共用的是TransData项目中的类,下面是代码。
TransData项目的DirectData.java
- package com.example.data;
- public class DirectData {
- public final static String KEY="{56896229-BFCD-4630-B1EF-4D8FA6CA90FE}";
- }
TransData项目的SerialData.java
- package com.example.data;
- import java.io.Serializable;
- public class SerialData implements Serializable {
- public static final String KEY="{1D7D9EF2-06F6-4A55-9DF6-293471209D15}";
- /**
- *
- */
- private static final long serialVersionUID = 1464294135398038125L;
- private String _serialNo="";
- private double _weight_kg=0;
- public void SetSerialNo(String serialNo)
- {
- _serialNo=serialNo;
- }
- public String GetSerialNo()
- {
- return _serialNo;
- }
- public void SetWeight(double weight_kg)
- {
- _weight_kg=weight_kg;
- }
- public double GetWeight()
- {
- return _weight_kg;
- }
- }
1、需实现Serializable。
2、每一个变量都必须要有对应的Set和Get方法。
TransData项目的ParcelData.java
- package com.example.data;
- import android.os.Parcel;
- import android.os.Parcelable;
- public class ParcelData implements Parcelable {
- public final static String KEY="{00D2DF54-B448-415F-AB7C-E0C6B6D3E608}";
- private String _account="";
- private String _password="";
- private int _age=0;
- public void SetAccount(String account)
- {
- _account=account;
- }
- public String GetAccount()
- {
- return _account;
- }
- public void SetPassword(String password)
- {
- _password=password;
- }
- public String GetPassword()
- {
- return _password;
- }
- public void SetAge(int age)
- {
- _age=age;
- }
- public int GetAge()
- {
- return _age;
- }
- @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(_account);
- dest.writeString(_password);
- dest.writeInt(_age);
- }
- public static final Parcelable.Creator<ParcelData> CREATOR=new Creator<ParcelData>() {
- @Override
- public ParcelData createFromParcel(Parcel source) {
- ParcelData registerData=new ParcelData();
- registerData._account=source.readString();
- registerData._password=source.readString();
- registerData._age=source.readInt();
- return registerData;
- }
- @Override
- public ParcelData[] newArray(int size) {
- return new ParcelData[size];
- }
- };
- }
1、需实现Parcelable。
2、每一个变量都必须要有对应的Set和Get方法。
3、需重载writeToParcel写入数据。
4、必须实现Parcelable.Creator<ParcelData> CREATOR,而且必须为public静态。在实现时还要重载createFromParcel来读取数据。
5、TransData需要被TransDataA和TransDataB共同引用,为了确保正确,可以将TransData设置为Library,然后在TransDataA和TransDataB中引用。可参看下图
转载请注明出处 Android跨应用间的数据传输