Android剪切板传递数据传递序列化对象数据
一、剪切板的使用介绍
1. 剪切板对象的创建
使用剪切板会用到,ClipboardManager对象,这个对像的创建不可以使用构造方法,主要是由于没有提供public的构造函数(单例模式),需要使用Activity.getSystemService(Context.CLIPBOARD_SERVICE)获取该对象。
2. 对象调用的主要方法介绍
在Android-11(Android 3.0)版本之前,利用剪切板传递数据使用setText()和getText()方法,但是在此版本之后,这两个方法就被弃用,转而使用传递ClipData对象来代替。相对于getText和setText而言,利用ClipData对象来传递数据,更符合面向对象的思想,而且所能传递的数据类型也多样化了。
3. 使用该方法的步骤
主要步骤:
(1) 通过getSystemService获取ClipboardManager对象cm;
(2) 使用cm.setPrimaryClip()方法设置ClipData数据对象;
(3) 在新Activity中获取ClipboardManager对象cm;
(4) 使用cm.getPrimaryClip()方法获取剪切板的ClipData数据对象: cd;
(5) 通过cd.getItemAt(0)获取到传递进来的数据。
//------------------------------------废话不多直接上代码,首先给出的是API11以后的剪切板传递数据方法
1 /* 2 *使用剪切板传递数据 3 */ 4 public class MainActivity extends Activity { 5 6 private Button button; 7 8 @SuppressLint("NewApi") 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 button = (Button) findViewById(R.id.button); 14 button.setOnClickListener(new View.OnClickListener() { 15 @SuppressLint("NewApi") 16 @Override 17 public void onClick(View v) { 18 MyData myData = new MyData("java", 23); 19 // 将对象转换成字符串, 20 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 21 String base64String = ""; 22 23 try { 24 ObjectOutputStream objectOutputStream = new ObjectOutputStream( 25 byteArrayOutputStream); 26 objectOutputStream.writeObject((myData)); 27 // 使用Android工具类Base64 28 base64String = Base64.encodeToString( 29 byteArrayOutputStream.toByteArray(), Base64.DEFAULT); 30 objectOutputStream.close(); 31 } catch (IOException e) { 32 // TODO Auto-generated catch block 33 e.printStackTrace(); 34 } 35 36 // 使用剪切板在API11以后的版本 37 ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 38 cm.setPrimaryClip(ClipData.newPlainText("java", base64String)); 39 Intent intent = new Intent(MainActivity.this, 40 OtherActivity.class); 41 startActivity(intent); 42 } 43 }); 44 } 45 46 }
//----------------------------------------
主要步骤:
创建一个实现了Serializable接口的类MyData。
存入数据:获取ClipboardManager,并对通过Base64类对MyData对象进行序列化,再存入剪切板中。
取出数据:在新Activity中,获取ClipboardManager,对被序列化的数据进行反序列化,同样使用Base64类。然后对反序列化的数据进行处理。
1 import java.io.Serializable; 2 3 public class MyData implements Serializable { 4 private String name; 5 private int age; 6 7 public MyData(String name, int age) { 8 super(); 9 this.name = name; 10 this.age = age; 11 } 12 13 public String getName() { 14 return name; 15 } 16 17 public void setName(String name) { 18 this.name = name; 19 } 20 21 public int getAge() { 22 return age; 23 } 24 25 public void setAge(int age) { 26 this.age = age; 27 } 28 29 @Override 30 public String toString() { 31 return "MyData [name=" + name + ", age=" + age + "]"; 32 } 33 34 }
//-----------------------------
//目的地activity,
1 @SuppressLint("NewApi") 2 public class OtherActivity extends Activity { 3 4 private TextView textView; 5 6 @SuppressLint("NewApi") 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 // TODO Auto-generated method stub 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.other); 12 textView = (TextView) findViewById(R.id.msg); 13 // 获取剪切板对象 14 ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 15 ClipData clipData = cm.getPrimaryClip(); 16 // getItemAt()方法获取clipData对象中的Item,然后通过Item的getText()方法获取里面的数据。 17 String msg = clipData.getItemAt(0).getText().toString(); 18 // 有了数据之后通过反序列化将数据变为对象显示出来即可 19 byte[] base64_btye = Base64.decode(msg, Base64.DEFAULT); 20 ByteArrayInputStream bais = new ByteArrayInputStream(base64_btye); 21 try { 22 ObjectInputStream ois = new ObjectInputStream(bais); 23 MyData myData = (MyData) ois.readObject(); 24 textView.setText(myData.toString()); 25 } catch (Exception e) { 26 // TODO Auto-generated catch block 27 e.printStackTrace(); 28 } 29 30 } 31 }
//=============================
//下面在贴出来一个以前版本的剪切板数据传递,使用的仍然是上面的MyData类
1 /* 2 *使用剪切板传递数据 3 */ 4 public class MainActivity extends Activity { 5 6 private Button button; 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.activity_main); 12 button = (Button) findViewById(R.id.button); 13 button.setOnClickListener(new View.OnClickListener() { 14 @Override 15 public void onClick(View v) { 16 MyData myData = new MyData("java", 23); 17 // 将对象转换成字符串 18 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 19 String base64String = ""; 20 21 try { 22 ObjectOutputStream objectOutputStream = new ObjectOutputStream( 23 byteArrayOutputStream); 24 objectOutputStream.writeObject((myData)); 25 // 使用Android工具类Base64 26 base64String = Base64.encodeToString( 27 byteArrayOutputStream.toByteArray(), Base64.DEFAULT); 28 objectOutputStream.close(); 29 } catch (IOException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } 33 34 // 使用剪切板 35 ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 36 clipboardManager.setText(base64String); 37 Intent intent = new Intent(MainActivity.this,OtherActivity.class); 38 startActivity(intent); 39 } 40 }); 41 } 42 43 }
//----------------------------
1 public class OtherActivity extends Activity { 2 3 private TextView textView; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 // TODO Auto-generated method stub 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.other); 10 textView = (TextView) findViewById(R.id.msg); 11 // 获取剪切板对象 12 ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 13 String name = clipboardManager.getText().toString(); 14 // 将得到的数据还原为字节数组 15 byte[] base64_byte = Base64.decode(name, Base64.DEFAULT); 16 ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( 17 base64_byte); 18 try { 19 ObjectInputStream objectInputStream = new ObjectInputStream( 20 byteArrayInputStream); 21 MyData myData = (MyData) objectInputStream.readObject(); 22 textView.setText(myData.toString()); 23 } catch (Exception e) { 24 // TODO Auto-generated catch block 25 e.printStackTrace(); 26 } 27 28 29 } 30 }
public class OtherActivity extends Activity {
private TextView textView;
@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.other);textView = (TextView) findViewById(R.id.msg);// 获取剪切板对象ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);String name = clipboardManager.getText().toString();// 将得到的数据还原为字节数组byte[] base64_byte = Base64.decode(name, 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 Auto-generated catch blocke.printStackTrace();}
}}