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設備上任何應用都可以訪問的到,但是正是因為此設備訪問的都是同一個剪切板,可能會導致當前程序存入的數據,在使用前被其他程序覆蓋掉了,導致無法保證正確獲取數據。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM