Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android應用開發入門(七)使用剪切板在Activity中傳值

Android應用開發入門(七)使用剪切板在Activity中傳值

編輯:Android開發實例

 在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.     }      

 步驟二:

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved