在超类中中断 super.onCreate()

Posted

技术标签:

【中文标题】在超类中中断 super.onCreate()【英文标题】:Interrupt super.onCreate() in super class 【发布时间】:2018-03-06 18:43:59 【问题描述】:

我有一个基本 Activity,我想在其中检查所有需要登录的 Activity 的身份验证,包括 onCreateonResume

例如 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()的主要内容,如果未能解决你的问题,请参考以下文章

方法“转换”未在超类中定义

在超类中定义泛型类型,它指的是它所在的子类的类型

在超类中使用描述符以避免子类中的代码重复

在 Python 的超类中调用超类方法

Java学习笔记--继承和多态(下)

Java学习笔记--继承和多态(上)