Удаление активности из стека истории

Это решение не использует циклы, процедуры или временные таблицы. Подзапрос генерирует даты в течение последних тысяч дней и может быть расширен, чтобы идти как можно дальше или вперед по вашему желанию.

select a.Date 
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) a
where a.Date between '2010-01-20' and '2010-01-24' 

Выход:

Date
----------
2010-01-24
2010-01-23
2010-01-22
2010-01-21
2010-01-20

Примечания к производительности

Тестирование здесь , производительность на удивление хороша: вышеупомянутый запрос занимает 0,0009 сек.

Если мы расширим подзапрос, чтобы создать ок. 100000 номеров (и, следовательно, даты дат 274 года), он работает в 0,0458 сек.

Кстати, это очень портативный метод, который работает с большинством баз данных с небольшими корректировками.

Пример SQL Fiddle, возвращающий 1000 дней

366
задан MiguelHincapieC 18 September 2015 в 22:03
поделиться

14 ответов

Этого можно добиться, установив атрибут android:noHistory в "true" в соответствующих записях <activity> в файле AndroidManifest.xml. Например:

<activity
    android:name=".AnyActivity"
    android:noHistory="true" />
610
ответ дан Riot Goes Woof 18 September 2015 в 22:03
поделиться

Попробуйте:

intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)

это API Уровень 1, проверьте ссылку .

-7
ответ дан Alécio Carvalho 18 September 2015 в 22:03
поделиться

Просто вызовите this.finish (), прежде чем startActivity (намерение), вот так-

       Intent intent = new Intent(ActivityOne.this, ActivityTwo.class);
        this.finish();
        startActivity(intent);
1
ответ дан 18 September 2015 в 22:03
поделиться

для API> = 15 для API 23 другое решение не работает в моем случае. наконец я понял это.

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);
3
ответ дан Kamal Bunkar 18 September 2015 в 22:03
поделиться

Это безумие, что никто не упомянул это элегантное решение. Это должен быть принятый ответ.

SplashActivity -> AuthActivity -> DashActivity

if (!sessionManager.isLoggedIn()) {
    Intent intent = new Intent(context, AuthActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    context.startActivity(intent);
    finish();
} else {
   Intent intent = new Intent(context, DashActivity.class);
   context.startActivity(intent);
    finish();
}

Ключевым моментом здесь является использование intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); для посредника Activity. После разрыва этого среднего звена DashActivity будет первым и последним в стеке.

android:noHistory="true" - плохое решение, так как оно вызывает проблемы, когда полагается на Activity в качестве обратного вызова, например onActivityResult. Это рекомендуемое решение, и его следует принять.

4
ответ дан Rowland Mtetezi 18 September 2015 в 22:03
поделиться

Просто установите noHistory="true" в файле Manifest . Это делает деятельность удаляемой из backstack.

6
ответ дан Remees M Syde 18 September 2015 в 22:03
поделиться

В манифесте вы можете добавить:

android:noHistory="true"

<activity
android:name=".ActivityName"
android:noHistory="true" />

Вы также можете позвонить

finish()

сразу после вызова startActivity (..)

6
ответ дан Anubhav 18 September 2015 в 22:03
поделиться

Я использую этот способ.

Intent i = new Intent(MyOldActivity.this, MyNewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);
17
ответ дан Smiderle 18 September 2015 в 22:03
поделиться

Один из способов, который работает до API 11, - это сначала запустить ActivityGameMain, затем в onCreate этого действия начать свою ActivitySplashScreen деятельность. ActivityGameMain не появится, так как вы вызываете startActivity слишком рано для всплеска.

Затем вы можете очистить стек при запуске ActivityGameMain, установив эти флаги в Intent:

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

Вы также должны добавить это в ActivitySplashScreen:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

Так что, если вы нажмете на это действие, это не вернется к вашему ActivityGameMain.

Я полагаю, что вы не хотите, чтобы экран-заставка возвращался обратно, для достижения этого я предлагаю установить noHistory в вашем AndroidManifest.xml. Затем поместите код goBackPressed в свой класс ActivitySplashScreenSignUp.

1120 Однако я нашел несколько способов сломать это. Запустите другое приложение из уведомления, пока отображается ActivitySplashScreenSignUp и история изменений не сбрасывается.

Единственный реальный способ обойти это в API 11:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
21
ответ дан mxcl 18 September 2015 в 22:03
поделиться

Это, вероятно, не идеальный способ сделать это. Если у кого-то есть лучший способ, я буду с нетерпением ждать его реализации. Вот как я выполнил эту конкретную задачу с SDK до версии 11.

в каждом классе, который вы хотите убрать, когда наступит ясное время, вам нужно сделать следующее:

    ... interesting code stuff ...
    Intent i = new Intent(MyActivityThatNeedsToGo.this, NextActivity.class);
    startActivityForResult(i, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == R.string.unwind_stack_result_id) {
        this.setResult(R.string.unwind_stack_result_id);
        this.finish();
    }
}

затем нужно просто вызвать тот, которому нужно отключить цепочку попсов из стека. это когда вы хотите инициировать его:

NextActivity.this.setResult(R.string.unwind_stack_result_id);
NextActivity.this.finish();

Тогда действия не в стеке!
Помните, ребята, что вы можете начать действие, а затем начать убирать за ним , выполнение не следует ни за одним (пользовательским) потоком.

23
ответ дан Travis 18 September 2015 в 22:03
поделиться

Да, взгляните на Intent.FLAG_ACTIVITY_NO_HISTORY .

50
ответ дан Matthias 18 September 2015 в 22:03
поделиться

Вы можете использовать переадресацию, чтобы удалить предыдущее действие из стека действий при запуске следующего. Пример этого есть в APIDemos , но в основном все, что вы делаете - это звоните finish() сразу после вызова startActivity().

135
ответ дан Giovanni Cappellotto 18 September 2015 в 22:03
поделиться

Я знаю, что опоздал на это (прошло два года с тех пор, как был задан вопрос), но я достиг этого, перехватив нажатие кнопки «назад». Вместо того, чтобы проверять конкретные действия, я просто смотрю на счетчик, и если он меньше 3, он просто отправляет приложение обратно (приостанавливает приложение и возвращает пользователя к тому, что было запущено перед запуском). Я проверяю менее трех, потому что у меня только один вводный экран. Кроме того, я проверяю счет, потому что мое приложение позволяет пользователю переходить обратно на домашний экран через меню, поэтому это позволяет ему выполнять резервное копирование через другие экраны, как обычно, если в стеке есть действия, отличные от вступительного экрана.

//We want the home screen to behave like the bottom of the activity stack so we do not return to the initial screen
//unless the application has been killed. Users can toggle the session mode with a menu item at all other times.
@Override
public void onBackPressed() {
    //Check the activity stack and see if it's more than two deep (initial screen and home screen)
    //If it's more than two deep, then let the app proccess the press
    ActivityManager am = (ActivityManager)this.getSystemService(Activity.ACTIVITY_SERVICE);
    List<RunningTaskInfo> tasks = am.getRunningTasks(3); //3 because we have to give it something. This is an arbitrary number
    int activityCount = tasks.get(0).numActivities;

    if (activityCount < 3)
    {
        moveTaskToBack(true);
    }
    else
    {
        super.onBackPressed();
    }
}
8
ответ дан alphonzo79 18 September 2015 в 22:03
поделиться

Уже слишком поздно, но надеюсь, что это поможет. Большинство ответов не указывают в правильном направлении. Для такой вещи есть два простых флага.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

Из документов Android:

public static final int FLAG_ACTIVITY_CLEAR_TASK Добавлено в API уровня 11

If set in an Intent passed to Context.startActivity(), this flag will cause any existing task that would be associated with the

действие, которое необходимо очистить перед началом действия. Таким образом, действие становится новым корнем в противном случае пустой задачи, и все старые действия завершаются. Это можно использовать только в сочетании с FLAG_ACTIVITY_NEW_TASK.

3
ответ дан Nouman Ghaffar 18 September 2015 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: