Используйте постоянное уведомление, чтобы позволить пользователю вернуться к запуску Android-приложения

StackOverflow https://stackoverflow.com/questions/3568250

Вопрос

Я разрабатываю приложение с многочисленными мероприятиями. Я хотел бы создать постоянное уведомление о том, что (более или менее) говорит: «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», которая проверяет состояние моего приложения модель и начинает деятельность (или делает другие вещи) в зависимости от моделей правил. я кладу Модель объект в моем классе приложений. Модель можно использовать Предпочтения хранить свое состояние. Я делаю это, чтобы избежать статических полей в деятельности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top