Используйте постоянное уведомление, чтобы позволить пользователю вернуться к запуску Android-приложения
-
01-10-2019 - |
Вопрос
Я разрабатываю приложение с многочисленными мероприятиями. Я хотел бы создать постоянное уведомление о том, что (более или менее) говорит: «appname - вернуться к appname», который будет присутствовать всякий раз, когда работает мой фоновые услуги. Создание и утилизация уведомления не было проблем.
Теперь пользователь может быть на любом из нескольких экранов / мероприятий, оставьте приложение, затем хочу повторно ввести приложение через уведомление. Проблема в, Уведомление должно быть намерение, которое запускает заранее определенная деятельность. Отказ Я хочу уведомление, чтобы повторно ввести приложение в какая какая активность находится в верхней части стека истории.
Моя первая попытка уродливого обходного пути заключалась в том, чтобы сделать деятельность (давайте назовемся «возвращаемся с единственной работой»), чья единственная работа должна была «закончить» сама в этом «онкреате». Уведомление откроет «returnFromnotify» в области истории приложений, которые затем немедленно удалили себя, отправляя пользователя обратно в состояние предыдущего истории в стеке приложений. Это, кажется, работает ... Если пользователь не использовал «назад», чтобы полностью отступить из приложения. Затем, когда они попали в уведомление, «Return Fromnotify» загружает, затем заканчивается, отправка их обратно на главный экран (так как в стеке истории нет никаких действий).
Я подумал, пытаясь обнаружить, было ли что-то в истории стека раньше «возвращается отраменности», а если нет, выстрелить мою основную деятельность. Я тоже не могу найти способ сделать это.
Любой ввод или предложения для новичка Java / Android? FYI, моя основная история - со сценарием языками.
Решение
Мне нравится ваша оригинальная идея создания активности «возвращаемой продукции» лучше, чем ваш предлагаемый обходной путь, как это является Можно обнаружить, если резовиактивность находится в нижней части стека (и, следовательно, единственная активность в стеке).
Вот как вы можете сделать это:
Добавьте свое восстановление на манифест и укажите ногистория атрибут:
<activity android:name=".ResumeActivity" android:noHistory="true" />
Указание Noyistory Убедитесь, что эта деятельность не останется в стеке, как только она заканчивается. Таким образом, вы знаете, что в стеке появится только a в настоящее время пример резовирования.
Чтобы проверить стек приложения, вам также придется запросить разрешение Get_Tasks:
<uses-permission android:name="android.permission.GET_TASKS" />
Теперь вы можете использовать ActivityManager :: GetrunningTasks () Чтобы определить, является ли RESOMACTIVE единственной активностью в стеке:
public class ResumeActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(isOnlyActivityInStack()) { //check the application stack
//This activity is the only activity in the application stack, so we need to launch the main activity
Intent main = new Intent(this, MainActivity.class);
main.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(main);
} else {
//Return the user to the last activity they had open
this.finish();
}
}
/**
* Checks the currently running tasks. If this activity is the base activity, we know it's the only activity in the stack
*
* @return boolean This activity is the only activity in the stack?
**/
private boolean isOnlyActivityInStack() {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
boolean onlyActivityInStack = false;
for(RunningTaskInfo tasks : manager.getRunningTasks(Integer.MAX_VALUE)) {
if(tasks.baseActivity.getPackageName().equals(this.getPackageName())) { //find this package's application stack
if(tasks.baseActivity.getClassName().equals(this.getClass().getName())) {
//If the ResumeActivity is the base activity, we know that it is the only activity in the stack
onlyActivityInStack = true;
break;
}
}
}
return onlyActivityInStack;
}
}
Я знаю, что вы задали этот вопрос более 2 лет назад, но я предоставляю этот ответ на случай, если кто-то еще бежит к этой конкретной ситуации (как я сделал). Я думаю, что вы были на правильном пути с решением, которое вы изначально работали.
Другие советы
Хорошо, я считаю, что я нашел удовлетворительную работу - вокруг Для моего конкретного случая. Отказ Я добавил статическое целое число для моей «основной активности», и каждый раз, когда он «Oncreate» уволен, он увеличивает целое число. Каждый раз, когда он «OnDestroy» уволен, он уменьшается.
В моем «returnFromnotify» я смотрю на статическое целое число, чтобы увидеть, больше ли он 0. Если это так, я предполагаю, что есть активная «основная активность», и что работает «отделка» внутри «RETENTROMNOTIFY». В противном случае он предполагает, что пользователи «подкреплены», заканчивается, затем использует «устаревность», чтобы выстрелить новый экземпляр «МИСУЗМАЛЬНОСТЬ».
Это не универсальное решение, но для моих целей, я думаю, что это будет достаточно. Я все еще открыт для других ответов, и если кто-то может ударить дыру в моей логике, пожалуйста, сделайте это - конструктивно Критика добро пожаловать. Отказ Спасибо.
Я думаю, что нет простого способа сделать это, но вместо добавления счетчика в основной активности, я бы продлился Заявление:
Базовый класс для тех, кому нужно поддерживать глобальное состояние приложений. Вы можете предоставить свою собственную реализацию, указав его имя в теге androidmanifest.xml, что приведет к созданию того, что этот класс будет создан для вас, когда создан процесс для вашего приложения / пакета.
Я бы сделал логику там и иметь метод, такой как:
public Intent getIntentForLastActivityShown();
Чтобы вызвать, когда элемент уведомления нажат.
Мой первый подход будет использовать SharedPreferences
и хранить пару ключ значение, называемую что-то вроде lastDisplayedActivity
. Отказ Затем в каждой деятельности onResume
(и, возможно, oncreate ') у вас будет такая строка:
sharedPreferences.edit().putInteger("lastDisplayedActivity", ReturnFromNotify.THIS_ACTIVITY_NAME);
Другими словами, вы храните накладную переменную, указывающую, какая активность была последней отображенной. Затем вы просто захватите эту переменную от SharedPreferences и запустите соответствующую деятельность.
Я обычно использую деятельность с именем «Launcher», которая проверяет состояние моего приложения модель и начинает деятельность (или делает другие вещи) в зависимости от моделей правил. я кладу Модель объект в моем классе приложений. Модель можно использовать Предпочтения хранить свое состояние. Я делаю это, чтобы избежать статических полей в деятельности.