Androidラーニングノート--クリップボードを使用してActivityにサンプルコードを渡す

5378 ワード

Activity間でデータを転送するには、WindowsやLinuxオペレーティングシステムにかかわらず、あるプログラムがいくつかのデータをクリップボードにコピーし、他のどのプログラムもクリップボードからデータを取得することができ、Androidシステムにも存在します.
クリップボードを使用すると使用されます.クリップボードを操作するために使用されるクリップボードオブジェクトですが、publicのコンストラクション関数(単一モード)は提供されていません.Activity.getSystemService(Context.CLIPBOARD_SERVICE)を使用してオブジェクトを取得する必要があります.
Android-11(Android 3.0)バージョンの前に、クリップボードでデータを渡すにはsetText()とgetText()メソッドが使用されていましたが、このバージョンの後、この2つのメソッドは破棄され、代わりにClipDataオブジェクトを渡すのに使用されました.getTextやsetTextに比べて、ClipDataオブジェクトを利用してデータを伝達することは、オブジェクト向けの考え方に合致し、伝達できるデータ型も多様化しています. 
主な手順:
getSystemServiceでClipboardManagerオブジェクトcmを取得します.
cmを使用します.setPrimaryClip()メソッドは、ClipDataデータオブジェクトを設定します.
新しいActivityでClipboardManagerオブジェクトcmを取得します.
cmを使用します.getPrimaryClip()メソッドは、クリップボードのClipDataデータオブジェクト、cdを取得します.
cdを通過する.getItemAt(0)は、転送されたデータを取得する.
サンプルコード
データの保存:
 
  
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@SuppressLint("NewApi")
@Override
public void onClick(View v) {
//
ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
cm.setPrimaryClip(ClipData.newPlainText("data", "Jack"));
Intent intent=new Intent(MainActivity.this,otherActivity.class);
startActivity(intent);
}
});
}

データの読み込み:
 
  
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
ClipData cd=cm.getPrimaryClip();
String msg=cd.getItemAt(0).getText().toString();
TextView tv=(TextView)findViewById(R.id.msg);
tv.setText(msg);
}

以上の方法では、クリップボードを使用してStringタイプのデータを転送し、オブジェクトを転送する必要がある場合は、転送されたオブジェクトをシーケンス化する必要があります.シーケンス化は、Serializableインタフェースを実装することによってマークされます.
主な手順:
Serializableインタフェースを実装したクラスMyDataを作成します.
格納データ:ClipboardManagerを取得し、Base 64クラスでMyDataオブジェクトをシーケンス化してクリップボードに格納します.
データの取り出し:新しいActivityでClipboardManagerを取得し、シーケンス化されたデータを逆シーケンス化し、Base 64クラスを使用します.その後、逆シーケンス化されたデータを処理します.
サンプルコード:
ステップ1:
 
  
public class MyData implements Serializable {
private String name;
private int age;
public MyData(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

ステップ2:
 
  
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@SuppressLint("NewApi")
@Override
public void onClick(View v) {
//
ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
MyData mydata=new MyData("jack", 24);
String baseToString="";
ByteArrayOutputStream bArr=new ByteArrayOutputStream();
try
{
ObjectOutputStream oos=new ObjectOutputStream(bArr);
oos.writeObject(mydata);
baseToString=Base64.encodeToString(bArr.toByteArray(), Base64.DEFAULT);
oos.close();
}
catch (Exception e)
{
e.printStackTrace();
}
cm.setPrimaryClip(ClipData.newPlainText("data",baseToString));
Intent intent=new Intent(MainActivity.this,otherActivity.class);
startActivity(intent);
}
});
}

手順3:
 
  
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
ClipData cd=cm.getPrimaryClip();
String msg=cd.getItemAt(0).getText().toString();
byte[] base64_btye=Base64.decode(msg, Base64.DEFAULT);
ByteArrayInputStream bais=new ByteArrayInputStream(base64_btye);
try {
ObjectInputStream ois=new ObjectInputStream(bais);
MyData mydata=(MyData)ois.readObject();
TextView tv=(TextView)findViewById(R.id.msg);
tv.setText(mydata.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

まとめ
以上のように、クリッピングボードを用いてデータを転送することはメリットとデメリットがあり、クリッピングボードはAndroidシステムが管理しているため、一箇所に格納されたデータは、このAndroidデバイス上でどのアプリケーションでもアクセス可能であるが、このデバイスがアクセスしているのは同じクリッピングボードであるため、現在のプログラムが格納しているデータが、使用前に他のプログラムで上書きされる可能性がある.データの正確な取得が保証されません.