Moja aplikacja ma powiadomienia, które - oczywiście - bez żadnych flag, za każdym razem rozpoczynają nowe działanie, więc otrzymuję wiele takich samych działań działających jedna na drugiej, co jest po prostu błędne.
To, co chcę, to przenieść aktywność określoną w oczekujących powiadomieniach na pierwszy plan, jeśli jest już uruchomiona, w przeciwnym razie ją uruchomić.
Jak dotąd intencja / oczekująca intencja dla tego powiadomienia, które mam, to
private static PendingIntent prepareIntent(Context context) {
Intent intent = new Intent(context, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
i co dziwne, czasami działa, czasami nie ... Wydaje mi się, że wypróbowałem już każdą kombinację flag.
onNewIntent
i ustawianie flag)Myślę, że najlepszym sposobem na zrobienie tego i w prosty sposób jest normalne rozpoczęcie działania, ale ustawienie tego działania w manifeście z
singleInstance
właściwością. Dzięki temu praktycznie podchodzisz do obu problemów, które masz w tej chwili, przenosząc aktywność na pierwszy plan przez cały czas i pozwalając systemowi operacyjnemu automatycznie tworzyć nowy, jeśli żadna aktywność nie istnieje, lub przenosić na wierzch już istniejącą aktywność (dziękisingleInstance
własność).Oto sposób deklarowania działania jako pojedynczej instancji:
<activity android:name=".YourActivity" android:launchMode="singleInstance"/>
Aby uniknąć przerywanej animacji podczas uruchamiania przez singleInstance, możesz użyć zamiast tego „singleTask”, oba są bardzo podobne, ale różnica jest wyjaśniona tutaj zgodnie z dokumentacją Google:
<activity android:name=".YourActivity" android:launchMode="singleTask"/>
Mam nadzieję że to pomoże.
Pozdrowienia!
źródło
Myślę, że to, czego potrzebujesz, jest w
singleTop
Activity
, a niesingleTask
lubsingleInstance
.<activity android:name=".MyActivity" android:launchMode="singleTop" ...the rest... >
To, co mówi dokumentacja, doskonale odpowiada Twoim potrzebom:
Poza tym (gra słów nie była zamierzona), miałem dokładnie takie same potrzeby jak ty. Przetestowałem wszystkie
launchMode
flagi, aby dowiedzieć się, jak faktycznie zachowują się w praktyce i w rezultaciesingleTop
jest do tego najlepsza: bez dziwnej animacji, aplikacja wyświetlana raz na liście ostatnich aplikacji (w przeciwieństwie dosingleInstance
tego, że wyświetla ją dwukrotnie, ponieważ nie działa) nie pozwalać komukolwiek innemuActivity
na bycie częścią jego zadania) i właściwego zachowania, niezależnie od tego, czy celActivity
już istnieje, czy nie.źródło
To stary wątek, ale dla wszystkich, którzy wciąż szukają odpowiedzi, oto moje rozwiązanie. Jest wyłącznie w kodzie, bez ustawień manifestu:
private static PendingIntent prepareIntent(Context context) { Intent intent = new Intent(context, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); return PendingIntent.getActivity(context, NON_ZERO_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT); }
Tutaj FLAG_ACTIVITY_SINGLE_TOP otwiera istniejącą aktywność, jeśli znajduje się na szczycie stosu zadań. Jeśli nie jest na górze, ale wewnątrz stosu, FLAG_ACTIVITY_CLEAR_TOP usunie wszystkie działania znajdujące się na górze działania docelowego i pokaże je. Jeśli aktywność nie znajduje się na stosie zadań, zostanie utworzona nowa. Najważniejsza rzecz, o której należy wspomnieć - drugi parametr PendingIntent.getActivity (), tj. RequestCode powinien mieć wartość niezerową (nazwałem go nawet NON_ZERO_REQUEST_CODE w moim fragmencie), w przeciwnym razie te flagi intencji nie będą działać. Nie mam pojęcia, dlaczego tak jest. Flaga FLAG_ACTIVITY_SINGLE_TOP jest wymienna z androidem: launchMode = "singleTop" w tagu aktywności w manifeście.
źródło
Wiem, że jest stary, ale nic z powyższego nie pasowało do mojej aplikacji.
Bez zmiany manifestów i innej konfiguracji, oto kod, który przeniesie Twoją aplikację z powrotem na wierzch - lub otworzy ją po zamknięciu
Intent notificationIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); notificationIntent.setPackage(null); // The golden row !!! notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
źródło
FLAG_ACTIVITY_NEW_TASK
?Próbowałem tego i zadziałało, mimo że IDE narzekało na kod
Intent notificationIntent = new Intent(THIS_CONTEXT, MainActivity.class); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); PendingIntent intent = PendingIntent.getActivity(THIS_CONTEXT, 0, notificationIntent, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(THIS_CONTEXT) .setSmallIcon(R.drawable.cast_ic_notification_0) .setContentTitle("Title") .setContentText("Content") .setContentIntent(intent) .setPriority(PRIORITY_HIGH) //private static final PRIORITY_HIGH = 5; .setAutoCancel(true) /*.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS)*/; NotificationManager mNotificationManager = (NotificationManager) THIS_CONTEXT.getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(0, mBuilder.build());
źródło
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
nie jest poprawną flagą dlaPendingINtent.getActivity
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
nie jest to poprawna flaga, gdy jest używana jakoPendingIntent
. A może chodziło Ci o to, że nie można go przekazać dogetActivity
metody, ale można go użyć jakoIntent
flagi, która jest następnie używana jakoPendingIntent
?Ponieważ mówisz, że chcesz rozpocząć swoją aktywność, jeśli jeszcze się nie rozpoczęła, może nie miałbyś nic przeciwko wznowieniu jej. Przetestowałem również mnóstwo sugestii i kombinacji flag pod kątem celu, to zawsze spowoduje, że aktywność, której potrzebujesz, znajdzie się na pierwszym planie, chociaż nie zachowa żadnego stanu wcześniej z nim związanego.
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
Tylko API11 +.
źródło
Po dodaniu powiadomień miałem podobny problem, jak na stronie szkoleniowej Androida . Żadna z pozostałych odpowiedzi nie zadziałała dla mnie, jednak ta odpowiedź zadziałała dla mnie. Podsumowanie:
final Intent notificationIntent = new Intent(context, YourActivity.class); notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER); notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
źródło