数据传递

1. 使用Application传递数据

声明一个继承android.app.Application的类MyApplication,并在AndroidManifest.xml的Application标签中声明Android:name=”.MyApplication”。

<application
       android:name=".MyApplication"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name" >
       <activity
           android:name=".MainActivity"
           android:label="@string/app_name" >
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER"/>
           </intent-filter>
       </activity>
       <activity
           android:name=".OtherActivity"
           android:label="@string/title_activity_other" >
       </activity>
   </application>

在MyApplication中重写父类的OnCreate()方法,声明一些需要的属性,并声明属性的getter()和setter()方法。

public class MyApplication extends Application {
   
    privateString data;
 
    publicString getData() {
       returndata;
    }
 
    publicvoid setData(String data) {
       this.data= data;
    }
 
    @Override
    publicvoid onCreate() {
       // TODOAuto-generated method stub
       super.onCreate();
       setData("这是要传递的数据!");
    }
}

在其他类中用myApplication= (MyApplication) getApplication()获取到MyApplication。

myApplication = (MyApplication) getApplication();

调用myApplication的getter()和setter()方法读取或修改MyApplication中的数据。

textView.setText(myApplication.getData());

2. 使用剪贴板(Clipboard)传递数据

①   .android.text.ClipboardManager

将数据复制到剪贴板时,先获取到系统的Context.CLIPBOARD_SERVICE服务;

ClipboardManager clipboardManager =(ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);

然后将数据放入到剪贴板;

clipboardManager.setText(data);

从官方文档可以看出,该类从APILevel 11已经弃用。

②   .android.context.ClipboardManager

使用android.context.ClipboardManager实现文本数据的传递时要保证使用的API Level不低于11.

因为android.context.ClipboardManager继承了android.text.ClipboardManager

同样可以使用以方法实现数据的复制粘贴,

ClipboardManager clipboardManager =(ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setText(data);
clipboardManager.setText(data);

由于android.text.ClipboardManager与其方法已经被弃用,我们可以换用android.context.ClipboardManager的getPrimaryClip()和setPrimaryClip()方法。只不过这两个方法中使用的是ClipData类型的数据,从官方文档可以了解到ClipData是从API Level 11才添加进来的复合型的数据类型,他可以包含一个或多个实例,并且包含一个ClipDescription。

使用如下方法向剪贴板放入数据data,并使用描述:

clipboardManager.setPrimaryClip(ClipData.newPlainText("数据描述", data));

同样可以使用newHtmlText()、newIntent()、newRawUri()、newUri()向剪贴板放入各种数据。

使用如下方法从剪贴板取出数据data:

String data =clipboardManager.getPrimaryClip().getItemAt(0).getText().toString();

使用getHtmlText()、getIntent()、getRawUri()、getUri()从剪贴板获取到其他类型的数据。

3. 使用Intent传递数据

使用Intent传递数据要简单一些,创建Intent后使用Intent的putExtra()方法可以使Intent带有参数,接收端使用相对应的get*Extra()方法获取数据。如getStringExtra()、getIntExtra()、getDoubleExtra()等。

向Intent放入数据

Intent intent = new Intent();
intent.setClass(MainActivity.this,OtherActivity.class);
intent.putExtra("data",editText.getText().toString());
startActivity(intent);

取出Intent中的数据

Intent intent = getIntent();
String data =intent.getStringExtra("data");

Intent的putExtra(String name, char value)方法的第一个参数是对要传递数据的声明,相当于对数据添加了一个标签,用getStringExtra(name)取出数据时使用该标签。有一些get*Extra()方法带有默认值,如getLongExtra(String name, long defaultValue),如果从Intent中获取不到指定name的数据时,将使用defaultValue作为返回值。

4. 使用Activity返回数据

当使用Intent从MainActivity跳转到OtherActivity,而从这个OtherActivity返回到MainActivity时需要返回数据的情况下,我们可以使用startActivityForResult (Intent intent, int requestCode)来启动OtherActivity,而不再使用不可以返回数据的startActivity(Intentintent)。

startActivityForResult(Intent intent, int requestCode)需要两个参数。第一个intent不解释了,第二个是一个requestCode,官方文档说明如果这个requestCode>= 0,那么当OtherActivity返回时,系统将会调用MainActivity中的onActivityResult()方法,而这个requestCode将会被带到onActivityResult()中。我们可以以此作为OtherActivity是否带有需要的参数返回的判断标志。

在MainActivity中,使用startActivityForResult()启动OtherActivitiy,REQUEST_CODE为自定义的常量。

Intent intent = new Intent();
intent.setClass(MainActivity.this,OtherActivity.class);
startActivityForResult(intent, REQUEST_CODE);

并在MainActivity中重写onActivityResult()方法,返回的resultCode是Activity中定义的常量,可以是DEFAULT_KEYS_SHORTCUT、RESULT_CANCELED等多种值。

@Override
protected void onActivityResult(int requestCode,int resultCode, Intent intent) {
 
    super.onActivityResult(requestCode,resultCode, intent);
   
    //判断Activity返回状态
    if(resultCode== DEFAULT_KEYS_SHORTCUT){
       //判断是否带有指定参数
       if(requestCode== REQUEST_CODE){
           Bundle bundle = intent.getExtras();
String data = bundle.getString("data");
System.out.println("MainActivity:" + data);
tvData.setText(data);
       }
    }
}

在OtherActivity中使用setResult(int resultCode, Intent data)方法带回含有参数的intent对象。

Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putInt("data", data);
intent.putExtras(bundle);
setResult(REQUEST_CODE ,intent);
finish();

验证按返回按钮的resultCode为RESULT_CANCELED,使用finish()结束Activity返回的resultCode为DEFAULT_KEYS_SHORTCUT。

5. 对象的传递

我们可以传递可序列化的对象,使用ObjectOutputStream的writeObject()方法将对象写入到ByteArrayOutputStream中,然后用Base64的encodeToString()方法将ByteArrayOutputStream转化为String。然后我们就可以用其他的数据传递方法传递转换好的String了。

接收到String后,我们要将String转换为我们需要的对象。首先用Base64的decode()方法将String转换为byte[]数组,然后从这个byte[]数组新建一个ByteArrayInputStream对象,继而从ByteArrayInputStream新建一个ObjectInputStream对象,最后调用ObjectInputStream的readObject()方法读取出Object,然后用指定的类型来接收这个Object。

MyObject必须是可序列化的

public class MyObject implements Serializable {
}

Object转换为String

//将myObject转换为base64String
ByteArrayOutputStream byteArrayOutputStream = newByteArrayOutputStream();
String base64String = "";
try{
    ObjectOutputStreamobjectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
    //将myObject写入到byteArrayOutputStream中
    objectOutputStream.writeObject(myObject);
    //用Base64的encodeToString()方法将byteArrayOutputStream转换为String
    base64String= Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT);
    objectOutputStream.close();
}catch(Exception e){
    e.printStackTrace();
}

    String转化为Object

//使用Base64的decode方法转换接收到的objString为byte[]数组
byte[] base64Byte = Base64.decode(objString   ,Base64.DEFAULT);
//将byte[]数组转换为ByteArrayInputStream
ByteArrayInputStream byteArrayInputStream = newByteArrayInputStream(base64Byte);
try{  
    //使用ObjectInputStream接收ByteArrayInputStream
    ObjectInputStreamobjInputStream = new ObjectInputStream(byteArrayInputStream);
    //用ObjectInputStream的readObject方法读取出MyObject对象
    MyObjectmyObject = (MyObject) objInputStream.readObject();
}catch(Exception e){
   
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值