साफ इरादा


111

मेरा एंड्रॉइड ऐप एक ऐसे इरादे से बुलाया जा रहा है जो जानकारी (स्टेटसबार में लंबित) पास कर रहा है।

जब मैं होम बटन को हिट करता हूं और होम बटन को दबाकर अपने ऐप को फिर से खोल देता हूं तो यह फिर से आशय को बुलाता है और वही एक्स्ट्रा कलाकार अभी भी हैं।

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
      super.onSaveInstanceState(savedInstanceState);
    }
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
      super.onRestoreInstanceState(savedInstanceState);
    }

यह वह कोड है जो अपनी मर्जी से नहीं चलता है

    String imgUrl;
    Bundle extras = this.getIntent().getExtras();


    if(extras != null){
        imgUrl = extras.getString("imgUrl");
        if( !imgUrl.equals(textView01.getText().toString()) ){

            imageView.setImageDrawable( getImageFromUrl( imgUrl ) );
            layout1.setVisibility(0);
            textView01.setText(imgUrl);//textview to hold the url

        }

    }

और मेरा इरादा:

public void showNotification(String ticker, String title, String message, 
    String imgUrl){
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager mNotificationManager = 
        (NotificationManager) getSystemService(ns);
    int icon = R.drawable.icon;        // icon from resources
    long when = System.currentTimeMillis();         // notification time
    CharSequence tickerText = ticker;              // ticker-text

    //make intent
    Intent notificationIntent = new Intent(this, activity.class);
    notificationIntent.putExtra("imgUrl", imgUrl);
    notificationIntent.setFlags(
        PendingIntent.FLAG_UPDATE_CURRENT | 
        PendingIntent.FLAG_ONE_SHOT);
    PendingIntent contentIntent = 
        PendingIntent.getActivity(this, 0, 
        notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | 
        PendingIntent.FLAG_ONE_SHOT);

    //make notification
    Notification notification = new Notification(icon, tickerText, when);
    notification.setLatestEventInfo(this, title, message, contentIntent);
    //flags
    notification.flags = Notification.FLAG_SHOW_LIGHTS | 
        Notification.FLAG_ONGOING_EVENT | 
        Notification.FLAG_ONLY_ALERT_ONCE | 
        Notification.FLAG_AUTO_CANCEL;
    //sounds
    notification.defaults |= Notification.DEFAULT_SOUND;
    //notify
    mNotificationManager.notify(1, notification);
}

क्या इरादे साफ करने या जांचने का कोई तरीका है कि क्या इसका इस्तेमाल पहले किया गया है?


क्या आप अपने कोड पोस्ट कर सकते हैं?
xandy

मैंने अपने प्रश्न में कोड जोड़ा
मंगल

इरादे को साफ करने के बजाय, आप लॉन्च प्रकार निर्धारित कर सकते हैं और तदनुसार एप्लिकेशन प्रवाह को संभाल सकते हैं। अगर यह अधिसूचना के लिए लॉन्च किया गया है और पृष्ठभूमि से नहीं, तो ही एक्स्ट्रा प्राप्त करें। stackoverflow.com/questions/4116110/clearing-intent/…
BB

जवाबों:


168

अपडेट करें:

मुझे नहीं पता था कि इस उत्तर को तब संदर्भित किया जाएगा जब मैंने पहली बार इसे 5 साल पहले लिखा था!

मैं स्पष्ट करना चाहूंगा कि @ tato-rodrigo के अनुसार इसका उत्तर आपको कुछ स्थितियों में पहले से संभाले गए इरादे का पता लगाने में मदद नहीं करेगा।

इसके अलावा, मुझे एक कारण के लिए उद्धरण में "स्पष्ट" कहना चाहिए - आप वास्तव में ऐसा करने से इरादे को साफ नहीं कर रहे हैं , आप केवल एक ध्वज के रूप में अतिरिक्त को हटाने का उपयोग कर रहे हैं जिसे इस इरादे ने पहले से ही गतिविधि द्वारा देखा है। ।


मैं वास्तव में एक ही मुद्दा था।

उपरोक्त उत्तर ने मुझे सही रास्ते पर ला दिया और मुझे और भी सरल समाधान मिल गया, इसका उपयोग करें

getIntent().removeExtra("key"); 

आशय को "स्पष्ट" करने के लिए विधि कॉल।

इसका जवाब थोड़ा देर से दिया गया क्योंकि यह एक साल पहले पूछा गया था, लेकिन उम्मीद है कि यह भविष्य में दूसरों की मदद करता है।


4
क्या removeExtra () विधि स्ट्रिंग पैरामीटर नहीं लेती है? इस तरह getIntent ()। removeExtra ("स्ट्रिंग");
tony9099

25
@ मैक्स मैं गलत हो सकता हूं लेकिन मुझे लगता है कि यह निम्नलिखित परिदृश्य में काम नहीं करेगा: 1) अधिसूचना के माध्यम से गतिविधि खोलें; 2) बैक बटन दबाकर गतिविधि समाप्त करें; 3) गतिविधि को इतिहास (हाल के ऐप्स) के माध्यम से फिर से खोलें। एक अन्य मामला यह है कि सिस्टम डेवलपर की कमी के कारण संसाधनों की कमी के कारण ऐप को मारता है (डेवलपर गतिविधियों के तहत "गतिविधियों को न रखें" और उसके बाद बस घर दबाएं फिर गतिविधि को फिर से इतिहास से खोलें)। मैंने नीचे दिए गए समाधान को पोस्ट किया है। यदि आप इस पर टिप्पणी कर सकते हैं तो अच्छा होगा।
tato.rodrigo

2
दुर्भाग्य से यह हमारे लिए काम नहीं करता है। हम यह पता लगा रहे हैं कि एक नई गतिविधि शुरू करना, जो प्रारंभिक गतिविधि को शुरू करता है, उसी इरादे से OnNewIntent को फिर से आग लगाने का कारण बनता है।
ले-रॉय स्टेंस

2
इरादे को साफ करने के बजाय, आप लॉन्च प्रकार निर्धारित कर सकते हैं और तदनुसार एप्लिकेशन प्रवाह को संभाल सकते हैं। अगर यह अधिसूचना के लिए लॉन्च किया गया है और पृष्ठभूमि से नहीं, तो ही एक्स्ट्रा प्राप्त करें। stackoverflow.com/questions/4116110/clearing-intent/…
BB

2
मेरे लिए काम नहीं किया। मैं उसी मुद्दे का सामना कर रहा था, जैसा @ tato.rodrigo ने उल्लेख किया था कि जहां इरादा साफ नहीं हो रहा था अगर गतिविधि अधिसूचना के माध्यम से खोली जाती है या इतिहास या अन्य कारणों से जिसका उन्होंने उल्लेख किया है, इसलिए मैंने इरादा जानकारी का उपभोग करने के बाद क्या किया था जैसे इरादे को रीसेट करना यह setIntent(new Intent())और अब इसका ठीक काम है।
शुभ्र

43

संपादित करें: मैं अपने द्वारा उपयोग किए जा रहे संपूर्ण समाधान को पोस्ट करने के लिए संपादन कर रहा हूं।

यह समाधान काम करेगा यदि समस्या "इतिहास (हाल के ऐप्स) से गतिविधि शुरू होने पर कुछ कोड निष्पादित न करें"

सबसे पहले, एक की घोषणा booleanअपने में Activityअगर इंगित करने के लिए Intentपहले से ही भस्म हो गया था:

    private boolean consumedIntent;

फिर, कॉन्फ़िगरेशन परिवर्तन और मामलों को संभालने के लिए विधियों onSaveInstanceStateऔर onCreateविधियों का उपयोग करके इस मान को सुरक्षित रूप से संग्रहीत और पुनर्स्थापित करें जो सिस्टम Activityपृष्ठभूमि पर जाने पर आपको मार सकता है ।

    private final String SAVED_INSTANCE_STATE_CONSUMED_INTENT = "SAVED_INSTANCE_STATE_CONSUMED_INTENT";

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(SAVED_INSTANCE_STATE_CONSUMED_INTENT, consumedIntent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //set content view ...

        if( savedInstanceState != null ) {
            consumedIntent = savedInstanceState.getBoolean(SAVED_INSTANCE_STATE_CONSUMED_INTENT);
        }

        //other initializations
    }

अब, जांचें कि क्या आप अपना कोड onResumeविधि के तहत चला सकते हैं ।

    @Override
    protected void onResume() {
        super.onResume();

        //check if this intent should run your code
        //for example, check the Intent action
        boolean shouldThisIntentTriggerMyCode = [...];
        Intent intent = getIntent();
        boolean launchedFromHistory = intent != null ? (intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0 : false;
        if( !launchedFromHistory && shouldThisIntentTriggerMyCode && !consumedIntent ) {
            consumedIntent = true;
            //execute the code that should be executed if the activity was not launched from history
        }
    }

इसके अतिरिक्त, यदि आपका Activityकॉन्फ़िगर किया गया है singleTop, तो आपको अपना फ्लैग रीसेट करना चाहिए जब एक नया Intentडिलीवर किया जाता है।

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        consumedIntent = false;
    }

12
आपका बहुत बहुत धन्यवाद! मुझे इस कोड में मदद मिली है (intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)इसलिए अब मैं यह पता लगा सकता हूं कि गतिविधि की शुरुआत कब इतिहास से होती है और मैं अपने एक्स्ट्रा को अनदेखा कर सकता हूं।
रोमन नज़ारेविच

1
@ Lemberg मुझे भी यही समस्या है, और मैंने आपकी तरह ही हल किया है, यदि आप कुछ एक्स्ट्रा का उपयोग करते हैं, जो पुश नोटिफिकेशन से आया है, तो आपकी गतिविधि को इतिहास से शुरू करने का जोखिम है और रास्ते आपके एक्सट्रैस का उपभोग करते हैं और आपकी जैसी कार्रवाई के लिए रीडायरेक्ट करते हैं अधिसूचना करें। यह लॉन्च करने के लिए
फ्लैगफ्रेमहिस्टर

क्या यह तब भी काम करने वाला है जब गतिविधि नष्ट हो गई थी और हम इसे इतिहास के ढेर से फिर से खोल दें?
user25

महान! अगर ऐप नष्ट हो गया तो भी यह काम करने लगता है ... लेकिन कृपया @ tato.rodrigo boolean shouldThisIntentTriggerMyCode = [...];उत्तर से हटाएं (इसका उपयोग किस लिए किया जाता है?)
user25

निश्चित उपयोगकर्ता के लिए बहु सूचनाओं के साथ मेरे मामले में यह बेहतर प्रयोक्ता है consumedIntentके रूप में Stringअधिसूचना Uid हैं। इस यूआईडी को वर्तमान टाइमस्टैम्प के रूप में बैकएंड पर अधिसूचना में जोड़ा जा सकता है। इसके अलावा आपको इस यूआईडी को onSaveInstanceStateकेवल तभी सेव करना चाहिए जब इंटेंट फॉर्म में आ रहा है onCreate। इसका मतलब है कि आपको यूआईडी से बचाना नहीं चाहिए onNewIntent
कोनस्टेंटिन कोनपोको

22

एक अतिरिक्त समाशोधन के लिए मैक जवाब काम करता है:

    getIntent().removeExtra("key"); 

एक और उपयोगी कमांड है:

    getIntent().setAction("");

आप कॉल करके एक आशय भी टैग कर सकते हैं:

    getIntent().putExtra("used", true);

और फिर मूल्य के लिए जाँच करें।


21

जब हम इतिहास (हाल के ऐप्स) से एंड्रॉइड ऐप लॉन्च करते हैं, तो ऐप को मुख्य रूप से तीन अलग-अलग इरादों के झंडे के साथ लॉन्च किया जा सकता है।

  1. FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
    यह तब है जब एक्टिविटी को किसी ऐसे ऐप के इतिहास से लॉन्च किया जा रहा है जिसे कम से कम (लॉन्ग प्रेस होम की) किया गया था।
    लगातार मूल्य: 1048576 (0x00100000)
  2. FLAG_ACTIVITY_NEW_TASK
    यह तब होता है जब गतिविधि "क्लिकिंग एप्लीकेशन आइकन" या " इंटेंट फिल्टर " के माध्यम से लॉन्च की जाती है । यहां गतिविधि इस इतिहास स्टैक पर एक नए कार्य की शुरुआत बन जाएगी।
    लगातार मूल्य: 268435456 (0x10000000)
  3. FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY | FLAG_ACTIVITY_NEW_TASK
    यह तब है जब ऐप को वापस बटन दबाकर छोड़ दिया गया था और फिर इतिहास (हाल के ऐप्स) से फिर से शुरू किया गया।
    लगातार मूल्य: 269484032 (0x10100000)

लगातार मूल्य के माध्यम से प्राप्त किया जा सकता है getIntent().getFlags()

तीसरे मामले में, एंड्रॉइड अपनी मेमोरी से अंतिम इंटेंट मानों को फिर से लोड करता है। तो आपके ऐप का इरादा (getIntent ) अंतिम इरादे से मान होंगे जिन्होंने ऐप लॉन्च किया था।

वास्तव में, ऐप को ऐसा व्यवहार करना चाहिए जैसे कि यह एक ताज़ा लॉन्च है, जिसमें पिछले लॉन्च के इरादों के बजाय नए लॉन्च के लिए महत्व है। यह व्यवहार देखा जा सकता है यदि आप ऐप आइकन पर क्लिक करके ऐप लॉन्च करते हैं, तो इसमें कभी भी पुराने इरादे नहीं होंगे। ऐसा इसलिए है, क्योंकि एंड्रॉइड इस परिदृश्य के लिए निम्नलिखित इरादे फ़िल्टर का उपयोग करता है

 <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER"/>
 </intent-filter>

लेकिन तीसरे मामले में (ऐप को छोड़ दिया गया था, हाल ही के ऐप्स के इतिहास से लॉन्च किया गया है), एंड्रॉइड ओएस उस अंतिम इरादे का उपयोग करता है जिसने ऐप को छोड़ने से पहले लॉन्च किया था (बैक बटन दबाकर)। इसलिए आपके पास पुराने इरादे हैं और ऐप का प्रवाह उचित नहीं है।

आशय निकालना, इसे हल करने का एक तरीका है, लेकिन यह पूरी तरह से मुद्दे को हल नहीं करेगा! जैसा कि एंड्रॉइड ओएस पिछले लॉन्च के एप्लिकेशन से इरादे को फिर से लोड करता है, और लॉन्च इरादे का अंतिम उदाहरण नहीं है।

ऐसा होने से बचने का एक साफ तरीका है, लॉन्च प्रकार निर्धारित करने के लिए इरादे के प्रकार को प्राप्त करना ।

तो अपने LaunchActivity में (एक जो लक्ष्य फ़िल्टर मेनिफेस्ट में परिभाषित किया गया है), तो आपको निम्न कोड में इस्तेमाल कर सकते हैं onCreate(), onStart()या onResume()तरीकों।

if(getIntent().getFlags() == (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)) {
    //app is launched from recent apps after it was closed
        normalLaunch();
    } else {
        String intentAction = getIntent().getAction();
        String scheme = getIntent().getScheme();
        //app is launched via other means
        // URL intent scheme, Intent action etc
        if("https".equalsIgnoreCase(scheme)) {
            // URL intent for browser
        } else if("com.example.bb".equalsIgnoreCase(intentAction)) {
            // App launched via package name
        } else {
            // App was launched via Click on App Icon, or other means
            normalLaunch();
        }
    }

मुझे लगता है normalLaunch(), आशय से मापदंडों का उपयोग नहीं करना चाहिए; अन्यथा आपको अलग-अलग मापदंडों का उपयोग न करने के लिए अपनी डिफ़ॉल्ट लॉन्च विधि को अलग करने और अनुकूलित करने की आवश्यकता होगी।


1
सभी नायक टोपी नहीं पहनते हैं!
षड्गेशमी

मुझे नहीं पता, लेकिन यह हमेशा सच getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORYहोता है अगर मैं किसी अन्य गतिविधि (प्रारंभ विधि) से गतिविधि शुरू करता हूं या इतिहास स्टैक (हाल के ऐप्स) से इसे फिर से खोल देता हूं तो कोई फर्क नहीं पड़ता।
user25

आपको इसे किसी अन्य झंडे के साथ संयोजन में उपयोग करना होगा, हो सकता है कि FLAG_ACTIVITY_NEW_TASK
BB

1
यह तब काम नहीं करता है जब देव सेटिंग्स "गतिविधियों को न रखें" के कारण पृष्ठभूमि में गतिविधि को मार दिया गया था। इस मामले में getIntent () getFlags () समान है जब गतिविधि पहली बार शुरू हुई थी।
मैलाकियाज़

स्पष्टीकरण की सराहना करते हैं, लेकिन यह इरादा नहीं है
अजलान जमाल

18

आशय वस्तु साफ़ करना :

intent.replaceExtras(new Bundle());
intent.setAction("");
intent.setData(null);
intent.setFlags(0);

2
यह स्वीकृत उत्तर होना चाहिए। वास्तव में अच्छी तरह से काम करता है!
मार्टिन एरिक

2
डेवलपर के विकल्पों पर "गतिविधियों को न रखें" पर काम नहीं किया जाता है
Jemshit Iskenderov

8

संक्षिप्त उत्तर कोई रास्ता नहीं है

लंबा जवाब। "वन-शॉट" इरादे जैसी कोई चीज नहीं है। प्रयोग से यह देखा गया है कि आधुनिक एंड्रॉइड में हाल की गतिविधि का इतिहास "आशय इतिहास" से ज्यादा कुछ नहीं है। गतिविधि के लिए दिया गया नवीनतम आशय बस सिस्टम में लॉग इन है और यह सौदा है। ऊपर दिए गए फोल्क्स उपयोग करने का सुझाव देते हैं

setAction("")

लेकिन यह काम नहीं करता है क्योंकि आशय पहले ही लॉग ऑन है जब तक कि आप इसे onNewIntent () या onStart () विधि से प्राप्त नहीं कर लेते।

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

एल्गोरिथ्म:

  1. अधिसूचना नियंत्रण के लिए PendingIntent बनाएं जो गतिविधि के लिए "बाहर निकलें" कार्रवाई करता है। लेकिन विशेष गतिविधि के लिए जो एक सरल प्रॉक्सी है।
  2. प्रॉक्सी गतिविधि onStart () कोड इरादे को पार्स करता है, कार्रवाई की जांच करता है और कुछ मॉडल की स्थिति को "बाहर" के लिए सेट करता है।
  3. प्रॉक्सी गतिविधि onStart () कोड setIntent ("") का उपयोग करके मूल इरादे को साफ करता है और फिर इसे startActivity (आशय) कहकर "रूट" गतिविधि को गंतव्य तक पहुंचाता है।
  4. प्रॉक्सी गतिविधि onStart () कोड इनवॉइस फिनिश ()।
  5. OnStart () और onNewIntent () गंतव्य गतिविधि चेक मॉडल स्थिति और कॉल फिनिश () के अंदर अगर यह "बाहर" है (और मेरे मामले में स्टॉप सर्विस भी कहते हैं)।

मुझे उम्मीद है कि यह किसी की मदद करेगा क्योंकि मुझे इंटरनेट में इसका जवाब नहीं मिला।


मुझे यह सबसे सटीक उत्तर लगता है, क्योंकि "इरादे को साफ करना" जरूरी नहीं है कि "कुछ अतिरिक्त को हटा दें"। मुझे भी नहीं लगता कि ऐसा करने का कोई आसान तरीका है।
mdelolmo

5

सुनिश्चित करें कि आप उपयोग कर रहे हैं PendingIntent.FLAG_UPDATE_CURRENT के लिए झंडा PendingIntent

PendingIntent pendingIntent = PendingIntent.getActivity(this, 100, mPutIntent, PendingIntent.FLAG_UPDATE_CURRENT);

कहाँ mPutIntentअपने है Intent

आशा है कि यह आपकी मदद करेगा।


1
मेरी ज़िंदगी बचाई!!
eren130

1
मुझे यह नहीं मिलता कि यह स्वीकृत उत्तर कैसे नहीं है। मेरा एक ही अफसोस है, लेकिन एक: एक ही अपटूडेट होना। चीयर्स।
एंडी

2

मुझे हाल ही में यह समस्या हुई थी और मैंने इरादे के अतिरिक्त पैरामीटर के रूप में टाइमस्टैम्प जोड़कर इसे हल किया:

private void launchActivity(Context context) {
    Intent intent = new Intent(context, MainActivity.class);
    intent.putExtra("KEY_EXTRA_TIMESTAMP", System.currentTimeMillis());
    context.startActivity(intent);
}

उसके बाद, साझा प्राथमिकताओं के लिए टाइमस्टैम्प को सहेजें:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    long time = getIntent().getLongExtra("KEY_EXTRA_TIMESTAMP", -1);
    long previousTime = getPreferences(MODE_PRIVATE).getLong("timestamp", -1);

    //ignore if the timestamp is the same as the previous one  
    if (time != previousTime) {
        handleIntent(getIntent());
        if (time != -1) {
            //save the timestamp
            getPreferences(MODE_PRIVATE).edit().putLong("timestamp", time).apply();
        }
    }
}

1

मुझे ठीक वैसी ही समस्या हुई है। मेरा समाधान booleanवैरिएबल को जोड़ना था जो सेट किया Intentगया था जब 'इस्तेमाल' किया गया था और ifइस पर आधारित बयान यह booleanजांचने के लिए कि आपको उपयोग करना चाहिए Intentया नहीं।


3
यह काम नहीं कर सकता है, क्योंकि गतिविधि बंद हो जाने और फिर से शुरू होने पर बूलियन मान फिर से प्राप्त हो जाएंगे (यदि गतिविधि में वैश्विक घोषित किए गए हैं)। (उदाहरण के लिए होम बटन पर क्लिक करना)
tony9099

1

जब आप उद्देश्य प्रसंस्करण कर रहे हैं, तो यह करें:

setIntent(null);

आप उस संसाधित इरादे को फिर से नहीं देखेंगे, और आप संसाधित इरादे की सामग्री को संपादित करके समस्या का सामना नहीं करेंगे।


1

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

समस्या के समाधान के रूप में , मैं इंटेंट एक्सट्रैस के संसाधित होने के बाद शेयर्डप्रिफरेंस में बूलियन मूल्य संग्रहीत करता हूं । जब उसी इरादे को गतिविधि में बदल दिया जाता है, तो मैं SharedPreference मूल्य की जांच करता हूं और आशय अतिरिक्त को संसाधित करने का निर्णय लेता हूं। यदि आप एक ही गतिविधि के लिए एक और नया इरादा अतिरिक्त भेजते हैं, तो आप साझाकरण मूल्य को गलत बनाते हैं और गतिविधि इसे संसाधित करेगी। उदाहरण :

// Start Activity with Intent Extras
Intent intent = new Intent(context, MyActivity.class);
intent.putExtra("someData", "my Data");
// Set data as not processed
context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE).edit().putBoolean("myActivityExtraProccessed", false).commit();
context.startActivity(intent);

...

public class MyActivity{

    ...
    public void someMethod(){
        boolean isExtrasProcessed = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE).getBoolean("myActivityExtraProccessed", false);  
         if (!isExtrasProcessed) {
              // Use Extras

              //Set data as processed
              context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE).edit().putBoolean("myActivityExtraProccessed", true).commit();
         }
    }

}

वरीयता का कोई मतलब नहीं है क्योंकि आप यह नहीं जानते हैं कि क्या आपने शुरुआत का उपयोग करके गतिविधि शुरू की है या आप इसे इतिहास स्टैक से फिर से खोलते हैं ...
user25

@ user25 मुझे लगता है कि यह पता लगाने का एक तरीका था कि क्या इसे हाल के ऐप्स से लॉन्च किया गया है। लेकिन क्या यह मायने रखता है, इरादे अतिरिक्त या तो भस्म हो या नहीं, अगर इसका सेवन किया जाता है, तो इसे साझा प्रीफ़ से जान लें। मैंने इसका इस्तेमाल पुश नोटिफिकेशन एक्स्ट्रा के लिए किया है और इससे कोई फर्क नहीं पड़ता कि मेरे केस के लिए एक्टिविटी कैसे खोली जाती है।
जेमशीट इस्केंडरोव

0

आशय और इरादे एक्स्ट्रा को मैन्युअल रूप से साफ़ करने के बाद भी, जब उन्हें पार्स किया जाता है, तो ऐसा लगता है जैसे एक्टिविटी को शुरू करने के बाद एक्टिविटी.गेंटइंटेंट () हमेशा वापस आ जाएगा।

इसके आसपास जाने के लिए, मैं कुछ इस तरह की सलाह देता हूं:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // The Intent provided by getIntent() (and its extras) will persist through a restore
    // via savedInstance.  Because of this, restoring this activity from a
    // an instance that was originally started with extras (deep-link or 
    // pre-defined destination) may cause un-desired behavior
    // (ie...infinite loop of sending the user directly to somewhere else because of a
    // pre-defined alternate destination in the Intent's extras).
    //
    // To get around this, if restoring from savedInstanceState, we explicitly
    // set a new Intent *** to override the original Intent that started the activity.***
    // Note...it is still possible to re-use the original Intent values...simply
    // set them in the savedInstanceState Bundle in onSavedInstanceState.
    if (savedInstanceState != null) {
        // Place savedInstanceState Bundle as the Intent "extras"
        setIntent(new Intent().putExtras(savedInstanceState));
    }

    processIntent(getIntent())
}

private void processIntent(Intent intent) {
    if (getIntent().getExtras() == null) {
        // Protection condition
        return;
    }

    doSomething(intent.getExtras.getString("SOMETHING_I_REALLY_NEED_TO_PERSIST"));

    final String somethingIDontWantToPersist = 
        intent.getExtras.getString("SOMETHING_I_DONT_WANT_TO_PERSIST");

    if(somethingIDontWantToPersist != null) {
        doSomething(somethingIDontWantToPersist);
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save selective extras from original Intent...
    savedInstanceState.putString("SOMETHING_I_REALLY_NEED_TO_PERSIST", "persistedValued");
    super.onSaveInstanceState(savedInstanceState);
}

इस तरह, मूल इरादे को डंप करने के लिए एक तंत्र है, जबकि अभी भी मूल इरादे / इरादे एक्स्ट्रा के कुछ हिस्सों को स्पष्ट रूप से बनाए रखने की क्षमता बरकरार है।

ध्यान दें कि मैंने सभी गतिविधि लॉन्च मोड का परीक्षण नहीं किया है।


0

सीधे आगे का तरीका onCreate () के अलावा अन्य तरीकों से getIntent () को कॉल करने से बचना है। लेकिन यह अगले लॉन्च के दौरान समस्या पैदा करेगा अगर उपयोगकर्ता होम बटन को टैप करके हमारी गतिविधि को छोड़ देता है। मुझे लगता है कि इस समस्या का पूरी तरह कार्यात्मक समाधान नहीं है।


0

मैं एक ही समस्या का सामना करता हूं और उपरोक्त तरीकों का उपयोग करने की कोशिश करता हूं लेकिन यह काम नहीं करता है।

मुझे लगता है कि यह एसिटविटी के लॉन्च मोड का कारण हो सकता है जो मैंने सिंगलटॉप मोड का इस्तेमाल किया था।

जब मैं बैकग्राउंड ऐप और रामएटर का उपयोग उस मुद्दे को अनुकरण करने के लिए करता हूं, जिसमें इरादे हमेशा अतिरिक्त होते हैं, भले ही मैंने इसे शून्य या कुंजी को हटा दिया हो।

यह समस्या एंड्रॉइड पर वरीयता संग्रहण का उपयोग करके जांचने के लिए चली गई है।


0

यह एक अच्छा अभ्यास नहीं है कि अतिरिक्त अतिरिक्त जोड़ने के लिए पता है कि अतिरिक्त सेवन किया गया है या नहीं, ऐसा क्यों नहीं कर रहा है ?:

if (intent.hasExtra(EXTRA_NAME) && intent.getBooleanExtra(EXTRA_NAME, false)) {
    // consume extra here after that set it to false
    putExtra(EXTRA_NAME, false)
}   

-1

इस बारे में कैसा है? इरादे के रूप में नया सेट करता है।

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

1
मुझे नहीं लगता कि वह काम करता है। जब गतिविधि को इतिहास से दोबारा बनाया जाता है, तो इरादा अप्रभावित रहता है।
mdelolmo

-1

कैसे के बारे में जब आप इरादे को साफ करना चाहते हैं - इसे एक खाली के साथ बदलें?

जैसे।

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

@Override 
public void onResume() {
    super.onResume();

    Intent theIntent = getIntent();
    if ("myaction".equals(theIntent.getAction()) {
         handleIntent();
         onNewIntent(new Intent());  // <--- "clear" the intent by setting empty one
    }
}

-1

इससे सभी को उम्मीद होगी। इसलिए पहले हम इरादा कर लें

//globally
Intent myIntent;

इसे कहीं भी ऑनक्रिएट करें

myIntent = getIntent();
String data = myIntent.getStringExtra("yourdata");
//Your process here

अब इसे सेट करने देता है ताकि हमारा ऐप नष्ट हो जाए या बाहर निकल जाए हम डेटा हटा देंगे

@Override
protected void onDestroy() {
    //TODO: Clear intents
    super.onDestroy();
    myIntent.removeExtra("data");
}
@Override
protected void onBackPressed() {
    //TODO: Clear intents
    super.onBackPressed();
    myIntent.removeExtra("data");
}

आपको यह विचार मिलता है, यदि यह पर्याप्त नहीं है तो 'कॉलबैक' पर अधिक खोजें


जब आप ऐप से बाहर निकलते हैं, तो इरादा साफ हो जाता है, जैसे। पुनर्पाठ को स्वाइप करना।
Pixeldroid Modding

-2

जबकि Intent.removeExtra("key")एक्स्ट्रा से एक विशिष्ट कुंजी को हटा दिया जाएगा, वहाँ भी है विधि Intent.replaceExtras (बंडल) , जिसका उपयोग इंटेंट से पूरे एक्स्ट्रा को हटाने के लिए किया जा सकता है, अगर nullएक पैरामीटर के रूप में पारित किया जाता है।

डॉक्स से:

एक्स्ट्रा के दिए गए बंडल के साथ इंटेंट में एक्स्ट्रास को पूरी तरह से बदलें।

पैरामीटर
एक्स्ट्रा कलाकार एक्स्ट्रा में नया सेट, या सभी एक्स्ट्रा को मिटाने के लिए शून्य।

क्योंकि पुटएक्सएक्सएक्सएक्स (एक्सट्रा) एक्सट्रैस को एक ताजा बंडल के साथ शुरू करते हैं यदि इसकी नल, यह कोई समस्या नहीं है।


-3
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addCategory(Intent.CATEGORY_HOME);  
startActivity(intent);

2
आपको अपने उत्तर के बारे में विस्तार से विचार करना चाहिए कि आप क्या कर रहे हैं और कैसे यह ओपी के प्रश्न का उत्तर देता है।
१२:२

1
@ रामकुमार यह उपयोगकर्ता को घर ले जाता है। जो स्पष्ट रूप से 10000 मामलों में से केवल एक ही मामला है जो ऑनपॉज़ का कारण बन सकता है, ऑनटॉप या ऑनडेस्ट्रॉय कहलाता है।
tony9099

यह भी दूर से संबंधित सवाल नहीं है
होसैन शाहदोस्त
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.