子activity是否必须重写oncreate(),如果不是必须的话,子activity默认调用该方法的原理是什么。
父类Activity:
public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener {
protected Context mContext;
private ConnectivityManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);// 锁定竖屏
mContext = getActivityContext();
initView();
ButterKnife.bind(this);
initdata();
MyApplication.getInstance().addActivity(this);
}
/**
* 初始activity方法
*/
private void initView() {
loadViewLayout();
}
private void initdata(){
findViewById();
setListener();
processLogic();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
// StatService.onPause(mContext);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
// StatService.onResume(mContext);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
MyApplication.getInstance().finishActivity(this);
}
/**
* 加载页面layout
*/
protected abstract void loadViewLayout();
/**
* 加载页面元素
*/
protected abstract void findViewById();
/**
* 设置各种事件的监听器
*/
protected abstract void setListener();
/**
* 业务逻辑处理,主要与后端交互
*/
protected abstract void processLogic();
/**
* Activity.this
*/
protected abstract Context getActivityContext();
子类 Activity:
public class WelcomeActivity extends BaseActivity {
@Override
protected void loadViewLayout() {
setContentView(R.layout.activity_welcome);
}
@Override
protected void findViewById() {
}
@Override
protected void setListener() {
}
@Override
protected void processLogic() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startActivity(new Intent(WelcomeActivity.this,HomeTabActivity.class));
finish();
}
}, 2000);
}
@Override
protected Context getActivityContext() {
return this;
}
@Override
public void onClick(View view) {
}
}
객체 지향에서 하위 클래스는 상위 클래스의 동작 속성을 상속하므로 하위 클래스는 onCreate(...) 함수를 재정의할 필요가 없습니다.
존경하는 마음을 담아 두 권의 좋은 책을 추천하고 싶습니다.
O'Reilly: Head First Java(Java5.0을 다루는 중국어 버전 2판)
Java 프로그래밍 생각(4판)(Thinking in Java)
공유하신 소스 코드에 따르면 oncrate는 상위 클래스인 BaseActivity에서 추상화되지 않으므로 당연히 호출할 필요가 없지만 하위 클래스에서도 이를 다시 작성할 수 있습니다. 기본적으로 이 메서드의 원리는 더욱 간단합니다.
Java 가상 머신이 프로그램을 실행하면 부모 클래스가 먼저 실행되므로 처음에는 부모 클래스의 Oncreate 메서드가 실행되고 그 다음에는 하위 클래스의 추상 메소드는 상위 클래스에서 실행되지 않으므로 하위 클래스가 실행될 때 이러한 메소드가 실행됩니다.