Как я всегда могу запустить приложение в основной деятельности? - PullRequest
3 голосов
/ 24 ноября 2011

У меня есть 3 действия A, B и C. Что делает A, так это то, что он перенаправляет пользователя на действие B или C в соответствии со значением предпочтения (которое пользователь может переключать по своему усмотрению). Теперь моя проблема в том, чтобы это работало, тогда действие А должно быть первым действием, которое запускается КАЖДЫЙ раз, когда пользователь открывает мое приложение, в противном случае выбор не сделан.

Поэтому, если пользователь находится в действии B и нажимает кнопку «Домой», а затем открывает мое приложение, я хочу, чтобы приложение запускало действие A, а не B, как это обычно происходит.

Я попытался в файле манифеста установить android: clearTaskOnLaunch = "true" в действии A, но это не помогает. Он по-прежнему просто переходит непосредственно к действию B.

Я также читал, что, возможно, вызов метода finish () в onStop () в действии B и C может быть решением, но это плохо, поскольку вход в действие Preferences (через OptionsMenu в действии B и C) вызовет OnStop () на активности, закрывая тем самым действие, поэтому, когда я хочу вернуться из действия «Предпочтения» (нажав назад), мое приложение закрывается (так как и возвращаться некуда).

Я, конечно, мог бы сделать логическое значение и попытаться проверить, собираюсь ли я в действие Preference и вызывать метод finish (), только когда я туда не иду, но это вряд ли является правильным способом сделать это.

Есть идеи, как решить эту проблему?

Ответы [ 6 ]

3 голосов
/ 06 октября 2012

Используйте этот android: launchMode = "singleInstance" в файле манифеста внутри тех действий, которые вы хотите открыть только один раз. Если вы откроете это действие и затем нажмите кнопку «Домой», а затем снова откроете свое приложение, оно не возобновит ранее открытое вами действие. Это открывает родительскую активность. Действительно, это работает для меня, ребята, пока я создаю приложение для приемника вещания. Попробуй

3 голосов
/ 24 ноября 2011

Может быть, android:launchMode="singleInstance" на действиях B и C выполнят это?

0 голосов
/ 24 ноября 2011

В файле manifest вы должны установить свою основную активность следующим образом:

<activity android:name=".A">
    <intent-filter >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Это всегда должно открываться A при запуске приложения.Недостаточно просто установить атрибут clearTaskOnLaunch (я не совсем уверен, если он тоже правильный).

B и C должны быть определены следующим образом в вашем файле manifest:

<activity android:name=".B"> 
</activity>
<activity android:name=".C"> 
</activity>

Ни один из них не должен иметь те же атрибуты MAIN и LAUNCHER, что и A, поскольку они не являются первым действием, которое вы хотите показать.

0 голосов
/ 24 ноября 2011

Привязка и отмена привязки к услуге в B, C и действиях Preference 'onStart & onStop.

Регистрация и отмена регистрации BroadcastReceiever в B & C onStart & onStop.

В службеonDestroy, передайте пользовательское намерение вещания, для которого зарегистрированы B & C.Получив эту трансляцию, завершите действие.

Пока B, C или Preference Activity отображаются на экране, услуга привязана.Когда ни один из них не отображается на экране (пользователь нажимает кнопку «Домой» или (что важно) открывает другое приложение из панели уведомлений), служба не связывается и не уничтожается, вызывая широковещательное сообщение, которое завершает любые экземпляры B & C на задней панели.stack.

Так как onStart B вызывается перед onStop Preference (если нажать обратно с экрана Preference), служба остается активной и ничего не завершается.

0 голосов
/ 24 ноября 2011

Хотите ли вы закончить свою деятельность, нажав клавишу Home?Попробуйте добавить этот код в действия B и C:

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event)
 {
      if(keyCode == KeyEvent.KEYCODE_HOME)
      {
           finish();
           return true;
      }

      return super.onKeyDown(keyCode, event);
 }

РЕДАКТИРОВАТЬ: Вы также можете попытаться завершить () свои действия в методе onResume.Здесь вы можете закончить B или C и начать A ...

0 голосов
/ 24 ноября 2011

поместите этот код в метод onPause (переопределите его) в действии B

finish();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...