Подтвердить что ты не робот

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

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

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

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

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

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

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

<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
4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

My 2Cents

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

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

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

android:launchMode="singleInstance"

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

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

ИЗМЕНИТЬ

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

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

Ответ 4

Обратите внимание, что я не разработчик 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 (только), я должен сказать, что довольно приятный беспорядок, который вы нашли. И поэтому мне очень интересно, если есть исправление, так как выполнение factory reset не может считаться решением. Читайте: Это не только проблема разработчика, но и для пользователей Android.

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