本篇文章是墨香投稿,是一位半路入行的Android开发者,29岁的他辞去几年工作,对软件开发一窍不通的他,为了梦想2014年初进入培训,后来还好了一份不错的工作,现在是我们群的管理员兼老大哥了,他对技术热情和专注是值得我们很多人学习的,他的经历也很值得很多初学者去参考。
最近刚换了一家公司,终于摆脱了孤军奋战的工作方式,而是进入了真正的团队作战,也让我感觉到了自己技能的不足,之前由于孤军奋战,对自己这样一个新手来说是寸步难行,公司项目紧张,而自己能力有限,又没有人可以商量和学习,所以吃了很多苦,每晚都是很晚才回来,但也学到了很多东西,可以说是被逼无奈,但对自己来说也是好事,在最短的时间学到了很多使用性东西,但对于这个快速发展的软件行业还是相差甚远,现在也终于有机会跟新公司的高手学习一下了。好了,感慨一下,下面进入正轨。
最近在新公司做封装广告SDK的工作,要求比较高,要求一键调用,对于代码的要求比较高,格式、命名、规范都有严格要求,因此虽然时间较短但也提升不少。前天在做一个数据同步的工作,要求在一个view跳转到一个activity,要求在activity操作的时候要同步view视图,因此也遇到了数据传输的问题,之前也曾考虑过,但是没有想出更好的方法,最近用接口设置监听用的比较多,突发想法,自己设计了一个方法比较实用,在此作为记录,如果谁有更好方法希望不吝赐教,先行谢过。 下面我以一个实例来介绍一下: 我有两个activity,一个MyActivity用来接收数据,另一个SecondActivity用来发送数据,这种可能我们会想到startActivityForResult,但是如果是其他的呢,不是两个activity,又会怎么处理呢,我突然想到一个通用的方法,不管是从哪里传到哪里,都可以通用,设计思路如下:
中间是一个工具类:TransferDataTool,里面是一个接口OnDataHandlerListener,在MyActivity跳转到SecondActivity之前要将接口实例化,然后通过SetOnDataHandlerListener传递到工具类中,跳转到SecondActivity后再需要传递出数据时调用handlerData方法会调用接口中的方法,进行传值,而在M有Activity中有监听就会接收到相应数据。 注意:如果想多个类通用可以将接口中的方法中的参数改成Object类型。 总共三个类,两个activity,一个工具类TransferDataTool,用来传输数据。 MyActivity类,用来接收数据,在跳转之前要设置监听对象到工具类,代码:
public class MyActivity extends Activity {
private TextView mTv;
private Button mBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mBtn = (Button) findViewById(R.id.btn);
mTv = (TextView) findViewById(R.id.tv);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { //设置监听接受数据
//将mOnDataHandlerListener传递到工具类
TransferDataTool.getInstance().setOnDataHandlerListener(mOnDataHandlerListener);
startActivity(new Intent().setClass(MyActivity.this, SecondActivity.class));
}
});
}
//用来监听数据
private TransferDataTool.OnDataHandlerListener mOnDataHandlerListener
= new TransferDataTool.OnDataHandlerListener() {
@Override
public void onDataHandler(String s) {
mTv.setText(s);
}
};
}
xml代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="跳转到SecondActivity" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:textSize="20sp"
android:text="Hello World, MyActivity" />
</LinearLayout>
SecondActivity数据传输类,代码:
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s = "SecondActivity";
//将数据传出
TransferDataTool.getInstance().handlerData(s);
finish();
}
});
}
@Override
protected void onDestroy() {
//释放
TransferDataTool.getInstance().finishDataHandlerListener();
super.onDestroy();
}
}
xml代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SecondActivity,点击返回名字" />
</LinearLayout>
TransferDataTool类,要用单例模式,防止监听对象被重新初始化,代码:
public class TransferDataTool {
private static TransferDataTool sTransferDataTool;
//单例模式
public static TransferDataTool getInstance() {
if (sTransferDataTool == null) {
synchronized (TransferDataTool.class) {
if (sTransferDataTool == null) {
sTransferDataTool = new TransferDataTool();
}
}
}
return sTransferDataTool;
}
private OnDataHandlerListener mOnDataHandlerListener;
/**
* /初始化监听--数据接收方调用
* 接收监听:onDataHandlerListener
*
* @param onDataHandlerListener 监听
*/
public void setOnDataHandlerListener(final OnDataHandlerListener onDataHandlerListener) {
this.mOnDataHandlerListener = onDataHandlerListener;
}
//释放监听
public void finishDataHandlerListener() {
mOnDataHandlerListener = null;
}
//调用监听--数据传出方调用
public void handlerData(final String s) {
if (mOnDataHandlerListener != null) {
//调用监听接口中的方法传输数据
mOnDataHandlerListener.onDataHandler(s);
}
}
//接口,数据传输工具,如果通用可以将String改为Object
public interface OnDataHandlerListener {
void onDataHandler(String s);
}
}
优点:灵活实用接口和单例模式进行数据传递,简单方便没有任何限制,可以传递任何类型, 缺点:如果较多需要些很多接口,不适合长时间的接口监听,有可能被系统回收。