2012-01-18 12 views
17

Mam wspólne menu na mojej aplikacji z ikonami. Kliknięcie ikony spowoduje rozpoczęcie działania. Czy istnieje sposób sprawdzenia, czy działanie już działa i uniemożliwienie jego uruchomienia wiele razy (lub z wielu wpisów)? Czy mogę przenieść aktywność z stanem onPause na pierwszy plan?Zapobieganie otwieraniu aktywności wiele razy

+0

nie robiłem rozwój Androida od jakiegoś czasu, ale jestem prawie pewny, że Android uruchomi istniejącą instancję twojego "Aktywności", zamiast uruchamiać nową. –

Odpowiedz

30

Użyj tego:

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 

podczas uruchamiania Activity.

od documentation:

Jeśli ustawione w intencyjny przekazany do Context.startActivity(), ta flaga będzie spowodować rozpoczęła działalność na pociągnięcie go do przodu Jego zadaniem jest historii stosie, jeśli jest już bieganie.

14

W swoim zgłoszeniu działalności w pliku manifestu, dodać tag android:launchMode="singleInstance"

+0

Z dokumentacji startActivityForResult, jeśli uruchamiane działanie korzysta z trybu uruchamiania pojedynczego zadania, nie uruchomi się ono w zadaniu, co spowoduje natychmiastowe anulowanie wyniku. –

+0

Mam wiele punktów wejściowych i działa to dla mnie bardzo dobrze –

+0

w rzeczywistości nie jestem wielkim fanem "singleInstance", ponieważ powoduje, że aktywność jest uruchamiana w osobnym oknie, tak jakby była to osobna aplikacja, która bardzo źle doświadczenie użytkownika, gdy użytkownik otwiera widok aplikacji. –

0

utworzyć instancję swojej działalności, który nie chce się uruchomić wiele razy jak

Class ExampleA extends Activity { 
public static Activity classAinstance = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    classAinstance = this; 
} 

} 

Teraz gdziekolwiek u chcą Sprawdzanie krzyżowe mam na myśli uniemożliwić jego wielokrotne uruchamianie, sprawdź to:

if(ExampleA.classAinstance == null) { 
     "Then only start your activity" 
} 
+1

Pamiętaj, że to zapobiegnie gromadzeniu śmieci w działaniu. Ponadto nie pomoże to, jeśli działanie zostanie uruchomione z innego komponentu (np. Innej aplikacji), który nie może uzyskać dostępu do statycznego odnośnika aktywności (lub nawet o nim nie wie). – lxgr

0

Dodaj to do definicji Activity w Androidmanifest.xml ...

android:launchMode = "singleInstance" 
0

Wystarczy użyć

Intent i = new Intent(ActivityA.this, ActivityB.class); 
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(i); 
-1

dodaj

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    finish(); 
} 

lub

launchmode do singleTask/jednomodowych

lub

zawsze otworzyć nową działalność poprzez wyczyszczenie stosu

+2

Proszę dodać wyjaśnienie do swojej odpowiedzi. – ItamarG3

+0

** Z kolejki recenzji: ** Mogę poprosić o dodanie nieco kontekstu wokół swojej odpowiedzi. Odpowiedzi dotyczące tylko kodu są trudne do zrozumienia. Pomoże to pytającemu i przyszłym czytelnikom, jeśli dodasz więcej informacji do swojego postu. –

2

mam go doskonale działa w następujący sposób. W działalności rozmówcy lub usługę (nawet z innej aplikacji)

Intent launchIntent = getPackageManager().getLaunchIntentForPackage(APP_PACKAGE_NAME); 

//the previous line can be replaced by the normal Intent that has the activity name Intent launchIntent = new Intent(ActivityA.this, ActivityB.class); 

     launchIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT|Intent.FLAG_ACTIVITY_NEW_TASK); 

startActivity(launchIntent); 

oraz w manifeście aktywności odbiornika (I chcą zapobiec otwarciu dwukrotnie)

<activity android:name=".MainActivity" 
      android:launchMode="singleTask" 
      > 
Powiązane problemy