在超类中中断 super.onCreate()
Posted
技术标签:
【中文标题】在超类中中断 super.onCreate()【英文标题】:Interrupt super.onCreate() in super class 【发布时间】:2018-03-06 18:43:59 【问题描述】:我有一个基本 Activity,我想在其中检查所有需要登录的 Activity 的身份验证,包括 onCreate
和 onResume
:
例如 HomeActivity:
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
是一个单独的活动,用于管理登录流程(连接到 FB 服务器和我自己的)。
这段代码有两个问题。
第一个问题是当isAuthenticated
为false时,我不希望方法返回调用子Activity(本例中为HomeActivity
),因为不应该设置Home的setContentView。
第二个问题是onActivityResult
被异步调用(事实上LoginActivity
中的登录流程也是如此。
如何修复此代码,以便能够在基类中进行身份验证检查,同时仅在身份验证成功时继续调用setContentView
?
【问题讨论】:
【参考方案1】:在基础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()
并在那里实现其所有初始化。
【讨论】:
抱歉,我花了一些时间来验证它,这周我很忙。但它有效!以上是关于在超类中中断 super.onCreate()的主要内容,如果未能解决你的问题,请参考以下文章