#android #android-activity
#Android #android-активность
Вопрос:
Я заметил странное поведение моего приложения. Всякий раз, когда я нажимаю кнопку «Домой», мое приложение отключается. Я не вижу приложение в стеке приложений. Я могу видеть другие приложения, которые были запущены ранее. Изначально я сомневался насчет android:launchMode="singleInstance"
поэтому я изменил его на android:launchMode="singleTop"
, но это все еще не работает. Вот мой файл манифеста целиком.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.my.finder.android.core"
android:installLocation="auto">
<application
android:name=".AndroidApplication"
android:allowBackup="false"
tools:replace="android:allowBackup"
android:icon="@mipmap/icon"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/Theme.MYTheme">
<activity
android:name=".Popup"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:process=":Popup"/>
<activity
android:name=".SignInActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:taskAffinity=":extratask"
android:theme="@style/Theme.NoTitle">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<!-- intent-filter for Optimizely -->
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="@string/optimizely_scheme"/>
</intent-filter>
<!-- this is the click_action of the push message (once kiln will support it, AFMI-13756) -->
<intent-filter>
<action android:name="OPEN_MAP_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".FinderMapActivity"
android:launchMode="singleTop"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:windowSoftInputMode="adjustPan">
</activity>
<activity
android:name=".LandingScreenActivity"
android:configChanges="keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:theme="@style/Theme.NoTitle">
</activity>
<activity
android:name=".fragment.SurveyFragmentActivity"
android:configChanges="keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:theme="@style/Theme.NoTitle">
</activity>
<activity
android:name=".SignupWelcomeActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:theme="@style/Theme.NoTitle"
android:windowSoftInputMode="adjustResize">
</activity>
<activity
android:name=".CreateAccountActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:theme="@style/Theme.NoTitle"
android:windowSoftInputMode="adjustResize">
</activity>
<activity
android:name=".AddAssetsActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:theme="@style/Theme.NoTitle"
android:windowSoftInputMode="adjustResize|stateHidden">
</activity>
<activity
android:name=".InviteCodeActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:theme="@style/Theme.NoTitle"
android:windowSoftInputMode="adjustResize">
</activity>
<activity
android:name=".IPhoneProvisioningActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:windowSoftInputMode="adjustResize">
</activity>
<activity
android:name=".ImproveLocationActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".CorporateLiableActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:theme="@style/Theme.NoTitle">
</activity>
<activity
android:name=".HistoryScreen"
android:configChanges="orientation|keyboardHidden"
android:launchMode="singleTop"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait"/>
<activity
android:name=".HistoryDetailScreen"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".ScheduleScreen"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".CreateScheduleScreen"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".activities.ScheduleCheckNotificationSettingsActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".ForgotPasswordActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:theme="@style/Theme.NoTitle">
</activity>
<activity
android:name=".SettingsActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".WebviewDialog"
android:configChanges="orientation|keyboardHidden|screenSize"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="termsofservice"/>
</intent-filter>
</activity>
<activity
android:name=".PlaceScreen"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".PlaceDetailScreen"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".CreatePlaceActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".ChangePasswordActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize">
</activity>
<activity
android:name=".MyFamilyActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".ManageFamilyMemberActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".AddFamilyMemberActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".AddFamilyMembersActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".CancelServiceActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".CancelServiceFeedbackActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".DebugActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:launchMode="singleTop"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".signup.ContractActivity"
android:screenOrientation="portrait"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:theme="@style/Theme.NoTitle"
android:windowSoftInputMode="adjustResize">
</activity>
<activity
android:name=".OnboardingProgressActivity"
android:screenOrientation="portrait"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:theme="@style/Theme.NoTitle"
android:windowSoftInputMode="adjustResize">
</activity>
<activity android:name=".activities.PaywallActivity"
android:permission="com.my.permission.INTERNAL_ACTIVITES"
android:screenOrientation="portrait">
</activity>
</application>
</manifest>
У меня заканчиваются идеи для отладки. Пожалуйста, предложите, как устранить эту проблему.
Правка 1: вот строки журнала с момента, когда я нажимаю кнопку «Домой»:
10-22 10:54:27.352 6836-6923 E/Surface: getSlotFromBufferLocked: unknown buffer: 0x91dd4440
10-22 10:54:28.256 6836-7766 D/FA: Application backgrounded. Logging engagement
10-22 10:54:28.258 6836-7766 D/FA: Event not sent since app measurement is disabled
Обратите внимание, что возникает ошибка unknown buffer: 0x91dd4440
Я не уверен, что это за ошибка.
Правка2: Я попытался поместить инструкцию log в метод onPause()
and onDestroy()
. Я вижу onPause()
инструкции журнала, но не вижу onDestroy()
инструкции журнала. Это действительно странно, потому что, когда я проверяю стек приложений, я не вижу своего приложения. Когда я пытаюсь нажать кнопку «Назад», чтобы перейти к моему приложению, его там нет.
Решение Я просто помещаю здесь решение Ахмеда, чтобы читателю не приходилось прокручивать до конца. В моей основной конфигурации activity этот флаг включен android:excludeFromRecents="true"
, что приводило к тому, что приложение не отображалось в стеке приложений, когда пользователь переходил к другому приложению. Как только я установил этот флаг на false
( android:excludeFromRecents="false"
), он снова начал работать. Вот описание этого флага из документации Android:
Следует ли исключить задачу, инициированную этим действием, из списка недавно использованных приложений, на экране обзора. То есть, когда это действие является корневым действием новой задачи, этот атрибут определяет, не должна ли задача отображаться в списке последних приложений. Установите «true», если задача должна быть исключена из списка; установите «false», если она должна быть включена. Значение по умолчанию равно «false».
Комментарии:
1. Пожалуйста, объясните в терминах программирования, что означает «мое приложение будет убито». Или, пожалуйста, объясните, как именно вы определяете, что «мое приложение отключается».
2. Поделитесь своим сообщением об ошибке в logcat
3. @CommonsWare Когда я проверяю стек приложений, приложения там нет. Но я вижу другое приложение, которое было запущено ранее.
4. Вероятно, у вас ошибка в вашем методе
onPause
илиonDestroy
. Отправьте нам свой журнал ошибок.5. Проверьте свой манифест на наличие
android:noHistory
атрибутов и свой Java-код наFLAG_ACTIVITY_NO_HISTORY
использование.
Ответ №1:
Что ж, убедитесь, что у вас нет этого
<activity.... android:label=""/>
для вашей основной деятельности.
Вы установили его android:label="@string/app_name"
, попробуйте установить его как
android:label="MyApp"
Также,
Убедитесь, что у вас есть действие с этим
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
Вы можете попробовать установить это на
android:excludeFromRecents="false"
вместо true.
Комментарии:
1. мое приложение следует тем же правилам, которые вы указали выше. Но я все еще вижу тот же результат.
2. Я не могу найти android: label в вашем манифесте выше даже с помощью ctrl f
3. в моем приложении метка не используется для действия. Оно используется только для приложения. Вы хотите, чтобы я включил его для всех действий?
4. Теперь оно работает. Спасибо, Ахмед. Я не знал, что этот флаг вызывает эту проблему. Это имеет смысл после прочтения описания этого флага.
5. Я рад это слышать, отметьте как ответ, пожалуйста
Ответ №2:
Поделитесь дополнительной информацией. Тем временем, дважды проверьте, не настроено ли ваше устройство на отключение ваших приложений во время отпуска (Settings > Developer Settings > (Apps tab) > Don't keep activities)
.
Комментарии:
1. Я проверял этот параметр ранее, и он определенно не включен.