2017-09-25 73 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