Kliknij powiadomienie: aktywność już otwarta

Mam aplikację z powiadomieniami, które otwierają określoną aktywność, jeśli je kliknę. Chcę, aby, jeśli kliknę powiadomienie, a aktywność jest już otwarta, to nie zaczęło się ponownie, ale po prostu zostało przeniesione do przodu.

Myślałem, że mogę to zrobić z flagą FLAG_ACTIVITY_BROUGHT_TO_FRONT lub FLAG_ACTIVITY_REORDER_TO_FRONT, ale ciągle ją otwiera, więc mam aktywność dwa razy.

To jest mój kod:

event_notification = new Notification(R.drawable.icon,
            mContext.getString(R.string.event_notif_message), System.currentTimeMillis()); 
Intent notificationIntent = new Intent(mContext, EventListActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
sendNotification(event_notification, notificationIntent, mContext.getString(R.string.event_notif_title),
                body, Utils.PA_NOTIFICATIONS_ID);

Czy Mogę nim zarządzać za pomocą flag, czy powinienem zapisać zmienną w SharedPreferences, aby sprawdzić, czy otwarte czy nie?

Dzięki!
Author: Jonik, 2012-08-20

6 answers

Musisz ustawić launchMode atrybut Activity, który zaczynasz singleTop. Spowoduje to, że przychodzące intencje będą dostarczane do istniejącej instancji zamiast rozpoczynać nową instancję, gdy Activity znajduje się już na szczycie stosu zadania.

Odbywa się to w manifeście przez dodanie android:launchMode="singleTop" do elementu <activity>. Aby uzyskać dostęp do najnowszej intencji (jeśli jesteś zainteresowany jakimikolwiek danymi, które mogły zostać przekazane wraz z nią), Nadpisz onNewIntent() w swoim Activity.

 242
Author: Devunwired,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-20 19:16:32

Spróbuj zamiast tego ustawić flagi na Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP.

Z dokumentacji dla FLAG_ACTIVITY_CLEAR_TOP (podkreślenie):

Jeśli jest ustawione, a uruchamiana aktywność jest już uruchomiona w bieżącego zadania, wtedy zamiast uruchamiać nową instancję tego działalności, wszystkie pozostałe działania na jej szczycie zostaną zamknięte i zamiar ten zostanie dostarczony do (teraz na górze) starej działalności jako nowe intencje.

Na przykład, rozważmy zadanie składająca się z czynności: A, B, C, D. Jeśli D wywoła funkcję startActivity () z intencją, która rozwiązuje Składnik działania B, następnie C i D zostaną zakończone, a b otrzymają podaną intencją, w wyniku czego stos teraz wynosi: A, B.

Aktualnie uruchomiona instancja aktywności B w powyższym przykładzie będzie albo otrzymać nowy zamiar zaczynasz tutaj w jego metoda onNewIntent (), lub być sama zakończona i uruchomiona ponownie z nową intencja. Jeśli zadeklarował swój start mode to be " multiple "(the domyślnie) i nie ustawiłeś FLAG_ACTIVITY_SINGLE_TOP w tym samym intencji, wtedy zostanie on ukończony i ponownie utworzony; dla wszystkich innych uruchomień modes or if FLAG_ACTIVITY_SINGLE_TOP is set then this Intent will be dostarczone do bieżącej instancji onnewintent ().

 30
Author: user113215,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-20 19:19:52

Użyj onNewIntent() do obsługi nowych danych z powiadomień kliknij i odśwież aktywność.

W onNewIntent Uzyskaj nowe dane z nowej intencji (która była obsługiwana przez nowe powiadomienie) i złap je, na przykład:

title = intent.getStringExtra("title")

W onCreate poprzednio :)

Odświeży bieżącą aktywność o nowe dane powiadomień.

Możesz również postępować zgodnie z tym samouczkiem: http://androidrace.com/2016/12/10/how-to-refresh-activity-on-new-notification-click-android-developer/

 4
Author: Afjalur Rahman Rana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-10 21:48:20
Notification.Builder mBuilder =
            new Notification.Builder(this)
            .setSmallIcon(R.drawable.cmplayer)
            .setContentTitle("CoderoMusicPlayer")
            .setContentText("PLayer0!");

    Intent resultIntent = new Intent(this, 

    AndroidBuildingMusicPlayerActivity.class);
        resultIntent.setAction(Intent.ACTION_MAIN);
        resultIntent.addCategory(Intent.CATEGORY_LAUNCHER);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                resultIntent, 0);

        mBuilder.setContentIntent(pendingIntent);
        NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        mNotificationManager.notify(1, mBuilder.build());

Po prostu skopiuj kod i wklej go do głównej aktywności launchera.

Oto oryginalna ODPOWIEDŹ

 2
Author: Community,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:03

Myślę, że powinieneś dodać trochę logiki, aby to działało, może to pomoże:

Na przykład mam ekran powitalny (Launcher i główny) aplikacji:

public class SplashScreen extends AppCompatActivity {
    private final int TIME_OUT = 2000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen);

        // Suscribirse al tema Notificaciones
        FirebaseMessaging.getInstance().subscribeToTopic("NOTA");
        if (getIntent().getExtras() != null) {
            if (getIntent().getExtras().size()>1){
                Intent home_activity = new Intent(getApplicationContext(), Home.class);
                home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                if (getIntent().getExtras() != null) {
                    for (String key : getIntent().getExtras().keySet()) {
                        String value = "" + getIntent().getExtras().getString(key);
                        Log.d("TAG", key + "=" + value);
                        switch (key) {
                            case "url":
                                home_activity.putExtra("url", value);
                                break;
                        }
                    }
                }
                startActivity(home_activity);
                finish();

            }else{
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Intent home_activity = new Intent(getApplicationContext(), Home.class);
                            home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(home_activity);
                            finish();
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                }, TIME_OUT);
            }


        } else {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    try {
                        Intent home_activity = new Intent(getApplicationContext(), Home.class);
                        home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(home_activity);
                        finish();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }, TIME_OUT);
        }

    }

}

I w moim FirebaseService zrobiłem następujące:

public class FCMessagingService extends FirebaseMessagingService {

    private final String TAG = "PUSH";
    private String body = "";
    private static String _url = "";
    private static int numMessage = 0;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

        String from = remoteMessage.getFrom();
        Log.d(TAG, "Mensaje recibido de: " + from);

        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Notificación: " + remoteMessage.getNotification().getBody());

            if (remoteMessage.getData().size() > 0) {
                Log.d(TAG, "Data: " + remoteMessage.getData());
                try {
                    JSONObject data = new JSONObject(remoteMessage.getData());
                    String url = data.getString("url");
                    Log.d(TAG, "onMessageReceived: \n" + "Extra Information: " + url);
                    this._url = url;
                    Log.d("_URL",_url);
                    mostrarNotificacion(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
                    mensaje(url, remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }



    }


    private void mensaje(String url, String title, String body){
        boolean acti =  Util.comprobarActivityALaVista(getApplicationContext(), "com.dev.android.subagan.MainActivity");
        if(acti){

            Intent imain = new Intent(MainActivity.URL);

            imain.putExtra("key_url",url);
            imain.putExtra("key_title",title);
            imain.putExtra("key_body",body);

            LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(imain);

        }else{

            Intent ihome = new Intent(Home.URL);

            ihome.putExtra("key_url",url);
            ihome.putExtra("key_title",title);
            ihome.putExtra("key_body",body);
            LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(ihome);

        }

    }




    private void mostrarNotificacion(String title, String body) {

        final int NOTIFICATION_ID = 3000;

        Intent intent = new Intent(this, MainActivity.class);
        intent.putExtra("url",_url);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT  );



        Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(title)
                .setContentText(body)
                .setAutoCancel(true)
                .setSound(soundUri)
                .setTicker(body)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0, notificationBuilder.build());

    }

}
 0
Author: Carlos Alberto Gonzalez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-02 22:02:45
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this, new Random().nextInt(), intent, 0);
 0
Author: Manjunath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-28 00:21:22