Bildirim tıklaması: etkinlik zaten açık


164

Onları tıklarsam belirli bir etkinliği açan bildirimleri olan bir uygulamam var. Ben bildirimi tıklayın ve etkinlik zaten açılırsa buna, oluyor istiyorum değil tekrar başladı, ama sadece ön getirdi.

Bayrakla yapabileceğimi sanıyordum FLAG_ACTIVITY_BROUGHT_TO_FRONTya FLAG_ACTIVITY_REORDER_TO_FRONTda tekrar açmaya devam ediyor, bu yüzden iki kez aktivitem var.

Bu benim kodum:

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

Bayraklarla yönetebilir miyim yoksa açık olup olmadığını kontrol etmek için SharedPreferences içinde bir değişkeni saklamam gerekir mi?

Teşekkürler!


1
İntent.setFlags (Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY) kullanıyorum;
ashraful

Yanıtlar:


298

Sen ayarlamanız gerekir launchModeniteliğini Activitysen başlıyor singleTop. Bu, gelen Hedeflerin Activityzaten görev yığınının en üstünde olduğunda yeni bir örneği başlatmak yerine mevcut örneğe teslim edilmesine neden olur .

Bu, bildirime öğeye eklenerek android:launchMode="singleTop"yapılır <activity>. Son Niyet (onunla geçirilen olabilecek herhangi bir veri ilgilenen varsa) geçersiz kılmayı erişmek için onNewIntent()Gözlerinde farklı Activity.


6
Çeşitli şeylere niyetin bayrağını belirten birçok cevapla karşılaştım. Bu işe yaramadı. Bunun nedeni, bayrağından bağımsız olarak niyetin yeni yaratılmış bir etkinliğe mi gitmesi? Soruyorum çünkü Devunwired, Intent'lerin teslim edildiği yerde launchMode özniteliğinin değiştiğini söyledi.
lululoo


1
Bu yaklaşımı ana ekrandan başlatılan etkinlikte kullanırsanız, uygulamayı her başlattığınızda kök etkinlikle başlayıp daha önce üstte görüntülenen etkinlikleri yok edeceğini görüyorum. Bu, farklı bir etkinlikte iken uygulamayı arka planda tutan ve yeniden açan bir kullanıcı için kesinlikle beklenen bir davranış değildir.
Alman

38

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOPBunun yerine bayrakları ayarlamayı deneyin .

Gönderen FLAG_ACTIVITY_CLEAR_TOP belgelerine (vurgu benim):

Ayarlanırsa ve başlatılan etkinlik geçerli görevde zaten çalışıyorsa, o etkinliğin yeni bir örneğini başlatmak yerine, üstündeki diğer tüm etkinlikler kapatılacak ve bu Amaç (şimdi üst) yeni bir niyet olarak eski etkinlik.

Örneğin, A, B, C, D aktivitelerinden oluşan bir görevi düşünün. D, B aktivitesinin bileşenine karar veren bir Niyet ile startActivity () öğesini çağırırsa, C ve D tamamlanır ve B verilen Niyeti alır , yığının şu anda oluşmasıyla sonuçlanır: A, B.

Yukarıdaki örnekte şu anda çalışan B etkinliği örneği ya burada başlattığınız yeni amacı onNewIntent () yöntemiyle alacak ya da yeni amaç ile bitmiş ve yeniden başlatılacak. Başlatma modunun "çoklu" (varsayılan) olduğunu bildirdiyse ve aynı amaç için FLAG_ACTIVITY_SINGLE_TOP belirlemediyseniz, bitirilir ve yeniden oluşturulur; diğer tüm başlatma modları için veya FLAG_ACTIVITY_SINGLE_TOP ayarlanmışsa, bu Amaç geçerli örneğin onNewIntent () öğesine gönderilir.


1
İhtiyacım olan bu. Sadece biz niyet bu bayrakları eklemek gerektiğini bir açıklama ekleyin: new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP).
Morteza Rastgoo

6

onNewIntent()Bildirim tıklamasındaki yeni verileri işlemek için kullanın ve etkinliği yenileyin.

Gelen onNewIntent(yeni bildirimle sunulan) yeni niyet yeni veri almak ve örneğin onları yakalamak:

title = intent.getStringExtra("title")

içinde onCreatedaha önce :)

Mevcut etkinliği yeni bildirim verileriyle yenileyecektir.

Bu eğiticiyi de takip edebilirsiniz .


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

Kodu kopyalayın ve ana başlatıcı etkinliğinize yapıştırın.

İşte Orijinal Yanıt


0

Çalışması için bir mantık eklemeniz gerektiğini düşünüyorum, belki de bu yardımcı olabilir:

Örneğin APP bir Açılış Ekranı (Launcher ve ANA) var:

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

    }

}

Ve FirebaseService'te aşağıdakileri yaptım:

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
Lütfen kodunuzun soruda belirtilen sorunun çözülmesine nasıl yardımcı olduğunu açıklayın. Bu, aynı / benzer sorunlarla karşılaşan diğer okuyucular için açık olmayabilir.
NOhs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.