• Android--使用剪切板在Activity中传值


      在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             @Override
    10             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             @Override
    10             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                 try
    18                 {
    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 block
    20             e.printStackTrace();
    21         }        
    22     }

    总结

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

  • 相关阅读:
    魅族手机不能通过设置Style和Background展示透明Activity的解决方法
    [翻译]The dark side of AsyncTask
    Eclipse卡死在Building workspace和android library update解决方法
    影响Java代码性能的一些细节
    WebView通过loadDataWithBaseURL加载本地页面卡死
    [04] Android逐帧动画(一)
    [03] Android系统亮度调节
    iOS UIViewContentMode详解
    setObject:forKey:与setValue:forKey:的区别
    选择排序
  • 原文地址:https://www.cnblogs.com/plokmju/p/3140099.html
Copyright © 2020-2023  润新知