Android: ошибка в launchMode = “однозадачный”?-> стопка действия, не сохраненная

Мой основной вид деятельности A как установил android:launchMode="singleTask" в декларации. Теперь, каждый раз, когда я запускаю другое действие оттуда, например. B и нажмите HOME BUTTON по телефону возвратиться к главному экрану и с другой стороны вернуться к моему приложению, или через нажатие кнопки приложения или через нажатие HOME BUTTONдолго для показа моих новых приложений это не сохраняет мою стопку действия и возвращается прямо к A вместо ожидаемого действия B.

Здесь эти два поведения:

Expected: A > B > HOME > B
Actual: A > B > HOME > A (bad!)

Существует ли установка, которую я пропускаю, или действительно ли это - ошибка? Если последний, существует ли обходное решение для этого, пока ошибка не исправлена?

К вашему сведению: Этот вопрос был уже обсужден здесь. Однако не кажется, что существует любое действительное решение этого, все же.

63
задан znq 10 March 2010 в 14:12
поделиться

4 ответа

Если и A, и B принадлежат одному Приложению , попробуйте удалить

android:launchMode="singleTask"

из своих Действия и test, потому что я думаю, что поведение по умолчанию - это то, что вы описали, как ожидалось.

1
ответ дан 24 November 2019 в 16:28
поделиться

Стефан, ты когда-нибудь нашел ответ на это? Я собрал для этого тестовый пример и наблюдаю такое же (вызывающее недоумение) поведение ... Я вставлю приведенный ниже код на случай, если кто-нибудь придет и увидит что-то очевидное:

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example" >

  <uses-sdk android:minSdkVersion="3"/>

  <application android:icon="@drawable/icon" android:label="testSingleTask">

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

    <activity android:name=".ActivityB"/>

  </application>
</manifest>

ActivityA.java:

public class ActivityA extends Activity implements View.OnClickListener
{
  @Override
  public void onCreate( Bundle savedInstanceState )
  {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.main );
    View button = findViewById( R.id.tacos );
    button.setOnClickListener( this );
  }

  public void onClick( View view )
  {
    //Intent i = new Intent( this, ActivityB.class );
    Intent i = new Intent();
    i.setComponent( new ComponentName( this, ActivityB.class ) );
    startActivity( i );
  }
}

ActivityB.java:

public class ActivityB extends Activity
{
  @Override
  public void onCreate( Bundle savedInstanceState )
  {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.layout_b );
  }
}

Я безуспешно пытался изменить minSdkVersion. Это просто кажется ошибкой, по крайней мере, согласно документации , в которой говорится следующее:

Как отмечалось выше, никогда не бывает более одного экземпляра действия «singleTask» или «singleInstance», поэтому ожидается, что этот экземпляр будет обрабатывать все новые намерения. Действие «singleInstance» всегда находится на вершине стека (поскольку это единственное действие в задаче), поэтому оно всегда в состоянии обработать намерение. Однако действие "singleTask" может иметь или не иметь другие действия в стеке над ним. Если это так, значит, он не в состоянии обработать намерение, и намерение отбрасывается. (Даже если намерение отброшено, его прибытие заставило бы задачу выйти на передний план, где она и останется.)

5
ответ дан 24 November 2019 в 16:28
поделиться

Это не ошибка. Когда существующая singleTask активность запускается, все другие активности над ней в стеке будут уничтожены.

Когда вы нажимаете HOME и снова запускаете активность, ActivityManger вызывает намерение

{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]flag=FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_RESET_IF_NEEDED cmp=A}

Таким образом, результат будет A > B > HOME > A.

Это отличается, когда режим запуска A - "Стандартный". Задача, содержащая A, выйдет на передний план и сохранит состояние, как и раньше.

Вы можете создать "стандартную" активность, например, C в качестве запускающей и startActivity(A) в методе onCreate для C

ИЛИ

Просто удалите launchMode="singleTask" и установите FLAG_ACTIVITY_CLEAR_TOP|FLAG_ACTIVITY_SINGLE_TOP флаг при каждом вызове намерения для A

.
41
ответ дан 24 November 2019 в 16:28
поделиться

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

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

0
ответ дан 24 November 2019 в 16:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: