2012-06-15 2 views
0

Я застрял на пару часов по глупой проблеме.Запуск Android-активности

Мое приложение состоит из двух видов деятельности: A (мастер) и B. Существует также одна услуга S. «Обычный» стек задач - это AB и S работает в фоновом режиме.

Моя проблема возникает, когда я хотел бы непосредственно связаться с деятельностью B с уведомлением. Я должен построить стек задач для получения AB, чтобы сохранить поведение кнопки возврата по умолчанию. (Я хочу, чтобы пользователь мог вернуться к A).

Потому что я использую API 7, я не могу использовать массив намерений, как показано в учебнике разработчиков Android forroid http://developer.android.com/guide/topics/ui/notifiers/notifications.html. Таким образом, я решил добавить специальное действие (S.ACTION_CUSTOM) в намерение, отправленное уведомлением, чтобы отличить этот случай в onCreate() от деятельности A.

Цель, связанная с уведомлением, заявленным в сервис S:

Intent notificationIntent = new Intent(this, A.class); 
     notificationIntent.setAction(ACTION_CUSTOM); 

Сейчас в а, в конце метода OnCreate(), я добавляю:

if (S.ACTION_CUSTOM.equals(getIntent().getAction())) { 
     Intent intent = new Intent(this, B.class); 
     intent.setAction(S.ACTION_CUSTOM); 
     startActivity(intent); 
} 

Этот код работает, чтобы перейти непосредственно к B с уведомлением и уполномочить возвращение к A. Но один раз Я использую уведомление «shorcut», затем B достигается непосредственно, когда приложение запускается, даже из главного меню. Я пробовал много вещей, чтобы понять, что произойдет, но даже если я добавлю getIntent(). SetAction (ANYTHING) в конце инструкции if в A, поведение будет одинаковым.

Может ли кто-нибудь сказать мне, что происходит с моим кодом, пожалуйста? Morover Я открываю глаза другим способом, чтобы получить мои пожелания.

Спасибо.

Edit:

Часть манифеста XML:

<activity 
     android:name=".A" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
</activity> 
<activity 
     android:name=".B" 
     android:label="@string/app_name" > 
</activity> 

Но я думаю, что умысел фильтры не имеют ничего общего с моей проблемой.

+0

В случае открытия операции «Активность» из Уведомления * должна быть открыта кнопка «Назад». Действие А? Это не регулярный андроид «поток» - назад должен вернуться к предыдущему экрану – barry

+0

@barry, вы правы Я не выражал себя правильно Я не хочу регулярного потока андроида, потому что в моем случае уведомление а также будет удобнее, если кнопка возврата отобразит активность A. – FabiF

+0

опубликуйте свой манифест. xml –

ответ

1

С большим количеством тестов я нашел причину и решение.

Фактически, когда я сказал, что я перезапустил приложение из главного меню, это было неверно. Я переусердствовал с «недавней деятельности» (долгое нажатие на дом). Однако, похоже, что андроид в этом случае запускает приложение с последним намерением, которое его запускало. Так что он отлично работает из дома (потому что новое намерение с Intent.ACTION_MAIN - это огонь), но не из недавних действий, потому что намерение с тем же действием, что и раньше, срабатывает (ACTION_CUSTOM в моем случае) снова и снова.

Чтобы различать намерения от «недавней активности» и «уведомления», я использовал флаги. В случае последних действий в намерении есть флаг Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY.

Так я фиксируем мой код, добавить условие в, если заявление:

if (S.ACTION_CUSTOM.equals(getIntent().getAction()) && (getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) { 
     startActivity(getIntent().setClass(this, B.class)); 
} 

Мой реальный код является немного более сложным с 4 деятельности, а не 2, но все работает отлично, каждый вид деятельности передает намерение следующий. Стек хорошо построена, и когда пользователь запускает приложение из другого места, кроме уведомления, поведение по умолчанию сохраняется.

Надеюсь, что это поможет кому-то избежать потери времени, чтобы понять, почему намерения кажутся сумасшедшими.

Смежные вопросы