Klik pemberitahuan: aktivitas sudah terbuka


164

Saya memiliki aplikasi dengan notifikasi yang membuka aktivitas tertentu jika saya mengkliknya. Saya ingin itu, jika saya mengklik pemberitahuan dan aktivitas sudah dibuka, itu tidak dimulai lagi, tetapi hanya dibawa ke depan.

Saya pikir saya bisa melakukannya dengan bendera FLAG_ACTIVITY_BROUGHT_TO_FRONTatau FLAG_ACTIVITY_REORDER_TO_FRONT, tetapi terus membukanya lagi sehingga saya memiliki kegiatan dua kali.

Ini kode saya:

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);

Bisakah saya mengelolanya dengan flag atau haruskah saya menyimpan variabel di SharedPreferences untuk memeriksa apakah itu dibuka atau tidak?

Terima kasih!


1
Saya menggunakan intent.setFlags (Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
ashraful

Jawaban:


298

Anda perlu mengatur launchModeatribut yang ActivityAnda mulai singleTop. Ini akan menyebabkan Intents yang masuk dikirimkan ke instance yang ada daripada memulai instance baru ketika itu Activitysudah di bagian atas tumpukan tugas.

Hal ini dilakukan dalam manifest dengan menambahkan android:launchMode="singleTop"ke <activity>elemen. Untuk mengakses Intent terbaru (jika Anda tertarik pada data apa pun yang mungkin diteruskan), ganti onNewIntent()di Activity.


6
Saya mendapat banyak jawaban yang mengatakan mengatur niat untuk berbagai hal. Ini tidak berhasil. Apakah ini karena tujuannya, terlepas dari benderanya, akan ke aktivitas yang baru dibuat? Saya bertanya karena Devunwired mengatakan atribut launchMode berubah di mana Intents dikirim.
lululoo


1
Saya melihat bahwa jika Anda menggunakan pendekatan ini pada aktivitas yang diluncurkan dari layar beranda, maka setiap kali Anda meluncurkan aplikasi akan mulai dengan aktivitas root, menghancurkan aktivitas apa pun yang sebelumnya ditampilkan di atas. Ini tentu bukan perilaku yang diharapkan bagi pengguna menempatkan aplikasi di latar belakang sementara dalam aktivitas yang berbeda dan membukanya kembali.
Jerman

38

Cobalah mengatur bendera Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOPsebagai gantinya.

Dari dokumentasi untuk FLAG_ACTIVITY_CLEAR_TOP (penekanan milik saya):

Jika diatur, dan aktivitas yang diluncurkan sudah berjalan dalam tugas saat ini, maka alih-alih meluncurkan contoh baru dari aktivitas itu, semua aktivitas lain di atasnya akan ditutup dan Tujuan ini akan dikirim ke (sekarang aktif atas) aktivitas lama sebagai Intent baru.

Misalnya, pertimbangkan tugas yang terdiri dari kegiatan: A, B, C, D. Jika D memanggil startActivity () dengan Intent yang memutuskan ke komponen aktivitas B, maka C dan D akan selesai dan B menerima Intent yang diberikan , menghasilkan tumpukan sekarang menjadi: A, B.

Contoh aktivitas B yang sedang berjalan saat ini dalam contoh di atas akan menerima maksud baru yang Anda mulai di sini dalam metode onNewIntent (), atau diselesaikan sendiri dan dimulai kembali dengan maksud baru. Jika telah menyatakan mode peluncurannya menjadi "banyak" (default) dan Anda belum menetapkan FLAG_ACTIVITY_SINGLE_TOP dengan maksud yang sama, maka itu akan selesai dan dibuat kembali; untuk semua mode peluncuran lainnya atau jika FLAG_ACTIVITY_SINGLE_TOP diatur maka Intent ini akan dikirimkan ke instanceNewIntent () yang ada pada instance saat ini.


1
Ini yang saya butuhkan. Hanya menambahkan deskripsi yang kita perlu menambahkan bendera ini untuk maksud: new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP).
Morteza Rastgoo

6

Gunakan onNewIntent()untuk menangani data baru dari klik pemberitahuan dan menyegarkan aktivitas.

Dalam onNewIntentmendapatkan data baru dari maksud yang baru (yang dilayani oleh notifikasi baru) dan menangkap mereka, misalnya:

title = intent.getStringExtra("title")

di onCreatesebelumnya :)

Ini akan menyegarkan aktivitas saat ini dengan data notifikasi baru.

Anda juga dapat mengikuti tutorial ini.


3
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());

Cukup Salin kode dan tempel di aktivitas peluncur utama Anda.

Inilah Jawaban Asli


0

Saya pikir Anda harus menambahkan beberapa logika untuk membuatnya berfungsi, mungkin ini dapat membantu:

Misalnya saya memiliki Splash Screen (Launcher dan MAIN) dari APP:

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);
        }

    }

}

Dan di FirebaseService saya, saya telah melakukan yang berikut:

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
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this, new Random().nextInt(), intent, 0);

4
Tolong jelaskan bagaimana kode Anda membantu menyelesaikan masalah yang disebutkan dalam pertanyaan. Ini mungkin tidak jelas bagi pembaca lain yang menghadapi masalah yang sama / serupa.
Nggak
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.