Наряду с настройкой приложения с приемником BOOT и этот ответ для предотвращения расширения строки состояния, это решение работает в 4.4 и выше как полное приложение для киоска:
Место в вашем onCreate ():
final View view = (View) findViewById(android.R.id.content);
if (view != null) {
//"hides" back, home and return button on screen.
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_IMMERSIVE |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
View.SYSTEM_UI_FLAG_FULLSCREEN);
view.setOnSystemUiVisibilityChangeListener
(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
// Note that system bars will only be "visible" if none of the
// LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_IMMERSIVE |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
View.SYSTEM_UI_FLAG_FULLSCREEN);
}
}
});
}
Это полностью скроет кнопку «Назад», кнопку «Приложения» и «Главная».
Я думаю, что не совсем понимаю ваш вариант использования, но главное отличие между concatMap
и concat
состоит в том, что concatMap
принимает в качестве параметра функцию, которая вызывается для каждого элемента из его источника и которая возвращает внутренняя наблюдаемая (она отображает каждый элемент из своего источника в наблюдаемую). concatMap
затем вызывает свой обратный вызов только тогда, когда завершаются предыдущие внутренние Observables.
С другой стороны concat
просто принимает список наблюдаемых, которые подписываются на них один за другим, когда завершается предыдущая наблюдаемая.
Так что в вашем случае первый пример просто «отображает» FAKE_LOGIN_AUTHENTICATING
на FAKE_LOGIN_SUCCESS
.
Во втором примере внутренний блок эквивалентен этому:
concat(
of({ type: 'FAKE_LOGIN_AUTHENTICATING' }),
of({ type: 'FAKE_LOGIN_SUCCESS', payload: { userId: 'user-a', userData: {}}}).pipe(
delay(2000),
)
)
Таким образом, он сначала подписывается на of({ type: 'FAKE_LOGIN_AUTHENTICATING' })
, который генерирует и завершает немедленно, а затем подписывается на of({ type: 'FAKE_LOGIN_SUCCESS'...)
, который генерирует также затем завершает.