Android学习笔记

来源:互联网 发布:淘宝怎么批量上传图片 编辑:程序博客网 时间:2024/06/05 00:37

在Activity之间传递数据还可以利用一些技巧,不管windows还是Linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取数据,在Android系统中也存在此技术。

使用剪切板会用到,ClipboardManager对象,这个对用剪切板会用到,ClipboardManager象用来操作剪切板,但是没有提供public的构造函数(单例模式),需要使用Activity.getSystemService(Context.CLIPBOARD_SERVICE)获取该对象。

在Android-11(Android 3.0)版本之前,利用剪切板传递数据使用setText()和getText()方法,但是在此版本之后,这两个方法就被弃用,转而使用传递ClipData对象来代替。相对于getText和setText而言,利用ClipData对象来传递数据,更符合面向对象的思想,而且所能传递的数据类型也多样化了。

 

主要步骤

  1. 通过getSystemService获取ClipboardManager对象cm。
  2. 使用cm.setPrimaryClip()方法设置ClipData数据对象。
  3. 在新Activity中获取ClipboardManager对象cm。
  4. 使用cm.getPrimaryClip()方法获取剪切板的ClipData数据对象,cd。
  5. 通过cd.getItemAt(0)获取到传递进来的数据。

 

示例代码

保存数据:

 

 

 1     protected void onCreate(Bundle savedInstanceState) { 2         super.onCreate(savedInstanceState); 3         setContentView(R.layout.activity_main); 4          5         Button btn=(Button)findViewById(R.id.btn); 6         btn.setOnClickListener(new View.OnClickListener() { 7              8             @SuppressLint("NewApi") 9             @Override10             public void onClick(View v) {11                 //获取剪切板12                 ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);    13                 14                 cm.setPrimaryClip(ClipData.newPlainText("data", "Jack"));15                 Intent intent=new Intent(MainActivity.this,otherActivity.class);16                 startActivity(intent);17             }18         });     19     }

读取数据:

 1     protected void onCreate(Bundle savedInstanceState) { 2         // TODO Auto-generated method stub 3         super.onCreate(savedInstanceState); 4         setContentView(R.layout.other); 5          6         ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); 7         ClipData cd=cm.getPrimaryClip(); 8          9         String msg=cd.getItemAt(0).getText().toString();10         11         TextView tv=(TextView)findViewById(R.id.msg);12         tv.setText(msg);        13     }

 

以上方式使用剪切板传递的为String类型的数据,如果需要传递一个对象,那么被传递的对象必须可序列化,序列化通过实现Serializable接口来标记。

主要步骤

  1. 创建一个实现了Serializable接口的类MyData。
  2. 存入数据:获取ClipboardManager,并对通过Base64类对MyData对象进行序列化,再存入剪切板中。
  3. 取出数据:在新Activity中,获取ClipboardManager,对被序列化的数据进行反序列化,同样使用Base64类。然后对反序列化的数据进行处理。

示例代码

步骤一:

 1 public class MyData implements Serializable  { 2     private String name; 3     private int age;     4      5     public MyData(String name, int age) { 6         super(); 7         this.name = name; 8         this.age = age; 9     }    10     11     public String getName() {12         return name;13     }14     public void setName(String name) {15         this.name = name;16     }17     18     public int getAge() {19         return age;20     }21     public void setAge(int age) {22         this.age = age;23     }    24 }

步骤二:

 1     protected void onCreate(Bundle savedInstanceState) { 2         super.onCreate(savedInstanceState); 3         setContentView(R.layout.activity_main); 4          5         Button btn=(Button)findViewById(R.id.btn); 6         btn.setOnClickListener(new View.OnClickListener() { 7              8             @SuppressLint("NewApi") 9             @Override10             public void onClick(View v) {11                 //获取剪切板12                 ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);    13                 14                 MyData mydata=new MyData("jack", 24);15                 String baseToString="";16                 ByteArrayOutputStream bArr=new ByteArrayOutputStream();17                 try18                 {19                     ObjectOutputStream oos=new ObjectOutputStream(bArr);20                     oos.writeObject(mydata);21                     baseToString=Base64.encodeToString(bArr.toByteArray(), Base64.DEFAULT);22                     oos.close();23                 }24                 catch (Exception e)25                 {26                     e.printStackTrace();27                     28                 }29                 30                 cm.setPrimaryClip(ClipData.newPlainText("data",baseToString));31                 Intent intent=new Intent(MainActivity.this,otherActivity.class);32                 startActivity(intent);33             }34         });     35     }

步骤三:

 1     protected void onCreate(Bundle savedInstanceState) { 2         // TODO Auto-generated method stub 3         super.onCreate(savedInstanceState); 4         setContentView(R.layout.other); 5          6         ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); 7         ClipData cd=cm.getPrimaryClip(); 8          9         String msg=cd.getItemAt(0).getText().toString();10         byte[] base64_btye=Base64.decode(msg, Base64.DEFAULT);11         ByteArrayInputStream bais=new ByteArrayInputStream(base64_btye);12         try {13             ObjectInputStream ois=new ObjectInputStream(bais);14             MyData mydata=(MyData)ois.readObject();15             16             TextView tv=(TextView)findViewById(R.id.msg);17             tv.setText(mydata.toString());18         } catch (Exception e) {19             // TODO Auto-generated catch block20             e.printStackTrace();21         }        22     }

 

 

总结

综上所述,使用剪切板传递数据有利有弊,剪切板为Android系统管理的,所以在一个地方存入的数据,在这个Android设备上任何应用都可以访问的到,但是正是因为此设备访问的都是同一个剪切板,可能会导致当前程序存入的数据,在使用前被其他程序覆盖掉了,导致无法保证正确获取数据。

 


<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击