1、在Activity之間傳遞數據還可以利用一些技巧,無論是Windows還是Linux操作系統,都支持一種叫做剪切板的技術(某一程序將數據復制到剪切板上,其它的任何程序都可以從剪切板中獲取數據);
2、新建一個名為“android_intent3”的Android工程;
3、在main.xml文件中添加Button:
~~~
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Android使用剪切板傳遞數據" />
~~~
4、新建布局文件”other.xml“,添加”TextView“,代碼:
~~~
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextVeiw
android:id="@+id/msg"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</TextVeiw>
</LinearLayout>
~~~
5、聲明一個Activity,”OtherActivity“,并繼承Activity,在此類中創建”onCreate“方法;
6、回到“Main.java”中,添加成員Button,并向Android系統調用剪切板,構造意圖并啟動,代碼:
~~~
package com.android.myintent;
import android.os.Bundle;
import android.app.Activity;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class Main extends Activity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 從Android系統中調用剪切板的服務
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
String name = "Jack";
clipboardManager.setText(name);// 向剪切板添加數據
Intent intent = new Intent(Main.this, OtherActivity.class);
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
~~~
9、點擊“OtherActivity.java”,添加獲取剪切板方法,獲取剪切板數據,設置到“textView”上,代碼:
~~~
package com.android.myintent;
import android.app.Activity;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Bundle;
import android.widget.TextView;
public class OtherActivity extends Activity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
textView = (TextView) this.findViewById(R.id.msg);
ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
String msgString = clipboardManager.getText().toString();//從剪切板中獲取數據
textView.setText(msgString);
}
public OtherActivity() {
// TODO Auto-generated constructor stub
}
}
~~~
10、在“AndroidManifest.xml”上添加“Activity”:
~~~
<activity android:name=".OtherActivity" >
</activity>
~~~
11、運行:


12、點擊按鈕,居然提示無法運行,后來經過查找,發現是因為在Android11版本之后,原來利用剪切板傳遞數據使用的setText()和getText()方法被棄用了,只能使用ClipData對象來代替了~下面我們來對上面的程序做出一點改動即可~
第8步中橙色部分的程序替換為:
~~~
ClipData clipData = ClipData.newPlainText("Label", "Jack");
clipboardManager.setPrimaryClip(clipData);
~~~
第9步中橙色部分的程序替換為:
~~~
ClipData clipData = clipboardManager.getPrimaryClip();//從剪切板中獲取數據
Item item = clipData.getItemAt(0);
textView.setText(item.getText().toString());
~~~
13、如果我們想在剪切板中傳遞復雜數據,比如一個對象:先建一個類“MyData”,并使其實現“serializable”接口(在Superclass選項里):
14、在新建類中添加成員“name”、“age”并提供構造方法,代碼如下:
~~~
import java.io.Serializable;
public class MyData implements Serializable {
private String name;
private int age;
@Override
public String toString() {
return "MyData [name=" + name + ", age=" + age + "]";
}
public MyData(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
~~~
15、進入“Main.java”,將原來添加的代碼注釋掉,然后實例化一個MyData對象,代碼如下(用到了Base64工具類):
~~~
package com.android.myintent;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import android.os.Bundle;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipData.Item;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.util.Base64;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class Main extends Activity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 從Android系統中調用剪切板的服務
// ClipboardManager clipboardManager = (ClipboardManager)
// getSystemService(Context.CLIPBOARD_SERVICE);
// 向剪切板添加數據
// ClipData clipData = ClipData.newPlainText("label", "Jack");
// clipboardManager.setPrimaryClip(clipData);
// Intent intent = new Intent(Main.this, OtherActivity.class);
// startActivity(intent);
MyData myData = new MyData("Jack", 23);
// 將對象轉換為字符串
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
String base64String = "";
try {// 捕獲異常
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
byteArrayOutputStream);
objectOutputStream.writeObject(myData);
base64String = Base64.encodeToString(
byteArrayOutputStream.toByteArray(), Base64.DEFAULT);
objectOutputStream.close();
} catch (Exception e) {
// TODO: handle exception
}
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipData = ClipData
.newPlainText("label", base64String);
clipboardManager.setPrimaryClip(clipData);
Intent intent = new Intent(Main.this, OtherActivity.class);
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
~~~
16、進入“OtherActivity.java”,修改代碼如下:
~~~
package com.android.myintent;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.ClipData.Item;
import android.os.Bundle;
import android.util.Base64;
import android.widget.TextView;
public class OtherActivity extends Activity {
private TextView textView;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
textView = (TextView) this.findViewById(R.id.msg);
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipData = clipboardManager.getPrimaryClip();// 從剪切板中獲取數據
Item item = clipData.getItemAt(0);
String msgString = item.getText().toString();
byte[] base64_byte = Base64.decode(msgString, Base64.DEFAULT);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
base64_byte);
try {
ObjectInputStream objectInputStream = new ObjectInputStream(
byteArrayInputStream);
MyData myData = (MyData) objectInputStream.readObject();
textView.setText(myData.toString());
} catch (Exception e) {
// TODO: handle exception
}
}
public OtherActivity() {
// TODO Auto-generated constructor stub
}
}
~~~
Ps:未完待續~
- 前言
- Android應用程序剖析
- (一)——生命周期
- (二)——使用Intent傳數據之通用方式
- (三)——使用靜態變量傳遞數據
- (四)——通過剪切板傳遞數據
- (五)——通過全局變量傳遞數據
- (六)——從Activity返回數據
- adt-bundle-linux-x86_64-20131030下新建工程提示找不到adb和R.java問題的解決
- Eclipse啟動時提示fail to create the Java Virtual Machine問題的解決
- Android常見UI組件之ListView(一)
- Android常見UI組件之ListView(二)——定制ListView
- (七)——顯示對話框窗口
- (八)——顯示進度對話框
- (九)——更復雜的進度對話框
- (十)——使用意圖鏈接活動
- (十一)——從意圖返回結果
- (十二)——使用意圖傳遞數據的幾種方式
- (十三)——碎片(一)
- (十四)——在運行時添加碎片(附源碼)
- (十五)——碎片的生命周期(附源碼)
- (十六)——碎片之間進行交互(附源碼)
- (十七)——使用意圖調用內置應用程序
- (十八)——使用意圖篩選器和實現瀏覽網頁(附源碼)