2015-01-21 2 views
0

Каков стандартный способ достижения чего-то вроде ниже?Backstack и стандартные методы входа в приложение для Android

Диаграмма ниже себя пояснительную

В SplashActivity, проверить, есть ли пользователь вошел в систему, используя базу данных, если это получить детали и идти прямо к MainActivity

if (App.getAccountData().isSomeoneSignedIn()) { 
    // then skip everything and go to Home Screen, dont need to send any user info, home screen picks up directly from appData 
    Log.i("XXX", "Found an User, email = " + App.getAccountData().getEmail() + " .Going straight to home"); 
    Intent intent = new Intent(this, MainActivity_.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
    finish(); 
} 

Когда Я иду из Splash -> Signin, я хочу сохранить Splash в backstack, однако, когда я иду из Signin -> Main, я хочу удалить все и сохранить только Main в стеке, так что нажатие кнопки «Назад» приносит пользователю для Android.

Similary, в потоке регистрации, я хочу, Android Home.

Как я могу это достичь?

+----------SplashActivity-----+          
    |        |          
    | Sign In   Sign Up <----------------------+    
    | +       |      |    
    +---------------------------+-+      |    
     |      |      |    
     |      |      |    
     |    +------+------------+   |    
    +----+-----+   |     |   |    
    |   |   | RegisterEmailPwdActivity  |    
    | Get email, pwd  |     |   |    
    |   |   |     |Back does usual   
    | SignInActivity  |     |   |    
    |   |   |     |   |    
    |   |   +-----+-------------+   |    
    |   |    |       |    
    |   |   +----v----------+---+   |    
    +--+-------+   | ExtraInfo1Activity|   |    
     |     |     | Back does usual   
     |     |     |   |    
     |     |     |   |    
     |     +----+--------------+   |    
     |      |       |    
     |     +----v----------+---+   |    
     |     | ExtraInfo2Activity|Back disabled    
     |     |     |   |    
     |     +----+--------------+   |    
     |      |       |    
Should clear full stack here |       |    
    +---------------------------v-----------+    |    
    |          |    |    
    |          |    |    
    |    Main Activity  Logout------------+    
    |   Back should minimize   |  Logout takes to splash 
    +---------------------------------------+        
+0

Какова минимальная версия SDK, которую вы используете? – neonDion

+0

minSdkVersion 15 - Я рад изменить его при необходимости – dowjones123

+0

Я обычно делаю чек в «MainActivity».onResume', и используя 'finish' в' LoginActivity', чтобы закрыть его. Таким образом, никогда не было ничего до MainActivity в стеке. – njzk2

ответ

2

Когда я иду от Всплеск -> для входа в аккаунт, я хочу, чтобы поплескаться в backstack, однако, когда я иду от входа в аккаунт -> Main, я хочу, чтобы удалить все и держать только в Main стек, так что нажатие кнопки «Назад» приводит пользователя в Android Home.

При переходе от SignInActivity к MainActivity вы можете установить флаги намерений для достижения желаемого результата. Ниже приведен пример метода, который устанавливает FLAG_ACTIVITY_CLEAR_TASK и FLAG_ACTIVITY_NEW_TASK.

private void startMainActivity() { 
     Intent intent = new Intent(mContext, MainActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     startActivity(intent); 
    } 

Similary, в потоке Signup, я хочу, чтобы сохранить backstack Шифрование до ExtraInfo2, но в ExtraInfo2 -> Main, я хочу, чтобы удалить всю backstack так, что при нажатии кнопки Назад приносит пользователю (который входит в систему Android Home.

Это будет работать аналогичным образом. Когда вы переходите из ExtraInfoActivity1 в ExtraInfoActivity2, установите флаги, как они были установлены в примере выше.

Сделайте то же самое при переходе с ExtraInfoActivity2 на MainActivity. Затем, когда нажимается назад от MainActivity, пользователь переходит к главному экрану.

Еще один совет - использовать функцию оболочки adb для проверки того, какие действия в данный момент находятся в задней части (и вы можете видеть, в какой задаче они находятся). Для этого подключите устройство к компьютеру, запустите приложение, откройте терминал, затем войдите в оболочку adb и выполните команду dumpsys activity. Много текста будет сгенерирован, но некоторые из них будут выглядеть следующим образом:

Stack #1: 
Task id #193 
    TaskRecord{432f8570 #193 A=com.activitybackstacktester U=0 sz=1} 
    Intent { flg=0x10008000 cmp=com.activitybackstacktester/.MainActivity } 
    Hist #0: ActivityRecord{42f2a090 u0 com.activitybackstacktester/.MainActivity t193} 
     Intent { flg=0x10008000 cmp=com.activitybackstacktester/.MainActivity } 
     ProcessRecord{431267b8 32667:com.activitybackstacktester/u0a156} 
Running activities (most recent first): 
    TaskRecord{432f8570 #193 A=com.activitybackstacktester U=0 sz=1} 
    Run #0: ActivityRecord{42f2a090 u0 com.activitybackstacktester/.MainActivity t193} 

Этот вывод говорит о том, что в задаче стека # 1, есть одна активность в стеке и его имя MainActivity. Если вы запустите эту команду, когда SignInActivity находится на переднем плане, вы увидите, что в стеке есть задача LoginActivity и SignInActivity. Это отличный способ проверить, что backstack содержит только те действия, которые вы им намереваетесь.

Смежные вопросы