Это решение не использует циклы, процедуры или временные таблицы. Подзапрос генерирует даты в течение последних тысяч дней и может быть расширен, чтобы идти как можно дальше или вперед по вашему желанию.
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 сек.
Кстати, это очень портативный метод, который работает с большинством баз данных с небольшими корректировками.
Этого можно добиться, установив атрибут android:noHistory
в "true"
в соответствующих записях <activity>
в файле AndroidManifest.xml
. Например:
<activity
android:name=".AnyActivity"
android:noHistory="true" />
Попробуйте:
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)
Просто вызовите this.finish (), прежде чем startActivity (намерение), вот так-
Intent intent = new Intent(ActivityOne.this, ActivityTwo.class);
this.finish();
startActivity(intent);
для 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);
Это безумие, что никто не упомянул это элегантное решение. Это должен быть принятый ответ.
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
. Это рекомендуемое решение, и его следует принять.
Просто установите noHistory="true"
в файле Manifest . Это делает деятельность удаляемой из backstack.
В манифесте вы можете добавить:
android:noHistory="true"
<activity
android:name=".ActivityName"
android:noHistory="true" />
Вы также можете позвонить
finish()
сразу после вызова startActivity (..)
Я использую этот способ.
Intent i = new Intent(MyOldActivity.this, MyNewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);
Один из способов, который работает до 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
.
ActivitySplashScreenSignUp
и история изменений не сбрасывается.
Единственный реальный способ обойти это в API 11:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
Это, вероятно, не идеальный способ сделать это. Если у кого-то есть лучший способ, я буду с нетерпением ждать его реализации. Вот как я выполнил эту конкретную задачу с 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();
Тогда действия не в стеке!
Помните, ребята, что вы можете начать действие, а затем начать убирать за ним , выполнение не следует ни за одним (пользовательским) потоком.
Да, взгляните на Intent.FLAG_ACTIVITY_NO_HISTORY .
Вы можете использовать переадресацию, чтобы удалить предыдущее действие из стека действий при запуске следующего. Пример этого есть в APIDemos , но в основном все, что вы делаете - это звоните finish()
сразу после вызова startActivity()
.
Я знаю, что опоздал на это (прошло два года с тех пор, как был задан вопрос), но я достиг этого, перехватив нажатие кнопки «назад». Вместо того, чтобы проверять конкретные действия, я просто смотрю на счетчик, и если он меньше 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();
}
}
Уже слишком поздно, но надеюсь, что это поможет. Большинство ответов не указывают в правильном направлении. Для такой вещи есть два простых флага.
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.