2012-10-30 2 views
0

У меня есть TestActivity. Эта деятельность будет начата с основного мероприятия по прессе Button. Так моя тестовая активность объявлена ​​в файле манифеста.Ориентация Изменение результатов в экземпляре экземпляра активности

<activity 
     android:name="com.example.MyTestActivity" 
     android:configChanges="keyboard|keyboardHidden" 
     android:label="MYTESTACtivity" 
     android:theme="@style/someTheme" 
     android:windowSoftInputMode="stateHidden|adjustPan" > 
    </activity> 

Теперь проблема, как только экран TestActivity показан, если я делаю изменение ориентации, то отсчёт экземпляр TestActivity увеличивается на 1. Если я снова изменить его в портретном режиме, она увеличивается на 1 более. Вот как подсчет экземпляра продолжает расти во время изменений ориентации.

Просьба проконсультироваться, как сделать только один экземпляр деятельности за раз, независимо от того, какие изменения ориентации. Также я попытался добавить android:launchMode="SingleTop" еще одна проблема. FYI. Вот как я могу найти счетчик экземпляров со строгим режимом.

01-02 01:39:48.855: E/StrictMode(21992): android.os.StrictMode$InstanceCountViolation: class com.example.MyTestActivity; instances=20; limit=1 
+0

попробуйте с android: launchMode = "singleInstance" – Ajay

+0

android: singleInstance не рекомендуется использовать, поэтому не может его использовать. – Guna

+0

У вас есть утечка контекста? Возможно, вы держитесь за ссылку на что-то в своей деятельности в другом месте приложения, которое предотвращает сбор предыдущих мусорных файлов. – Simon

ответ

0

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

+0

Также, чтобы добавить к ответу Саймона, я думаю, что есть проблема с кодом строгого режима. Я вызвал System.gc() в onDestroy() из моей активности и повторно запустил один и тот же вариант использования, теперь максимальное количество его получения до 6 или около того, и если я дам немного времени активности, показанное в строгом режиме log даже падает до 2, я знаю, что нам не нужно вызывать System.gc() из нашей активности, но просто попытался выяснить, действительно ли это была утечка памяти в моей активности. Таким образом, этот режим строгого режима показывает более слабые ссылки на но после выполнения задания «Сборщик мусора» строгий режим отображает фактическое количество операций. – Guna

-2

По умолчанию, когда ориентация экрана меняется во время выполнения (пользователь вращает устройство), активность выключается и перезапускается. Чтобы предотвратить это, добавьте следующее к вашему манифесту.

android:configChanges="keyboardHidden|orientation"

Так ваш манифест будет выглядит следующим образом.

<activity 
    android:name="com.example.MyTestActivity" 
    android:configChanges="keyboard|keyboardHidden" 
    android:label="MYTESTACtivity" 
    android:theme="@style/someTheme" 
    android:windowSoftInputMode="stateHidden|adjustPan" 
    android:configChanges="keyboardHidden|orientation"> 
</activity> 

Для получения дополнительной информации ознакомьтесь this

+0

Убедитесь, что вы прочли эту ссылку. Многие люди думают, что андроид: configChanges = «keyboardHidden | orientation» - это решение, не понимая, что он делает. Изучая жизненный цикл деятельности, http://developer.android.com/guide/components/activities.html, то думать о том, как ваше приложение должно иметь дело с ним, является правильным подходом. – Simon

+0

У меня есть отдельные изменения макета, которые необходимо отображать в режиме ландшафта, поэтому я не могу поместить этот android: configChanges: orientation | screensize keyword в моем приложении. Спасибо – Guna

-3

Попробуйте добавить это:

<activity 
    android:name="com.example.MyTestActivity" 
    android:configChanges="keyboard|keyboardHidden|orientation" 
    ...../> 

Ваша деятельность не будет получать перезапуске во время ориентации chenges.

+0

Это именно то, чего вы не хотите делать, когда найдете 20 экземпляров, все еще работающих. Очевидная утечка присутствует, и ее следует решать. Не имея дело с этим, вы убедитесь, что ваше приложение использует больше ресурсов, чем необходимо, если оно не используется в настоящее время, и это ОЧЕНЬ ПЛОХАЯ вещь для конечного пользователя. – JRomero

0

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

андроида: configChanges: ориентация | экраны

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

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

OP не дает достаточно подробностей, чтобы дать точный ответ, но в целом правильный ответ - узнать о жизненном цикле активности (то есть о том, как Android предназначен для работы) и подумать о как это относится к вашему приложению и как обрабатывать различные обратные вызовы , В частности, ключом является понимание различий между onCreate(), onStart() и onResume() и между onPause() и onStop(). Например, добавление большого количества кода в onCreate() является общей ошибкой начинающих. Я видел приложения с почти всем их значительным кодом, сделанным в onCreate(), и это не очень. Разработчик нажимает кнопку «домой» в первый раз, затем возвращается к своему приложению и задается вопросом, почему он работает неправильно.

http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

Yddl дает хорошее объяснение здесь:

Why not use always android:configChanges="keyboardHidden|orientation"?

Если вы хотите upvote, то upvote его как все, что я сделал это ссылаться на его ответ.

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