2013-02-20 4 views
4

У меня возникла интересная проблема, когда Activity создается несколько раз, даже если она определена как singleTask или singleelInstance Activity в манифесте. Вот как это можно воспроизвести. Скажем, в основной деятельности:android singleinstance activity not single if back button нажато

@Override 
protected void onResume() { 
    Intent i = new Intent(MainActivity.class, SingleActivity.class); 
    startActivity(i); 
} 

в моем SingleActivity, у меня есть:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    Log.i("SingleActivity", "onCreate " + System.identityHashCode(this)); 
    ... 
} 

и в манифесте, у меня есть:

<activity android:name=".SingleActivity" 
       android:launchMode="singleInstance" 
    /> 

теперь, если я запустить приложение , все выглядит нормально, ожидайте в одном случае: если я нажму кнопку «назад», тогда как SingleActivity находится впереди, он переместится обратно на MainActivity, где MainActivity.onResume() создаст еще SingleActivity вместо того, чтобы выдвинуть тот, который уже существует. это то, что я знаю, потому что в журнале отображается другой хэш-код идентификатора.

То же самое верно, если режим запуска singleTask.

Единственным обходным решением является переопределение onBackPressed(), но это кажется уродливым решением.

Интересно, что я делаю неправильно

+0

Здравствуйте, сделал мой ответ помог? Любая обратная связь? –

+0

да, это помогло, спасибо :) –

+0

Тогда вы должны проголосовать за ответ, который решил вашу проблему, вот как работает Stackoverflow! –

ответ

3

По умолчанию, нажав кнопку Назад отделки (расщепляет) текущую деятельность и отображает предыдущую активность по отношению к пользователю.

Таким образом, это невозможно

вместо выдвигая тот, который уже существует

, потому что никакая деятельность не существует.

+1

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

+0

это происходит со мной –

3

Это проблема taskAffinity. Поскольку вы не указали taskAffinity в манифесте либо на своем MainActivity, либо на вашем SingleActivity, эти 2 действия имеют одинаковые (по умолчанию) taskAffinity. Когда вы начинаете свою деятельность, Android проверяет taskAffinity активности, которую вы хотите запустить. Если это то же самое, что и taskAffinity корневой активности в вашей задаче, то это будет игнорировать launchMode="singleInstance" или launchMode="singleTask" (поскольку для этих режимов запуска потребуется Android для создания новой задачи для запуска этой операции) и начать работу в текущая задача.

К сожалению, это плохо документировано, но taskAffinity имеет приоритет над launchMode.

Если вы действительно хотите заниматься (что обычно неправильно делать, потому что оно приносит с собой целый беспорядок других неприятных вещей, которые вы, вероятно, ошибаетесь), тогда вам нужно убедиться что ваш singleInstance или singleTask деятельности имеет следующий манифест в <activity> определении:

android:taskAffinity="" 

Если вам нужна дополнительная информация, поиск StackOverflow или Google для «launchmode taskaffinity»

+1

Если все действия закончены, задача будет уничтожена, поэтому при повторном запуске этого действия она будет воссоздавать активность, даже если в активности указан флаг 'singleInstance'. – Autobots

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

  • Нет связанных вопросов^_^