2017-09-25 23 views
2

は、私は、ログインする必要がすべての活動のためにonCreateonResumeの両方を認証をチェックしたいベース活性を有する割り込みsuper.onCreate()

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の場合、ホームのsetContentViewが設定されていないため、このメソッドが呼び出し元の子アクティビティ(この場合はHomeActivity)に戻ることは望ましくありません。
第二の問題は、実際の問題としてLoginActivityでログイン流れがあるようonActivityResultは(非同期的に呼び出されることである。

私は、基本クラスでの認証チェックを行うことができるよように私はこのコードを修正するにはどうすればよいです?オーバーライドから法に派生活動をfinal防止を宣言

@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 
    } 
} 

:のみ認証が成功したときのベースに

答えて

1

setContentViewを呼び出すために継続しながら、Activityはこのような何かを それ。

さらにActivityの抽象メソッドdoOnCreate()を作成し、それぞれがActivityをオーバーライドする必要があります。

Activityは、onCreate()を無効にする必要はありませんが、doOnCreate()を実装し、そこですべての初期化を実装してください。

+1

申し訳ありませんが、確認に時間がかかりました。今週はとても忙しかったです。しかし、それは動作します! – Trace