在 super class 中中断 super.onCreate()

Interrupt super.onCreate() in super class

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

例如家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() 并在那里实现其所有初始化。