Android学习笔记--使用剪切板在Activity中传值示例代码
程序员文章站
2023-11-27 18:49:16
在activity之间传递数据还可以利用一些技巧,不管windows还是linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一些数据复制到剪切板上,然后其他的...
在activity之间传递数据还可以利用一些技巧,不管windows还是linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取数据,在android系统中也存在此技术。
使用剪切板会用到,clipboardmanager对象,这个对用剪切板会用到,clipboardmanager象用来操作剪切板,但是没有提供public的构造函数(单例模式),需要使用activity.getsystemservice(context.clipboard_service)获取该对象。
在android-11(android 3.0)版本之前,利用剪切板传递数据使用settext()和gettext()方法,但是在此版本之后,这两个方法就被弃用,转而使用传递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,并对通过base64类对mydata对象进行序列化,再存入剪切板中。
取出数据:在新activity中,获取clipboardmanager,对被序列化的数据进行反序列化,同样使用base64类。然后对反序列化的数据进行处理。
示例代码:
步骤一:
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;
}
}
步骤二:
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);
}
});
}
步骤三:
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设备上任何应用都可以访问的到,但是正是因为此设备访问的都是同一个剪切板,可能会导致当前程序存入的数据,在使用前被其他程序覆盖掉了,导致无法保证正确获取数据。
使用剪切板会用到,clipboardmanager对象,这个对用剪切板会用到,clipboardmanager象用来操作剪切板,但是没有提供public的构造函数(单例模式),需要使用activity.getsystemservice(context.clipboard_service)获取该对象。
在android-11(android 3.0)版本之前,利用剪切板传递数据使用settext()和gettext()方法,但是在此版本之后,这两个方法就被弃用,转而使用传递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,并对通过base64类对mydata对象进行序列化,再存入剪切板中。
取出数据:在新activity中,获取clipboardmanager,对被序列化的数据进行反序列化,同样使用base64类。然后对反序列化的数据进行处理。
示例代码:
步骤一:
复制代码 代码如下:
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;
}
}
步骤二:
复制代码 代码如下:
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);
}
});
}
步骤三:
复制代码 代码如下:
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设备上任何应用都可以访问的到,但是正是因为此设备访问的都是同一个剪切板,可能会导致当前程序存入的数据,在使用前被其他程序覆盖掉了,导致无法保证正确获取数据。