在给出解决方案之前,提出一个问题:Android开发中如何将父类的改变及时通知给子类?
好吧,开始抓耳挠腮,可算是找出了解决方案:
1、在子类内注册父类的监听器
2、通过广播接收者(BroadcastReciver)实现
3、通过子类父类共用一个handler,需要的时候通过handler发送message通知子类
4、父类持有子类的索引,调用子类的方法(该种实现方式基本是不可取的)
4、大神们的其他实现方式
当然,这些方式对于实现父类与子类的通讯都可以作为可选的实现方案,但是这些实现方式都或多或少的实现起来比较复杂。接下来给大家介绍一种最原始最简单的实现方案:通过子类复写父类的方法达到通讯的目的(灵感来自于Activity的生命周期函数)
在贴出实现方式之前,先说一下这种实现方式的应用场景:整个项目有一个BaseActivity,是整个项目所有Activity的基类。进行前后台切换时,需要检测用户状态和数据的改变(比如用户的权限状态),同时把这种状态通知给展示页面,并刷新展示页面的数据。
下面是具体实现:
父类:
import android.app.Activity;
import android.os.Bundle;
public class BaseActivity extends Activity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
/**
* 进行网络请求获取用户状态
*/
final String userData = "";
onChangeUserInfo(userData);
}
/**
* @Title: onChangeUserInfo
* @Description: 父类在用户状态发生改变时调用此方法,子类复写该方法实现父类与子类的通讯
* @param @param data 需要传递给子类的数据
* @return void
* @author york
*/
protected void onChangeUserInfo(final String data) {
}
}
子类:
import android.os.Bundle;
import android.view.Menu;
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* 复写父类BaseActivity的方法,父类通过这个方法通知子类用户状态发生改变,子类进行界面更新或者其它的操作
*/
@Override
protected void onChangeUserInfo(final String data) {
super.onChangeUserInfo(data);
/**
* 做用户状态改变的相关操作
*/
}
}
子类通过复写父类的onChangeUserInfo方法实现子类与父类的通讯