Android: флаг истории не учитывается

Вот сценарий:

  1. Пользователь использует активность #1, чтобы запланировать тревогу (с помощью Android AlarmManager сервис), и возвращается к начальному экрану. Деятельность № 1 остается в стеке.

  2. AlarmReciever"s onReceived() называется как запланировано:

    @Override
    public void onReceive(Context context, Intent intent){
    
       Intent intent = new Intent(context ,Activity2.class);
    
    intent.setFlags(
            Intent.FLAG_ACTIVITY_NEW_TASK |
            Intent.FLAG_ACTIVITY_NO_HISTORY
                    );
    
    context.startActivity(intent);
    }
    
  3. Занятие № 2 (Activity2) запускается успешно.

    public class Activity2 extends Activity {
      @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        setContentView(R.layout.activity_layout_2);
    
        getWindow().addFlags(
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                        WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                        WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
                        WindowManager.LayoutParams.FLAG_FULLSCREEN
        );
    
    }
    
    @Override
    protected void onResume() {
        super.onResume();
    
        findViewById(R.id.dismiss_button).setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        finish();
    
                    }
                }
        );
    
    }
    

    }

  4. Пользователь нажимает кнопку (R.id.dismiss_button) чтобы finish() Занятие 2.

  5. Система возвращается на домашний экран, как и ожидалось, но действие № 2 остается в стеке (оно появляется, когда пользователь нажимает кнопку "Недавние")

Обратите внимание, что в дополнение к настройке Intent.FLAG_ACTIVITY_NO_HISTORY флаг для намерения, флаг также был указан в AndroidManifest.xml (и я попробовал также каждый из них по отдельности):

   <activity
        android:name=".Activity2"
        android:label="@string/app_name"
        android:configChanges="orientation|keyboardHidden"
        android:launchMode= "singleInstance"
        android:noHistory="true"
        >
    </activity>

Также флаг Intent.FLAG_ACTIVITY_NEW_TASK требуется, так как действие № 2 запускается из AlarmReceiver а не другой вид деятельности.

1 ответ

Флаг NO_HISTORY просто предотвращает это Activity от появления в стеке задач, как только Activity больше не видно В вашем случае, если вы должны были нажать HOME, когда Activity2 отображается, вы увидите, что Android звонит finish() а также onDestroy() на этой активности сразу (что не является обычным поведением, когда задача ставится в фоновом режиме).

Чтобы делать то, что вы хотите, вам нужно добавить

    android:excludeFromRecents="true"

в декларацию для вашего Activity, Это говорит Android не ставить вашу задачу в список недавних задач.

Другие вопросы по тегам