Android запускает системные настройки вместо моего приложения

По какой-то причине, когда я (пытаюсь) запускать свое приложение, телефон решает запустить системные настройки вместо моего «основного действия». И да, я имею в виду «настройки системы Android», а не что-то из своего приложения.

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

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

Приложение прослушивает VIEW-действие для определенной подстроки URL, и когда я запускаю приложение с использованием соответствующего URL-адреса, я получаю тот же результат, что и при запуске его из Eclipse, запускает приложение, но когда я возвращаюсь, я возвращаюсь к настройкам.

Я пробовал поиск по этой проблеме, и все, что я мог найти, это что-то вроде состояния сохранения Android, когда приложение убивается, но без какой-либо информации о том, как сбросить это состояние. Я попытался удалить приложение, убить системные настройки, перезагрузить телефон, переустановить, очистить данные приложения .. не повезло ..

Для чего это стоит, вот определение моей основной деятельности из манифеста,

<activity android:name=".HomeActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:clearTaskOnLaunch="true" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"></action> <category android:name="android.intent.category.DEFAULT"></category> <category android:name="android.intent.category.BROWSABLE"></category> <data android:pathPrefix="/isak-web-mobile/smart/" android:scheme="http" android:host="*"></data> </intent-filter> </activity> 

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

 I/ActivityManager( 1301): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=se.opencare.isak/.HomeActivity } 

Когда я запускаю из Eclipse, я также получаю эту строку (как и следовало ожидать),

 I/ActivityManager( 1301): Start proc se.opencare.isak for activity se.opencare.isak/.HomeActivity: pid=23068 uid=10163 gids={3003, 1007, 1015} 

Если это имеет значение, телефон HTC Desire Z работает под управлением 2.2.1.

В настоящее время это моя HomeActivity,

 public class HomeActivity extends Activity { public static final String TAG = "HomeActivity"; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, "onActivityResult(" + requestCode + ", " + resultCode + ", " + data + ")"); super.onActivityResult(requestCode, resultCode, data); } @Override protected void onCreate(Bundle savedInstanceState) { Log.d(TAG, "onCreate(" + savedInstanceState + ")"); super.onCreate(savedInstanceState); } @Override protected void onDestroy() { Log.d(TAG, "onDestroy()"); super.onDestroy(); } @Override protected void onPause() { Log.d(TAG, "onPause()"); super.onPause(); } @Override protected void onPostCreate(Bundle savedInstanceState) { Log.d(TAG, "onPostCreate(" + savedInstanceState + ")"); super.onPostCreate(savedInstanceState); } @Override protected void onPostResume() { Log.d(TAG, "onPostResume()"); super.onPostResume(); } @Override protected void onRestart() { Log.d(TAG, "onRestart()"); super.onRestart(); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { Log.d(TAG, "onRestoreInstanceState(" + savedInstanceState + ")"); super.onRestoreInstanceState(savedInstanceState); } @Override protected void onResume() { Log.d(TAG, "onResume()"); super.onResume(); } @Override protected void onStart() { Log.d(TAG, "onStart()"); super.onStart(); } @Override protected void onStop() { Log.d(TAG, "onStop()"); super.onStop(); } @Override protected void onUserLeaveHint() { Log.d(TAG, "onUserLeaveHint()"); super.onUserLeaveHint(); } } 

Ничто (из выше) не записывается в журнал.

После прочтения ответа Бланделла я попытался изменить параметры launchMode / clearTaskOnLaunch со следующими результатами:

  • Ситуация A – я удаляю launchMode и clearTaskOnLaunch: та же проблема, что и раньше
  • Ситуация B – я удаляю clearTaskOnLaunch и держит launchMode = "singleInstance": еще одна проблема
    • Открытое приложение – My HomeActivity показывает
    • Нажмите на кнопку, чтобы открыть другую активность в моем приложении – она ​​открывается, как она должна
    • Нажмите кнопку системы – она ​​вернет меня к системным настройкам
    • Нажмите снова кнопку системы – я вернусь к своей HomeActivity
    • Еще один щелчок на задней кнопке возвращает меня на главный экран Android
  • Ситуация C – я удаляю только launchMode и сохраняет clearTaskOnLaunch: та же проблема, что и раньше
  • Sitatuion D – я удаляю clearTaskOnLaunch и устанавливаю launchMode = "singleInstance": то же, что и ситуация B

Вы не вызываете setContentView () из HomeActivity (в соответствии с добавленным вами кодом). А когда его нет, разные устройства ведут себя по-другому, например, на эмуляторе вы увидите «Приложение, не установленное на вашем телефоне». Попробуйте настроить просмотр содержимого.

Я тестировал это на своем телефоне, но, похоже, это работает правильно … Что делать, если вы пытаетесь создать новый проект, а затем просто скопируете код? Это сработало для меня, возможно, это сработает для вас …

Я подозреваю, что это имеет какое-то отношение к изменению версии Eclipse, которое может использовать некоторые другие настройки из ранее использованной вами версии, поэтому рендеринг вашей первоначальной настройки бесполезен …

Мои 2Центы

Вы можете посмотреть активность запуска приложения.

В принципе, я думаю, что это может произойти, ваше приложение запускается в том же «Stack», что и в настройках, поэтому ОС будет вызывать настройки на экране, а затем загружать вашу активность поверх этого стека.

Вы можете попробовать добавить:

 android:launchMode="singleInstance" 

В тэг <activity /> вашего файла манифеста. Это запустит новый стек для вашего приложения и только ваше приложение

Это может решить проблему, но может возникнуть другая причина, и это может вызвать неблагоприятные последствия в зависимости от того, как работает ваше приложение. Взгляните на документацию для дальнейшей информации: Android: LaunchMode

РЕДАКТИРОВАТЬ

Чтение вашего манифеста, почему бы просто не удалить android:launchMode="singleTop" и позволить ему запускаться со значением по умолчанию?

Также вы android:clearTaskOnLaunch это с: android:clearTaskOnLaunch , потому что ОС имеет активность настроек и свою активность как одну и ту же задачу, это может очистить ее до «корневой» активности, которая является настройками, а не вашим приложением. Есть ли причина, по которой у вас это есть, удалить его и повторить попытку?

Обратите внимание, что я не разработчик Android, но у меня есть телефон Android и думаю, что эта проблема довольно интересная.

Подводя итог тому, что я прочитал об этой проблеме до сих пор, он ищет, что следующая причина может быть основной причиной этой проблемы:

  • Вы используете clearTaskOnLaunch, который уничтожает все намерения / действия / задачи / whatever_buzzword_is_used_for_this, когда ваше приложение запускается.
  • После этого Android, похоже, постоянно запоминает последнее состояние приложения в некотором (то, что я сейчас вызываю) глобальную внутреннюю базу данных состояния (GISD для краткости), которую нельзя легко стереть (по крайней мере, не при удалении приложения, перезагрузке, и т.д.).
  • Android пытается открыть приложение с последним состоянием. Если текущая активность отсутствует, эта информация берется из GISD, поэтому в вашем случае это «системные настройки».
  • Нет способа (или неизвестно, как) стереть состояние, хранящееся в GISD. (Ваш вопрос, как это сделать.)

Если это правда, это, безусловно, проблема с телефоном, основная ошибка в Android, так как тогда вы, возможно, кирпичные приложения! Все, что вам нужно сделать, это следующее:

  • Как-то спровоцировать аналогичную вещь, как clearTaskOnLaunch – что должно быть возможно – для приложения, которое вы хотите кирпича.
  • Попробуйте приложение для запуска в другое приложение, например «Системные настройки» – многие приложения делают это, чтобы включить Wi-Fi или аналогичные, но я думаю, что некоторые умные люди (читай: не я) найдут способ сделать это практически для любого приложения
  • Теперь убейте приложение в этом состоянии.

Android запомнит это состояние в GISD, и если вы попытаетесь запустить приложение с главного экрана, это не сработает в будущем. Ницца.

Однако даже при отсутствии исправления, надеюсь, можно вернуть приложение так же:

  • Запустите приложение с помощью Activity, который запускается. Как вы пишете, это работает для вас.
  • Примените то, что делает clearTaskOnLaunch. (Я действительно не знаю, как, но вы, как разработчик Android, вероятно, знаете).
  • Пусть ваше приложение запускает третье приложение, так что это третье приложение становится глобальным.
  • Убейте приложение.

Возможно, время и последовательность важны, поэтому, возможно, вам придется покинуть третье приложение после того, как ваше приложение будет убито, возможно, вам нужно в любой момент вытащить аккумулятор вашего телефона, возможно, вам придется использовать некоторые странные вещи АБР, чтобы предотвратить ваш телефон Делайте правильные вещи, возможно, вам нужна еще одна последовательность действий или чего-то еще не хватает, что бы вы ни выяснили, как спровоцировать ваш тип ошибки, может быть сложно, но благодаря вашему нахождению мы знаем, что есть такая вещь.

Если вы можете заставить Android запустить третье приложение с главного экрана вместо вашего приложения, это подтвердит, что вы действительно можете исправить эту проблему. Если это не сработает, значит, нельзя запретить Android вызывать системные настройки вместо вашего приложения, тогда у Android наверняка есть большая проблема, так как, скорее всего, кто-то найдет способ навсегда закрыть приложения на всех этих драгоценных телефонах там ( Ab) с использованием этой ошибки.

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

  • Запустите приложение.
  • Это запустит третье приложение.
  • Примените то, что делает clearTaskOnLaunch.
  • Пусть третье приложение запустит основной экран вашего приложения (или что угодно)
  • Убейте третье приложение (и, возможно, ваше приложение).

Теперь глобальное состояние активности снова будет возвращено в ваше приложение – если все будет хорошо, третье приложение также не пострадает.

Заметьте, что я не уверен, что это действительно можно сделать, поскольку я не могу проверить это сам. И, сказав, что все, я согласен с тем, что нам, безусловно, нужен лучший способ устранить эту проблему!

Но интересно было бы посмотреть, что произойдет, если ваше приложение имеет состояние третьего приложения, а третье приложение имеет состояние вашего приложения. Это приводит к бесконечной петле?

Интересно также, что произойдет, если вы удалите третье приложение. Это очищает автоматический запуск в этом приложении или не дает вам беспомощного?

Должен сказать, что это Android Phone onwer (только), это довольно приятный беспорядок, который вы нашли. Вот почему мне очень интересно, если есть исправление, так как выполнение сброса на завод не может считаться решением. Читайте: это не только проблема с разработчиками, но и для пользователей Android.

PS: Пожалуйста, прости меня, мой плохой английский, длина этого сообщения, а не использование правильных Buzzwords и публикация на вопрос, который я не эксперт, так что мой ответ немного OT. Однако я делаю это с HTH.