在 super class 中中断 super.onCreate()
Interrupt super.onCreate() in super class
我有一个基础 Activity,我想在其中检查所有需要登录的活动的身份验证,onCreate
和 onResume
:
例如家Activity:
public class HomeActivity extends AccountRequiredActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
}
}
public class AccountRequiredActivity extends LifecycleActivity {
private final int INTENT_REQUEST_CODE = 1;
@Inject
ViewModelProvider.Factory viewModelFactory;
private AccountViewModel accountViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidInjection.inject(this);
accountViewModel = ViewModelProviders.of(this, viewModelFactory).get(AccountViewModel.class);
checkAuthentication();
}
@Override
protected void onResume() {
super.onResume();
checkAuthentication();
}
private void checkAuthentication() {
// Check if authenticated synchronously
if(!accountViewModel.isAuthenticated()) {
getLogin();
};
}
private void getLogin() {
Intent intent = new Intent(this, LoginActivity.class);
startActivityForResult(intent, INTENT_REQUEST_CODE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == INTENT_REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) {
// The login is ok, continue
} else {
getLogin();
}
}
}
}
LoginActivity
是一个单独的 activity,用于管理登录流程(连接到 FB 服务器和我自己的)。
此代码有 2 个问题。
第一个问题是,当 isAuthenticated
为 false 时,我不希望将方法 return 传递给调用子 Activity(在本例中为 HomeActivity
),因为 setContentView 的主页不应该设置。
第二个问题是 onActivityResult
被异步调用(事实上 LoginActivity
中的登录流程也是如此。
如何修复此代码,以便我能够在基础 class 中进行身份验证检查,同时仅在身份验证成功时继续调用 setContentView
?
在基地 Activity
做这样的事情:
@Override
protected final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Do your authentication stuff here
if (auth is successfull) {
// Call derived Activity's "doOnCreate()" to set content view, etc.
doOnCreate(savedInstanceState);
} else {
// Here you can do whatever you need to do in case the auth fails
}
}
声明方法 final
防止派生活动覆盖它。
还在基础 Activity
中创建一个抽象方法 doOnCreate()
,每个派生的 Activity
都需要覆盖它。
每个派生的 Activity
不应覆盖 onCreate()
,而应实现 doOnCreate()
并在那里实现其所有初始化。
我有一个基础 Activity,我想在其中检查所有需要登录的活动的身份验证,onCreate
和 onResume
:
例如家Activity:
public class HomeActivity extends AccountRequiredActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
}
}
public class AccountRequiredActivity extends LifecycleActivity {
private final int INTENT_REQUEST_CODE = 1;
@Inject
ViewModelProvider.Factory viewModelFactory;
private AccountViewModel accountViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidInjection.inject(this);
accountViewModel = ViewModelProviders.of(this, viewModelFactory).get(AccountViewModel.class);
checkAuthentication();
}
@Override
protected void onResume() {
super.onResume();
checkAuthentication();
}
private void checkAuthentication() {
// Check if authenticated synchronously
if(!accountViewModel.isAuthenticated()) {
getLogin();
};
}
private void getLogin() {
Intent intent = new Intent(this, LoginActivity.class);
startActivityForResult(intent, INTENT_REQUEST_CODE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == INTENT_REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) {
// The login is ok, continue
} else {
getLogin();
}
}
}
}
LoginActivity
是一个单独的 activity,用于管理登录流程(连接到 FB 服务器和我自己的)。
此代码有 2 个问题。
第一个问题是,当 isAuthenticated
为 false 时,我不希望将方法 return 传递给调用子 Activity(在本例中为 HomeActivity
),因为 setContentView 的主页不应该设置。
第二个问题是 onActivityResult
被异步调用(事实上 LoginActivity
中的登录流程也是如此。
如何修复此代码,以便我能够在基础 class 中进行身份验证检查,同时仅在身份验证成功时继续调用 setContentView
?
在基地 Activity
做这样的事情:
@Override
protected final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Do your authentication stuff here
if (auth is successfull) {
// Call derived Activity's "doOnCreate()" to set content view, etc.
doOnCreate(savedInstanceState);
} else {
// Here you can do whatever you need to do in case the auth fails
}
}
声明方法 final
防止派生活动覆盖它。
还在基础 Activity
中创建一个抽象方法 doOnCreate()
,每个派生的 Activity
都需要覆盖它。
每个派生的 Activity
不应覆盖 onCreate()
,而应实现 doOnCreate()
并在那里实现其所有初始化。