2016-03-25 11 views
1

私はフラグメントでナビゲーション・ドロワ・アクティビティを持つアプリケーションを作成しています。 AndroidはonCreate()でactivityを停止してからsuper.OnCreate()を呼び出す前に

  • 改修にサービス
  • を登録する(ユーザーがログインされているかどうか)

    • ユーザーセッション:アプリのすべてのコールドスタート時、私は次のことをロードするいくつかの初期化コードを実行しています
    • サーバーのデータを取得して、アプリケーションの起動を続行します。

      • MainActivityを開始し、ユーザーセッションを検証:

      この

    • は、コールドスタートをしている私のアプリの流れです。
    • セッションが有効な場合は、CoreActivityを開きます。
    • そうでない場合は、LoginActivityを開きます。

    Androidが何らかの非アクティブな状態でフォアグラウンドになると、Androidは現在のアクティビティを再試行します。つまり、私の初期化コードがバイパスされ、CoreActivity.onCreate()が実行されます。

    すべての私の活動(MainActivityを除く)は、次のスーパーの活動を拡大している。CrmContextで

    public abstract class MasterActivity extends AppCompatActivity { 
    
    @Override 
    protected final void onCreate(Bundle savedInstanceState) { 
        this.supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
        if (!CrmContext.getInstance().verifyContextSet(this)) { 
         return; 
        } 
        super.onCreate(savedInstanceState); 
        onCreateAfterContext(savedInstanceState); 
    } 
    

    verifyContextSet()

    public boolean verifyContextSet(final Context context) { 
        boolean isContextSet = applicationContext != null; 
        if (isContextSet) { 
         return true; 
        } 
        Intent intent = new Intent(context, MainActivity.class); 
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        context.startActivity(intent); 
        return false; 
    } 
    

    私はそれを確認するためにいくつかのチェックをしていますアプリが正しく読み込まれました。ユーザーセッションが正しくロードされていない場合

    私の問題:アプリが前面に表示され

    場合CoreActivity.onCreate()が実行され、verifyContextSet() falseを返しています。この場合、CoreActivityの作成をキャンセルし、MainActivityをもう一度開きます。

    私はsuper.onCreate()前に私のverifyContextSet()を行うと、その後、私はこの例外を取得:

    android.util.SuperNotCalledException: Activity {nl.realworks.crm/nl.realworks.crm.view.CoreActivity} did not call through to super.onCreate() 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2287) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391) 
                       at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309) 
    

    私が最初super.onCreate()を実行しようとしましたが、その後の活動の内部Fragmentが最初に作成されます。つまり、verifyContextSet()が実行される前にFragmentが再作成されたことを意味します。私はと呼ばれてきたsuper.onCreate()cancel()/finish()onCreate()にしようと

    そう、私はSuperNotCalledExceptionを取得します。最初にsuper.onCreate()を実行した場合、がfalseを返したときに許可されないFragmentが初期化されます。

    私は次の操作を実行したい:

    • フォアグラウンド
    • チェックするためにアプリをもたらすない場合はアプリが
    • を初期化されている場合、その後、finish()現在の活動と、その後にアプリを再起動しますMainActivityを開きます。
    +0

    私は物事をより明確にするために私の質問を調整しました。 – com2ghz

    答えて

    0

    私は、コードはオールウェイズ最初の行としてその

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        // Your code 
    
    } 
    

    super.onCreate(savedInstanceState)のようになるはずだと思います。

    +0

    これを行うと、super.onCreate()は 'verifyContextSet()'が実行される前にフラグメントを再開/初期化しようとします – com2ghz

    +0

    @MikeM。アプリの前に開かれた前の断片はバックグラウンドに行きました。私はフラグメントがロードされる前にチェックをしたいので、コードは無関係だと思います。 – com2ghz

    +0

    小切手をApplication.onCreate()に移動しましたが、実行を中断できません。前回のアクティビティを再開しようとしています – com2ghz

    0

    Applicationサブクラスのコード今

    public class MyApp extends Application { 
    //in your oncreate create sessions etc. 
    

    MainActivity再起動するかどうかを検証する/あなたのチェックを入れて、あなたはすでに検証されています。

    注:Applicationクラス 'onCreate()は、どのボディよりも前に実行するファーです。

    +0

    私はこれを試しましたが、以前に開いたアクティビティを継続し続けています。最後のアクティビティが再開されないようにするにはどうすればよいですか? – com2ghz

    関連する問題