2016-08-28 3 views
0

初めて実行するかどうかを確認するにはアプリが必要です。初めての場合は、MainActivityの代わりにLoginActivityを起動する必要があります。最初の実行でない場合は、いつものようにMainActivityと表示されます。アプリケーションが最初の実行時にMainActivityの代わりにログインアクティビティを起動する

私はSharedPreferenceの値を使用して利用可能かどうかを確認してから、アプリはその最初の実行ではなく実行を決定します。

これは私がこれまで試したものです

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     //set default values into settings 
     PreferenceManager.setDefaultValues(this, R.xml.preferences, false); 

     //check if app is running on its first run 
     SharedPreferences fRun = getPreferences(MODE_PRIVATE); 

     if(fRun.getBoolean("firstrun", true)){ 

      SharedPreferences.Editor editX=fRun.edit(); 
      editX.putBoolean("firstrun", false); 
      editX.apply(); 

      //login activity stuff here 
      //goto login screen 

      Intent loginIntent=new Intent(getApplicationContext(),LoginActivity.class); 
      startActivity(loginIntent); 

      //finish(); 

     } else { 
      setContentView(R.layout.activity_main); 
     } 
    } 
} 

私の問題は、私は私のアプリを実行すると、それが突然クラッシュし

はなぜアプリがクラッシュしますメッセージに表示される、ありますか?それは私のLoginActivityのコードがエラーまたはdiを持っているからです。最初にMainActivityをロードしてからLoginActivityを呼び出す必要がありますか?

+0

アプリがクラッシュしたときに、ログをここに投稿すると、どこに問題があるのか​​が分かりやすくなります – Ashish

+0

"superContentView(R.layout.activity_main);"は "super.onCreate(savedInstanceState ); " if-elseからそれを取得しようとします。 – MorZa

+0

@MorZaのように、 'if'の外にレイアウトを設定してください:' LoginActivity'を終了すると、空の 'MainActivity'に戻ります。このユースケースのパターンは、アプリケーションを透明な 'RedirectActivity'で起動し、必要なアクティビティ(あなたの場合は' MainActivity'または 'LoginActivity'のいずれか)にリダイレクトするだけです。 –

答えて

1

Activityクラスを少し並べ替える必要があります。あなたのアプリケーションが初めて実行されたかどうかを判断し、この決定に基づいてActivityを起動するのは非常に簡単です。私は以下のアーキテクチャを提案したいと思います。

LauncherActivityを設定して、LoginActivityまたはMainActivityをこのように開始する必要があるかどうかを判断できます。

public class LauncherActivity extends Activity { 

    private boolean firstLaunch = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Intent i; 

     SharedPreferences pref = getSharedPreferences(Constants.ApplicationTag, MODE_PRIVATE); 
     firstLaunch = pref.getBoolean(Constants.FIRST_LAUNCH, true); 

     if (firstLaunch) { 
      i = new Intent(LauncherActivity.this, LoginActivity.class); 
      startActivity(i); 
     } else { 
      i = new Intent(LauncherActivity.this, MainActivity.class); 
      startActivity(i); 
     } 

     finish(); 
    } 
} 

あなたは、私が誤っているelse文の中setContentViewを呼び出している整理する必要がある別の問題を抱えています。 Activityのいずれかにsuper.onCreate(savedInstanceState);の直後にsetContentViewを置く必要があります。

elseステートメント内に配置すると、コンテンツビューが設定されず、アプリケーションがクラッシュすることがあります。

最初の実行のチェックをMainActivityから削除し、その部分をLauncherActivityに移動すると問題が解決されます。

LauncherActivityAndroidManifest.xmlはランチャーactivtyとしてLoginActivityを使用することができ、この

<activity 
    android:name=".Activities.LauncherActivity" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme.NoActionBar"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 

     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 
2

のように見えることがあります。ユーザーがログインしているかどうかを確認します(はいの場合はMainActivityを開始します)。

のAndroidManifest.xml:

<activity 
      android:name=".LoginActivity" 
      android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 

    <activity android:name=".MainActivity"/> 

そしてLoginActivity:

public class LoginActivity extends ActionBarActivity { 
private static final String LOGIN_KEY = "LOGIN_KEY"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    SharedPreferences pref = getPreferences(Context.MODE_PRIVATE); 
    if (pref.getBoolean(LOGIN_KEY, false)) { 
     //has login 
     startActivity(new Intent(this, MainActivity.class)); 
     //must finish this activity (the login activity will not be shown when click back in main activity) 
     finish(); 
    } else { 
     //mark login 
     pref.edit().putBoolean(LOGIN_KEY, true).apply(); 

     //do something 
    } 
} 

}

MainActivity:

public class MainActivity extends ActionBarActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //do something 
} 

}

これはあなたを助けるかもしれません。

関連する問題