Android запускает системные настройки вместо моего приложения - PullRequest
17 голосов
/ 10 марта 2011

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

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

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

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

Я пробовал поискать в Google эту проблему, и все, что я мог найти, было что-то про 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

Ответы [ 4 ]

3 голосов
/ 18 марта 2011

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

1 голос
/ 15 марта 2011

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

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

0 голосов
/ 18 марта 2011

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 15 марта 2011

Мои 2 цента

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

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

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

android:launchMode="singleInstance"

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

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

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

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

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

...