onStart вызывается дважды без onStop между ними?

У меня уже есть видимая активность (поэтому onStart запущен), я опускаю панель уведомлений, нажимаю на уведомление, связанное с ожидающим намерением для указанной активности. 1) вызывается onPause. Обратите внимание, что onStop НЕ вызывается 2) onCreate для нового экземпляра действия вызывается, затем onStart и т. д.

Как было предложено, я пробовал singleTask и singleInstance, но они не предотвращают создание нового экземпляра после вызова onPause. Интересно, что это происходит только тогда, когда активность видна, и я нажимаю на ее уведомление. Если он уже был остановлен, Android использует старый экземпляр. Возможно, мне нужно настроить способ генерации PendingIntent...


person Creos    schedule 25.01.2015    source источник
comment
Ладно, внимательно расследуй и дай нам знать, что в итоге получится. Удачи.   -  person ZakiMak    schedule 25.01.2015
comment
У кого-то была аналогичная проблема stackoverflow.com/ вопросы/10104110/   -  person Creos    schedule 25.01.2015
comment
Это не имеет никакого смысла. Вы изначально запускали свое приложение с экрана установщика или непосредственно из IDE (Eclipse, IntelliJ, Android Studio)? Если это так, вы, вероятно, видите эту неприятную ошибку Android: stackoverflow.com/a/16447508/769265.   -  person David Wasser    schedule 26.01.2015


Ответы (1)


Я думаю, возможно, что в стеке создается новое действие, когда вы запускаете ожидающее намерение. Настройте свою активность так, чтобы она не создавала новую активность через режим запуска, для которого задано значение singleTask или singleInstance.

Вот пример настройки, которую я использовал для действия:

<activity
            android:name="com.zakimak.HomeScreenActivity"
            android:screenOrientation="portrait"
            android:label="@string/app_name"
            android:launchMode="singleTask" />

Затем построение отложенного намерения выглядит следующим образом:

    Intent resultIntent = new Intent(context, HomeScreenActivity.class);
    // The request code 24601  uniquely identifies the notification generated 
    // by the application. As an application may generate several having        
    //different codes to identify each. CAUTION: It's value should be greater than 0 
    //.i.e. RESULT_FIRST_USER+

    PendingIntent resultPendingIntent = PendingIntent.getActivity(context,
            24601, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    Notification notification = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.ic_launcher).setContentTitle("Title")
            .setContentText("Bla bla").setOngoing(true)
            .setTicker("Bla bla is running").setAutoCancel(false)
            .setContentIntent(resultPendingIntent).build();

Шаг 1: Я запускаю приложение и показываю HomeScreenActivity. Затем я перетаскиваю панель уведомлений и нажимаю на уведомление. Он открывает Activity и вызываются следующие методы обратного вызова: onPause, а затем onResume. onPause вызывается, потому что активность все еще может быть видна под ящиком.

Шаг 2: Я запускаю приложение и показываю HomeScreenActivity и нажимаю Home или запускаю другое действие, затем вызывается onStop. Затем я перетаскиваю панель уведомлений и нажимаю на уведомление. Он открывает действие, и вызываются следующие методы обратного вызова: onStart, а затем onResume.

В обоих случаях onCreate вызывается только один раз, когда Activity запускается для первой итерации. Проверено в эмуляторе.

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

person ZakiMak    schedule 25.01.2015
comment
большое спасибо, я обновил вопрос, похоже, не помогло. возможно, я делаю что-то глупое, не уверен... - person Creos; 25.01.2015
comment
Я предоставил вам обновление. Пожалуйста, проверьте обновленный ответ. - person ZakiMak; 25.01.2015
comment
что такое код 24601, как вы пришли к этому номеру? это должен быть какой-то частный код, который вы использовали для связи, а не часть констант API, просто любопытно, спасибо. - person Creos; 26.01.2015
comment
я сравнил ваше решение с моим, и единственная разница заключалась в том, что я передал 0, а вы передали 24601. Я попробовал сейчас 1, и это также работает. Я понятия не имею, почему это имеет значение, но это так. - person Creos; 26.01.2015
comment
Чтобы ответить на мой собственный вопрос, я считаю, что ответ заключается в константах, определенных в Activity.java. PendingIntent — это токен для вызова startActivity (и всех его вариантов), поэтому значение кодов должно быть одинаковым. Я приму ваш ответ, но не могли бы вы также добавить комментарий о том, что переданный код должен быть Activity.RESULT_USER и выше [продолжение] - person Creos; 26.01.2015
comment
Activity.java /** Стандартный результат действия: операция отменена. / public static final int RESULT_CANCELED = 0; /* Стандартный результат действия: операция выполнена успешно. / public static final int RESULT_OK = -1; /* Начало результатов пользовательской активности. */ public static final int RESULT_FIRST_USER = 1; - person Creos; 26.01.2015
comment
Я считаю, что это номер, личный для вашего собственного приложения, который однозначно идентифицирует уведомление из других уведомлений, которые может генерировать ваше приложение. Это requestCode и должен быть больше 0. - person ZakiMak; 26.01.2015
comment
да, так как 0 зарезервировано для отмены, которая убивает и перезапускает активность. Можете ли вы просто добавить это предупреждение для использования RESULT_FIRST_USER+), и я соглашусь. я думаю, что это ключевая часть решения, и многие могут не читать комментарии, спасибо - person Creos; 26.01.2015
comment
Вообще очень плохая идея использовать специальные режимы запуска singleTask и singleInstance. Они доставят вам больше проблем, чем решат. Если вы прибегаете к этому, это означает, что у вас есть проблема где-то еще, и это просто хак, чтобы обойти это. Вам нужно найти и устранить настоящую проблему, иначе потом у вас будет больше головной боли. - person David Wasser; 26.01.2015