2017-09-25 71 views
2

我在这我要检查身份验证需要先登录活动基地活动,既onCreateonResume中断super.onCreate()的超类

例如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服务器和我自己的)。

此代码有2个问题。
第一个问题是当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()并实现其所有的初始化。

+1

对不起,花了一些时间来验证它,本周我很忙。但它的作品! – Trace