Intereting Posts
Камера Android: разница между PictureCallback, ShutterCallback и PreviewCallback Проблема с использованием OpenCV2.3.1 с основной деятельностью Android Как отобразить представление списка в диалоговом окне Android Alert? Android GLSurfaceView с выдвижным фоном Использование GoogleApiClient из Push Notification IntentService для отправки данных на Android Wear Android youtube в webview Android – как конвертировать html в pdf? Фрагмент с RecyclerView: java.lang.IllegalArgumentException: обрывки или прикрепленные представления не могут быть переработаны. IsScrap: false isAttached: true Невозможно настроить плавающие кнопки действий, поскольку класс не может быть найден (Android Studio) Не удалось вызвать callback для twitter для twitter Использование SeekBar для управления объемом в Android? Пользовательский макет Android – onDraw () никогда не вызывается Избегайте диалога пользователя при подключении устройства BLE с использованием PIN-кода на последнем API (Lollipop) Записывать приложения на C или C ++ для Android? Инструмент Android Draw 9-patch: каково значение черных линий вне фигуры

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

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

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