返回介绍

1.2 为 Activity 定义新的生命周期

发布于 2024-08-17 23:46:12 字数 2981 浏览 0 评论 0 收藏 0

学习过设计模式的人,应该对SOLID原则不陌生吧。其中有一条原则就是:单一职责。单一职责的定义是:一个类或方法,只做一件事情。

用这条原则来观察Activity中的onCreate方法,你会发现,这哥们儿怎么干那么多事啊,onCreate中的代码如下所示:

public class LoginActivity extends Activity implements View.OnClickListener {
  private int loginTimes;
  private EditText etPassword;
  private EditText etEmail;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    loginTimes = -1;
    Bundle bundle = getIntent().getExtras();
    String strEmail = bundle.getString(AppConstants.Email);
    etEmail = (EditText) findViewById(R.id.email);
    etEmail.setText(strEmail);
    etPassword = (EditText) findViewById(R.id.password);
    // 登录事件
    Button btnLogin = (Button) findViewById(R.id.sign_in_button);
    btnLogin.setOnClickListener(this);
    // 获取2个MobileAPI,获取天气数据,获取城市数据
    loadWeatherData();
    loadCityData();
  }

这段代码主要包括三部分逻辑:

·接收从其他页面传递过来的Intent参数。

·加载布局文件,并初始化页面的控件,为控件挂上点击事件方法。

·调用MobileAPI获取数据。

那我们为什么不把onCreate方法拆成三个子方法呢?如图1-5所示。

图1-5 onCreate方法下的三个子方法

对这些子方法介绍如下:

·initVariables:初始化变量,包括Intent带的数据和Activity内的变量。

·initViews:加载layout布局文件,初始化控件,为控件挂上事件方法。

·loadData:调用MobileAPI获取数据。

于是我们在AndroidLib这个类库的BaseActivity中,重写onCreate方法:

public abstract class BaseActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    initVariables();
    initViews(savedInstanceState);
    loadData();
  }
  protected abstract void initVariables();
  protected abstract void initViews(Bundle savedInstanceState);
  protected abstract void loadData();
}

同时这三个子方法,要声明为abstract的,从而要求所有子类必须实现这三个方法。

然后我们重写刚才那个Activity的实现,要让所有的Activity都继承自BaseActivity基类,如下所示:

public class LoginNewActivity extends BaseActivity 
    implements View.OnClickListener {
  private int loginTimes;
  private String strEmail;
  private EditText etPassword;
  private EditText etEmail;
  private Button btnLogin;
  @Override
  protected void initVariables() {
    loginTimes = -1;
    Bundle bundle = getIntent().getExtras();
    strEmail = bundle.getString(AppConstants.Email);
  }
  @Override
  protected void initViews(Bundle savedInstanceState) {
    setContentView(R.layout.activity_login);
    etEmail = (EditText)findViewById(R.id.email);
    etEmail.setText(strEmail);
    etPassword = (EditText)findViewById(R.id.password);
    // 登录事件
    btnLogin = (Button)findViewById(R.id.sign_in_button);
    btnLogin.setOnClickListener(this);
  }
  @Override
  protected void loadData() {
    // 获取2个MobileAPI,获取天气数据,获取城市数据
    loadWeatherData();
    loadCityData();
  }

对Activity生命周期重新定义是借鉴了JavaScript的做法。JavaScript因为是脚本语言,所以必须要细化每个方法,才能保证结构清晰,不至于写错变量和语法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文