Intereting Posts
Знайте, когда показывать блокировку паролей Стоимость повышения намерения в андроиде Java.lang.RuntimeException: Невозможно создать экземпляр активности ComponentInfo после обновления SDK ToDataURL не работает в браузерах для Android Запуск определенного действия при сканировании тега NFC Как добавить физическое Android-устройство в Visual Studio 2015 Preview Android Emulator не работает на Ubuntu после обновления Android Studio до версии 2.0 – не найдена библиотека Qt Android-Jenkins: не удалось найти версию Build Tools 17.0.0 На Jenkins Build Server Ошибка построения игрока: IOException: не удалось переместить файл Заполнение Logcat заставляет замораживать окна, пока не будет выполнена жесткая перезагрузка BaseGameUtils GoogleApiClient.ApiOptions не может быть разрешен для типа Xamarin, Android. Каждый раз, когда я запускаю приложение на устройстве, приложение не проверяется, а затем снова устанавливается. Закладка пунктов меню в панели действий sherlock SensorEventListener в отдельной теме Java.lang.IllegalStateException, что это значит?

Как перенести действие на передний план (или создать, если не существует)?

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

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

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

<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 обновляется данными из трансляции каждый раз, когда приложение выводит на передний план – Последнее нежелательно, как я могу заставить свою деятельность забыть это намерение после первой обработки. Вот пример приложения.

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

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

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

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

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

Чтобы сохранить намерение независимым от жизненных циклов жизненных циклов, вы можете сохранить его в userdefaults.

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

Он опоздал, но может быть полезно другим, кто ищет решение.

Просто добавьте строки ниже:

 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 – это имя исходного приложения, которое является первым экраном вашего приложения.

Надеюсь, поможет. 🙂