目录
二 广播
三 回调接口
Android开发过程中,经常遇到APP内部(例如不同页面间)数据传递的问题,简单整理记录这些数据传输的方式。粘贴上代码,方便以后复制粘贴。
其实,把SharePrefence放到这里不合适。SharePrefence是用来保存少量数据的方式,如保存程序配置信息等。基本上应用内任何地方均能获取到已经保存到的数据。SharePrefences的源码如下所示:
/**
* 保存信息
*/
private void setMessage() {
SharedPreferences sp = this.getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("id", et_input.getText().toString());
editor.commit();
}
/**
* 获取信息
*/
private void getMessage() {
SharedPreferences sp = this.getPreferences(MODE_PRIVATE);
String id = sp.getString("id", "error");
tv_result.setText(id);
}
注意一下获取SharePrefence对象的一个参数,支持三种模式:
editor对象可以插入一个键值对,值可以是大部分数据类型。
SharePrefences对象可以获取要相应数据类型,第2个参数为获取不到数据时的DefaultValues。
这种方式比较简单,不再做解释。
广播是四大组件之一,可以同一个app或者多个app之间通信。当然,也是比较常见的传递数据的方式。
当然广播作为四大组件有很多技巧点,这里只是简单的贴出动态广播在app内部的数据传递的代码。详细的还是百度吧。
简单来说,就是在一个页面通过Intent发送广播,在另一个页面注册广播接收器实时监听发送的内容。俩部分代码如下。
public class MyStaticBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//监听广播
switch (intent.getAction()) {
case "ACTION":
String message = intent.getStringExtra("ID");
tv_result.setText(message);
break;
}
}
}
/**
* 注册广播接收器
*/
private void registerBroad() {
IntentFilter filter = new IntentFilter();
filter.addAction("ACTION");
MyStaticBroadcastReceiver myStaticBroadcastReceiver = new MyStaticBroadcastReceiver();
registerReceiver(myStaticBroadcastReceiver, filter);
}
/**
* 发送消息
*/
private void setMessage() {
Intent intent = new Intent();
intent.setAction("ACTION");
intent.putExtra("ID", et_input.getText().toString());
sendBroadcast(intent);
}
一个接收器可以IntentFilter 的addAction动作添加多个广播的监听,同时也是通过Action区别不同广播发送的消息。
回调接口也是一个比较经典的数据传递方式了,比如fragement,activity之间进行数据传递,当然,上面俩种方式也能完成目标。但是,广播的频繁与大量注册势必会影响应用的性能(我就被坑的比较深),所以还是需要使用回调接口。
1 创建一个回调接口。定义一个
public interface CallBack {
void doSomething(String message);
}
2 创建一个接口工具类。
这个类需要一个CallBack类型的参数变量,定义一个set方法传入这个变量。为了实现CallBack回调接口的transMessage方法。
package com.heima.transinapp.TestCallBack;
public class CallBackUtil {
private static CallBack mCallBack;
public static CallBack getmCallBack() {
return mCallBack;
}
/**
* 注册回调接口
* @param callBack 一个继承回调接口的对象
*/
public static void setCallBack(CallBack callBack) {
mCallBack = callBack;
}
/**
* @param message 传递的信息
*/
public static void doCallBack(String message){
mCallBack.transMessage(message);
}
}
3 数据接收页面实现CallBack接口
在回调接口被调用的时候,这个被实现的接口所实现的方法会接收到传送值。
4 注册回调接口
简单来说就是给CallBackUtil传入一个CallBack对象。这个CallBack对象就是实现CallBack接口的数据接收页面。
@ContentView(R.layout.activity_test_call_back)
public class TestCallBackActivity extends AppCompatActivity implements CallBack {
@ViewInject(R.id.btn_start_service)
Button btn_start_service;
@ViewInject(R.id.tv_result)
TextView tv_result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this);
//注册监听
CallBackUtil.setCallBack(this);
}
@Event(value = {R.id.btn_start_service})
private void onClick(View view) {
switch (view.getId()) {
case R.id.btn_start_service:
startService(new Intent(TestCallBackActivity.this, SendService.class));
break;
}
}
/**
* @param message 接收到的消息
*/
@Override
public void transMessage(String message) {
tv_result.setText(message);
}
}
5 调用回调方法发送消息。
因为前面已经为CallBackUtil传入了CallBack对象,所以这里可以直接调用工具类中的方法,简洁调用CallBack方法传送消息了。
CallBackUtil.doCallBack("1");
调用过后,接收页面继承回调接口所实现的方法就会自动触发了。
Github传送门