Android 开发Activity之间传递数据的几种方式.docx
《Android 开发Activity之间传递数据的几种方式.docx》由会员分享,可在线阅读,更多相关《Android 开发Activity之间传递数据的几种方式.docx(5页珍藏版)》请在冰豆网上搜索。
![Android 开发Activity之间传递数据的几种方式.docx](https://file1.bdocx.com/fileroot1/2023-2/28/0553d152-acb8-4321-8200-c57e99c88e85/0553d152-acb8-4321-8200-c57e99c88e851.gif)
Android开发Activity之间传递数据的几种方式
【Android开发】Activity之间传递数据的几种方式
在Android开发中,我们通常需要在不同的Activity之间传递数据,下面我们就来总结一下在Activity之间数据传递的几种方式。
1.使用Intent来传递数据
Intent表示意图,很多时候我们都会利用Android的Intent来在各个Activity之间传递数据,这也是Android比较官方的一种数据传递的方式
需求1:
从一个Activity(IntentDemo)跳转到另外一个Activity(Other),其中利用Intent来传递数据
程序Demo如下:
IntentDemo.java
[java]viewplaincopypackagecom.android.intentdemo;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;publicclassIntentDemoextendsActivity{privateButtonbutton;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);initComponent();button.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(IntentDemo.this,Other.class);//在Intent中传递数据intent.putExtra("name","AHuier");intent.putExtra("age",22);intent.putExtra("address","XiaMen");//启动IntentstartActivity(intent);}});}privatevoidinitComponent(){button=(Button)findViewById(R.id.button);}}
other.java
[java]viewplaincopypackagecom.android.intentdemo;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.widget.TextView;publicclassOtherextendsActivity{privateTextViewtextView;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){//TODOAuto-generatedmethodstubsuper.onCreate(savedInstanceState);setContentView(R.layout.other);initComponent();Intentintent=getIntent();intage=intent.getIntExtra("age",0);Stringname=intent.getStringExtra("name");Stringaddress=intent.getStringExtra("address");textView.setText("Myageis"+age+"\n"+"Mynameis"+name+"\n"+"Myaddress"+address);}privatevoidinitComponent(){textView=(TextView)findViewById(R.id.msg);}}
——>
2.在Activity之间使用静态变量传递数据
在上例中使用Intent可以很方便的在不同的Activity之间传递数据,这个也是官方推荐的方式,但是也有一定的局限性,就是Intent无法传递不能序列化的对象。
我们可以使用静态变量来解决这个问题。
需求1:
从一个Activity(IntentDemo)跳转到另外一个Activity(Other),其中利用静态变量来传递数据程序Demo:
IntentDemo.java
[java]viewplaincopyIntentintent=newIntent();intent.setClass(IntentDemo.this,Other.class);Other.age=22;Other.name="AHuier";Other.address="XiaMen";startActivity(intent);
Other.java[java]viewplaincopyprivateTextViewtextView;publicstaticintage;publicstaticStringname;publicstaticStringaddress;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){//TODOAuto-generatedmethodstubsuper.onCreate(savedInstanceState);setContentView(R.layout.other);initComponent();textView.setText("Myageis"+age+"\n"+"Mynameis"+name+"\n"+"Myaddress"+address);}——>3.通剪切板传递数据
在Activity之间数据传递还可以利用一些技巧,不管是Windows还是Linux操作系统,都会支持一种剪切板的技术,也就是一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取数据。
1)利用剪切板传递普通的数据,如字符串需求1:
从一个Activity(IntentDemo)跳转到另外一个Activity(Other),通过剪切板传递数据
程序Demo:
IntentDemo.java[java]viewplaincopyClipboardManagerclipboardManager=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);Stringname="AHuier";clipboardManager.setText(name);Intentintent=newIntent(IntentDemo.this,Other.class);startActivity(intent);Other.java
[java]viewplaincopyClipboardManagerclipboardManager=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);StringmsgString=clipboardManager.getText().toString();textView.setText(msgString);
——>1)利用剪切板传递复杂的数据,如对象
需求1:
从一个Activity(IntentDemo)跳转到另外一个Activity(Other),通过剪切板传递数据
新建一个MyData.java
[java]viewplaincopypackagecom.android.intentdemo;importjava.io.Serializable;publicclassMyDataimplementsSerializable{privateStringname;privateintage;publicMyData(Stringname,intage){super();this.name=name;this.age=age;}//提供一个toString()方法@OverridepublicStringtoString(){return"MyData[name="+name+",age="+age+"]";}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}}IntentDemo.java[java]viewplaincopyMyDatamyData=newMyData("AHuier",22);//将对象转换成字符串ByteArrayOutputStreambyteArrayOutputStream=newByteArrayOutputStream();Stringbase64String="";try{ObjectOutputStreamobjectOutputStream=newObjectOutputStream(byteArrayOutputStream);objectOutputStream.writeObject(myData);//使用Android中提供的Base64工具类,这个类主要是用来对对象进行压缩也解码的过程,使用默认方式base64String=Base64.encodeToString(byteArrayOutputStream.toByteArray(),Base64.DEFAULT);objectOutputStream.close();}catch(Exceptione){//TODO:
handleexception}ClipboardManagerclipboardManager=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);clipboardManager.setText(base64String);Intentintent=newIntent(IntentDemo.this,Other.class);startActivity(intent);
Other.java
[java]viewplaincopyClipboardManagerclipboardManager=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);StringmsgString=clipboardManager.getText().toString();//将字符串msgString还原为对象byte[]base64_byte=Base64.decode(msgString,Base64.DEFAULT);ByteArrayInputStreambyteArrayInputStream=newByteArrayInputStream(base64_byte);try{ObjectInputStreamobjectInputStream=newObjectInputStream(byteArrayInputStream);MyDatamyData=(MyData)objectInputStream.readObject();textView.setText(myData.toString());}catch(Exceptione){//TODO:
handleexception}
——>
4.Intent中使用全局变量来传递数据
需求1:
从一个Activity(Main)跳转到另外一个Activity(Other),通过全局变量来传递数据
Main.java
[java]viewplaincopyprivateButtonbutton;privateMyAppmyApp;...myApp=(MyApp)getApplication();myApp.setName("kunhuixu");//修改之后的名称Intentintent=newIntent(Main.this,Other.class);startActivity(intent);
Other.java
[java]viewplaincopyprivateMyAppmyApp;privateTextViewtextView;...myApp=(MyApp)getApplication();textView.setText("---Theappname---"+myApp.getName());
MyApp.java
[java]viewplaincopypackagecom.android.intentglobal;importandroid.app.Application;/**查看Android官方文档。
*Application是所有那些需要维护全局application状态的基类。
你可以提供你自己的实现机制通过在在AndroidManifest.xml中提供你自己的需要声明*的标记你自己的标签。
*onCreate()方法是在应用程序启动的时候被回调的。
*/publicclassMyAppextendsApplication{publicStringname;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}@OverridepublicvoidonCreate(){//TODOAuto-generatedmethodstubsuper.onCreate();setName("AHuier");}}
AndroidManifest.xml
[html]viewplaincopy<applicationandroid:
name=".MyApp"android:
icon="@drawable/ic_launcher"android:
label="@string/app_name"><activityandroid:
name="com.android.intentglobal.Main"android:
label="@string/app_name"><intent-filter><actionandroid:
name="android.intent.action.MAIN"/><categoryandroid:
name="android.intent.category.LAUNCHER"/></intent-filter></activity><activityandroid:
name="com.android.intentglobal.Other"></activity></application>
[注意]:
使用android:
name=".MyApp"来指定全局变量名称。
——>未完待续,持续更新中......