अधिसूचना क्लिक: गतिविधि पहले से ही खुली


164

मेरे पास नोटिफिकेशन के साथ एक एप्लिकेशन है जो एक निश्चित गतिविधि को खोलता है यदि मैं उन्हें क्लिक करता हूं। मैं चाहता हूं कि, यदि मैं अधिसूचना पर क्लिक करता हूं और गतिविधि पहले से ही खोली जाती है, तो इसे फिर से शुरू नहीं किया जाता है, लेकिन सिर्फ सामने लाया जाता है।

मुझे लगा कि मैं इसे ध्वज के साथ कर सकता हूं FLAG_ACTIVITY_BROUGHT_TO_FRONTया FLAG_ACTIVITY_REORDER_TO_FRONT, लेकिन यह इसे फिर से खोल रहा है इसलिए मेरे पास गतिविधि दो बार है।

यह मेरा कोड है:

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

क्या मैं इसे झंडे के साथ प्रबंधित कर सकता हूं या मुझे यह जाँचने के लिए साझा करने के लिए साझाकरण में एक चर संग्रहित करना चाहिए कि क्या यह खोला गया है या नहीं?

धन्यवाद!


1
मैं इरादे का उपयोग करता हूं ।setFlags (Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
अश्रुपूर्य

जवाबों:


298

आपको उस launchModeविशेषता को सेट करना होगा जिसकी Activityआप शुरुआत कर रहे हैं singleTop। यह आने वाले इरादों को एक नया उदाहरण शुरू करने के बजाय मौजूदा उदाहरण तक पहुंचाने का कारण बनेगा जब वह Activityपहले से ही कार्य के ढेर में सबसे ऊपर है।

यह तत्व android:launchMode="singleTop"को जोड़कर प्रकट में किया जाता है <activity>। नवीनतम आशय का उपयोग करने के लिए (यदि आप किसी ऐसे डेटा में रुचि रखते हैं जो इसके साथ पारित हो सकता है), onNewIntent()आपके ओवरराइड में Activity


6
मैं कई उत्तरों में भाग गया जिन्होंने कहा कि विभिन्न चीजों के इरादे का झंडा सेट करें। यह काम नहीं किया। क्या ऐसा इसलिए है क्योंकि इरादे, इसके ध्वज की परवाह किए बिना, एक नई बनाई गई गतिविधि के लिए जा रहे हैं? मैं पूछता हूं क्योंकि Devunwired ने कहा कि लॉन्चरमैट विशेषता में परिवर्तन होता है जहां इंटेंट वितरित हो जाते हैं।
लल्लू

5
दस्तावेज़ पृष्ठ डेवलपर.
android.com/guide/topics/manifest/…

1
मैं देखता हूं कि यदि आप होम स्क्रीन से लॉन्च की जा रही गतिविधि पर इस दृष्टिकोण का उपयोग करते हैं, तो हर बार जब आप एप्लिकेशन लॉन्च करते हैं, तो रूट गतिविधि के साथ शुरू होगा, किसी भी गतिविधियों को नष्ट कर देगा जो पहले शीर्ष पर प्रदर्शित किए गए थे। यह निश्चित रूप से एक उपयोगकर्ता के लिए एक अलग गतिविधि में पृष्ठभूमि को डालते हुए और इसे फिर से खोलने के लिए एक अपेक्षित व्यवहार नहीं है।
जर्मन

38

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOPइसके बजाय झंडे सेट करने का प्रयास करें ।

FLAG_ACTIVITY_CLEAR_TOP (जोर मेरा) के लिए प्रलेखन से :

यदि सेट किया गया है, और लॉन्च की जा रही गतिविधि पहले से ही चालू कार्य में चल रही है, तो उस गतिविधि का एक नया उदाहरण लॉन्च करने के बजाय, इसके शीर्ष पर अन्य सभी गतिविधियां बंद हो जाएंगी और इस आशय को (अब चालू) कर दिया जाएगा एक नई मंशा के रूप में शीर्ष) पुरानी गतिविधि।

उदाहरण के लिए, गतिविधियों से मिलकर एक कार्य पर विचार करें: ए, बी, सी, डी। यदि डी एक गतिविधि के साथ स्टार्ट एक्टिविटी () कहता है जो गतिविधि बी के घटक को हल करता है, तो सी और डी समाप्त हो जाएगा और बी दिए गए इरादे को प्राप्त करेगा। जिसके परिणामस्वरूप स्टैक अब: ए, बी।

वर्तमान में चल रहे गतिविधि B के उदाहरण ऊपर दिए गए उदाहरण में या तो आप जिस नए इरादे से यहां शुरू कर रहे हैं, वह प्राप्त करेंगे। यदि उसने अपना लॉन्च मोड "एकाधिक" (डिफ़ॉल्ट) घोषित किया है और आपने FLAG_ACTIVITY_SINGLE_TOP को एक ही इरादे से सेट नहीं किया है, तो यह समाप्त हो जाएगा और फिर से बनाया जाएगा; अन्य सभी लॉन्च मोड के लिए या यदि FLAG_ACTIVITY_SINGLE_TOP सेट है तो यह आशय वर्तमान उदाहरण के onNewIntent () में दिया जाएगा।


1
यह वही है जो मुझे चाहिए था। बस एक विवरण जोड़ें जो हमें इस झंडे को इरादे से जोड़ने की आवश्यकता है new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP):।
मोर्टेजा रस्तगो

6

onNewIntent()अधिसूचना क्लिक से नए डेटा को संभालने के लिए उपयोग करें और गतिविधि को ताज़ा करें।

में onNewIntentनए इरादे से नए डेटा (जो नई अधिसूचना द्वारा सेवा) हो जाते हैं और उन्हें पकड़ने, उदाहरण के लिए:

title = intent.getStringExtra("title")

में onCreateपहले से :)

यह नए अधिसूचना डेटा के साथ वर्तमान गतिविधि को ताज़ा करेगा।

आप इस ट्यूटोरियल का अनुसरण भी कर सकते हैं


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

बस कोड को कॉपी करें और अपने मुख्य लॉन्चर गतिविधि में पेस्ट करें।

यहाँ मूल उत्तर है


0

मुझे लगता है कि आपको इसे काम करने के लिए कुछ तर्क जोड़ने चाहिए, शायद यह मदद कर सकता है:

उदाहरण के लिए मेरे पास एपीपी की एक स्प्लैश स्क्रीन (लॉन्चर और MAIN) है:

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

    }

}

और मेरे FirebaseService में मैंने निम्नलिखित कार्य किए हैं:

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
कृपया बताएं कि आपका कोड प्रश्न में वर्णित समस्या को हल करने में कैसे मदद करता है। यह समान / समान मुद्दों का सामना करने वाले अन्य पाठकों के लिए स्पष्ट नहीं हो सकता है।
नं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.