Как да се справим с множество екземпляри на Android?

Режимът на стартиране е "singleTop":

<activity android:name=".MainActivity" android:label="@string/app_name" android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity android:name=".GridActivity"></activity>

MainActivity е началният екран, когато приключи (удостоверява се със сървъра), ще извика GridActivity.

Проблемът е много специфичен:

Когато инсталирате приложението от Google Play, иконата ще се появи на две места: чекмедже за приложения & "Desktop" (стартов екран - стартов панел по подразбиране).

Стъпки за възпроизвеждане на проблема:

  1. Отворете приложението от чекмеджето на приложението и изчакайте да се покаже GridActivity
  2. Натиснете бутона "начало", за да изпратите приложението на заден план
  3. Отворете приложението от „Desktop“ (стартовия панел по подразбиране на устройството)
  4. Приложението ще стартира в нов екземпляр

Очаквам приложението да отиде директно към GridActivity поради метода за стартиране "singleTop".

Между другото, ако на стъпка 3 отворя приложението отново от Application Drawer, то работи добре, отива директно към GridActivity.

какво ми липсва


person Gadi Paz    schedule 27.11.2014    source източник


Отговори (1)


Тъй като използвате дейността си по стартиране като "начален екран", тя вероятно се унищожава, което води до това поведение. След като бъде унищожен, друг процес, който го извиква, ще го стартира в нов процес. Прочетете това за повече:

Режим за стартиране от един горен край на Android и метод onNewIntent

Режимът на стартиране "singleTop" вероятно не е необходим. Въпреки че, за да заобиколя това, използвам флаг „първи път през“, който стартира началния екран от основната дейност. Изглежда, че работи доста добре.

РЕДАКТИРАНЕ:

Трябва да внимавате да прочетете за "launchMode" - режимите singleTop и "standard" имат това поведение от документите:

Дейност със "стандартен" или "singleTop" режим на стартиране може да бъде инстанцирана няколко пъти.

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

Вероятно изпитвате този аспект на singleTop:

например, ако съществуващ екземпляр на дейността "singleTop" е в целевата задача, но не в горната част на стека, или ако е в горната част на стека, но не в целевата задача - нов екземпляр ще бъде създаден и избутан в стека.

Двете места за изстрелване водят до две различни целеви задачи. Това може да се дължи на начина, по който двата екрана създават намерения, или защото „началният екран“ е унищожен и следователно не присъства (той не се унищожава „само“ чрез отвръщане – Android има няколко алгоритъма за унищожаване на дейности, за да запази обработката и паметта. Трябва обикновено се приема, че ако дадена дейност не е видима, тя може да бъде унищожена и създадена отново по всяко време).

person Jim    schedule 27.11.2014
comment
MainActivity не се унищожава, той извиква StartActivity() към GridActivity и остава жив. Той ще бъде унищожен само когато излезете от приложението, като натиснете бутона Назад. Ако това беше проблемът, тогава нямаше да има значение дали отворя приложението от чекмеджето на приложението или от работния плот, но както можете да прочетете по-горе, това се случва само когато отворя приложението от едно място и след това го отворя отново от друго ( първи път от чекмеджето на приложението и втори път от работния плот или обратно) - person Gadi Paz; 27.11.2014
comment
Имате ли идея как да разреша този проблем? Създаването на GridActivity като първа дейност и след това показване на MainActibity (SplashScreen) трябва да го реши? - person Gadi Paz; 30.11.2014