Как вывести активность на передний план (или создать, если она не существует)? - PullRequest
5 голосов
/ 05 февраля 2011

Я перехватываю смс сообщения с некоторой информацией в них. Затем в моем SmsListener я создаю уведомление для отображения в строке состояния. Затем, когда пользователь нажимает на уведомление, я хочу

  1. Вывести MainActivity на передний план (если такого действия еще не существует, его следует создать)
  2. Передайте ему данные из смс
  3. Выполнить некоторые изменения пользовательского интерфейса на основе этих данных в этой основной деятельности

Моя деятельность определена как

    <activity
        android:name=".MainActivity"
        android:screenOrientation="sensor"
        android:label="@string/app_name"
        android:launchMode="singleTask"/>

Активность запускается как

 Intent i = new Intent();
 i.setClass(context, MainActivity.class);
 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 context.startActivity(i);

Также в своей деятельности я переопределил метод onNewActivity

 @Override
 public void onNewIntent(Intent intent){
    super.onNewIntent(intent);

    // I have data from broadcast in intent variable passed to this activity
    processDataFromBroadcast(intent);
}

Работает нормально, если MainActivity уже существует, но если MainActivity не существует, он запускается, но onNewIntent не вызывается

Затем я попытался вызвать processDataFromBroadcast из onCreate: processDataFromBroadcast(getIntent()). Первый раз данные правильно передаются из моей трансляции в активность. Однако если MainActivity отправляется в фоновый режим, а затем снова выводится на передний план, вызывается либо onCreate, либо onNewIntent, и снова выполняется processDataFromBroadcast с намерением, отправленным широковещательной передачей, и, таким образом, моя MainActivity обновляется данными из широковещательной передачи каждый раз, когда приложение выводит на передний план - последнее нежелательно, как я могу заставить свою деятельность забыть об этом намерении после первой обработки. Вот пример приложения.

Ответы [ 3 ]

5 голосов
/ 05 февраля 2011

Чтобы действие могло запустить только один его экземпляр, взгляните на элемент манифеста <activity> и, в частности, android:launchMode. Вы хотите настроить его на singleTask или singleInstance.

Чтобы передать данные в свою деятельность, вы добавляете данные в Intent, который вы используете для ее открытия. Чтобы передать данные с намерением, используйте методы putExtra() намерения перед его отправкой и методы getExtra() для их извлечения в процессе получения.

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

1 голос
/ 17 февраля 2012

, если ваша проблема все еще не решена, так как я только что столкнулся с той же проблемой, вот как я решил ее:

Я ставлю временную метку в качестве намерения в качестве дополнительного значения для намерения во время его создания. в первый раз я обрабатываю намерение в onCreate() или onNewIntent(). Я читаю intentId и сохраняю его как последнее обработанное намерение. поэтому в следующий раз при вызове onCreate() или onNewIntet() я могу проверить intentId, и если он равен id последнего обработанного намерения, я его игнорирую! Не знаю, поможет ли это в вашем случае, может быть, вы сможете это принять.

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

Я согласен, что можно ожидать, что вызов setIntent(new Intent()) в onNewIntent поможет.

0 голосов
/ 03 ноября 2014

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

Просто добавьте следующие строки кода:

Intent mIntent = new Intent(this, SplashActivity.class);
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // You need this if starting the activity from a service
mIntent.setAction(Intent.ACTION_MAIN);
mIntent.addCategory(Intent.CATEGORY_LAUNCHER);

Где SplashActivity - это имя исходного приложения, которое является первым экраном вашего приложения.

Надеюсь, это поможет. :)

...