2015-04-28 6 views
6

मैं ऐप खोले/बंद होने पर हर बार सर्वर के साथ चेक-इन और चेकआउट करना चाहता हूं, चाहे वह लॉन्च ड्रॉवर से लॉन्च हो या फिर से शुरू हो। क्या प्रत्येक गतिविधि में फ़ंक्शन को कॉल करने से बचने के दौरान ऐसा करने का कोई तरीका है?पता लगाएं कि ऐप कब खोला गया है/फिर से शुरू किया गया है

धन्यवाद!

+1

एक ऐसी गतिविधि बनाएं जो आपके लिए एक टैग सेट करे और अपनी वर्तमान गतिविधियों में गतिविधि को विस्तारित करने के बजाय उस वर्ग का विस्तार करे। इस तरह आपको केवल एक बार कोड लिखना होगा। – zgc7009

+0

@ zgc7009 एक ऐसा विचार प्रस्तुत करता है जो अक्सर अच्छी तरह से काम करता है। पकड़ यह है कि अगर आपकी कुछ गतिविधियों को कुछ अन्य लाइब्रेरी से आने वाली गतिविधि के कुछ पहले से ही विशेष भिन्नता को बढ़ाने की आवश्यकता है - तो आपको भी इसका एक विशेष संस्करण बनाना होगा। –

+0

@ChrisStratton यह भी जब कोई गतिविधि बंद हो जाती है, तो चेक-इन और चेकआउट नहीं करना चाहता, बल्कि जब एप्लिकेशन लॉन्च या फिर से शुरू किया जाता है। इसलिए जब आप ऐप खोलते हैं तो आप गतिविधियों के बीच बंद या आगे बढ़ते समय समस्याग्रस्त हो सकते हैं। – ngoa

उत्तर

7

डी 60402 here द्वारा प्रदान किया गया उत्तर और Application.registerActivityLifecycleCallbacks() का उपयोग करके गतिविधि कॉलबैक पंजीकृत करने के लिए हनो बाइंडर द्वारा दिए गए सुझाव ने मुझे इस समाधान का नेतृत्व किया।

मैंने गतिविधि विधियों पर आवेदन और पंजीकृत कॉलबैक बढ़ाए और नीचे दिखाए गए अनुसार चालू करें। इन तरीकों में एक टाइमर शुरू/बंद हो जाता है (एक गतिविधि बाहर निकलती है जहां पर रोक दिया जाता है, एक नया प्रवेश किया जाता है जहां ऑनस्टार्ट कहा जाता है)। जब ध्वज पृष्ठभूमि/अग्रभूमि (सत्य/झूठा) में होना निर्धारित होता है तो ध्वज "wasInBackground" को टॉगल किया जाता है। यदि ऑनस्टार्ट कॉलबैक चलाए जाने पर ऐप पृष्ठभूमि में था, तो "appEntered" कहा जाता है। यदि रोकें और ऑनस्टार्ट कॉलबैक के बीच पारित समय निर्दिष्ट समय से अधिक है (गतिविधि संक्रमण के लिए पर्याप्त समय दे रहा है) "appExited" कहा जाता है जहां ऐप सत्र समाप्त होने के लिए माना जाता है।

public class MyApplication extends Application { 

public static final String LOG_TAG = "MyApp"; 

public boolean wasInBackground = true; 

private AppSession appSession; 
private Timer mActivityTransitionTimer; 
private TimerTask mActivityTransitionTimerTask; 
private final long MAX_ACTIVITY_TRANSITION_TIME_MS = 2000; // Time allowed for transitions 

Application.ActivityLifecycleCallbacks activityCallbacks = new Application.ActivityLifecycleCallbacks() { 

    @Override 
    public void onActivityResumed(Activity activity) { 

     if (wasInBackground) { 
      //Do app-wide came-here-from-background code 
      appEntered(); 
     } 
     stopActivityTransitionTimer(); 
    } 

    @Override 
    public void onActivityPaused(Activity activity) { 
     startActivityTransitionTimer(); 
    } 

    ... 

}; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    registerActivityLifecycleCallbacks(activityCallbacks); 
} 

public void startActivityTransitionTimer() { 
    this.mActivityTransitionTimer = new Timer(); 
    this.mActivityTransitionTimerTask = new TimerTask() { 
     public void run() { 
      // Task is run when app is exited 
      wasInBackground = true; 
      appExited(); 
     } 
    }; 

    this.mActivityTransitionTimer.schedule(mActivityTransitionTimerTask, 
      MAX_ACTIVITY_TRANSITION_TIME_MS); 
} 

public void stopActivityTransitionTimer() { 
    if (this.mActivityTransitionTimerTask != null) { 
     this.mActivityTransitionTimerTask.cancel(); 
    } 

    if (this.mActivityTransitionTimer != null) { 
     this.mActivityTransitionTimer.cancel(); 
    } 

    this.wasInBackground = false; 
} 

private void appEntered() { 
    Log.i(LOG_TAG, "APP ENTERED"); 

    appSession = new AppSession(); 
} 

private void appExited() { 
    Log.i(LOG_TAG, "APP EXITED"); 

    appSession.finishAppSession(); 

    // Submit AppSession to server 
    submitAppSession(appSession); 
    long sessionLength = (appSession.getT_close() - appSession.getT_open())/1000L; 
    Log.i(LOG_TAG, "Session Length: " + sessionLength); 
} 
+0

एक्टिविटी रिज्यूमेड और एक्टिविटी पर चलने के लिए यह बेहतर है, क्योंकि गतिविधियों को रोक दिया जा सकता है जब अन्य गतिविधियां अग्रभूमि में होती हैं। महान काम अन्यथा! –

+0

@Aakashjain अच्छी कॉल। हालांकि मैं उन परिस्थितियों को भी देख सकता हूं जहां पर एक्टिविटी स्टार्ट/ऑनएक्टिविटी पर रोक लगाया जा सकता है। मैंने आपकी प्रतिक्रिया को दर्शाने के लिए उत्तर अपडेट किया है। संक्षिप्त Google खोज ने मुझे जो उत्तर दिया था, वह उत्पन्न नहीं हुआ, इसलिए एक त्वरित प्रयोग आवश्यक हो सकता है। मेरा मानना ​​है कि चैटहेड्स और अन्य ऐप्स जो आंशिक रूप से दृश्य को बाधित करते हैं (यहां तक ​​कि अगर यह लगभग सभी भी) अंतर्निहित (आपके) अनुप्रयोग पर कॉल किए जाने के कारण सक्रियता का कारण बनता है। चूंकि उपयोगकर्ता अक्सर आंशिक रूप से दिखाई देने वाले ऐप को जारी रखने का इरादा रखता है, इसलिए आप उस सत्र को स्टार्ट/स्टॉप कॉम्बो के साथ चलाना चाह सकते हैं। –

+0

क्या आपके पास इसका उदाहरण है कि आप किस बारे में बात कर रहे हैं या मैंने इसे प्रदान किया है? –

0

आप oncreate() और onpause() विधियों का उपयोग कर सकते हैं।

+0

यह आंशिक रूप से सही है ! – ngoa

+0

@ngoa क्या आप हमें बताएंगे, यह आंशिक रूप से (सही) क्यों है? –

+0

@ रेनेहोफमैन जैसा कि मैंने प्रश्न के तहत टिप्पणियों में उल्लेख किया है, वह गतिविधि बंद होने पर चेकइन और चेकआउट नहीं करना चाहता, बल्कि जब एप्लिकेशन लॉन्च या फिर से शुरू किया जाता है। इसलिए जब आप ऐप खोलते हैं तो आप गतिविधियों के बीच बंद या आगे बढ़ते समय समस्याग्रस्त हो सकते हैं, जो अभी भी 'ऑनक्रेट() 'और' रोक() 'फ़ंक्शंस को कॉल करेगा। – ngoa

6

आप Application.registerActivityLifecycleCallbacks() & सी देख सकते हैं।

+0

प्रदान किया गया लक्ष्यीकरण एपीआई 14+ (एंड्रॉइड 4.x या बाद में) स्वीकार्य है, यह एक बहुत ही रोचक विचार है –

+0

अभी तक इसे लागू नहीं किया है, लेकिन दस्तावेज पर जाकर और @ngoa द्वारा प्रदान किए गए लिंक से परामर्श करने के बाद (http: // stackoverflow .com/प्रश्न/4414171/कैसे-से-पता-कब-एक-एंड्रॉइड-ऐप-द-द-द-बैक-द-द-द-बैक-टू-द-द-द-फू) मेरा मानना ​​है कि यह अच्छी तरह से काम करेगा। अंतर्दृष्टि के लिए धन्यवाद! –

+1

@TomMcFarlin धन्यवाद। मैं इसे एक उत्तर के रूप में पोस्ट करूंगा। – ngoa

1

ठीक है। मैं अपनी टिप्पणियों को उत्तर के रूप में पोस्ट कर रहा हूं क्योंकि मूल उपयोगकर्ता ने सवाल पूछा कि यह वास्तव में सहायक है।

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

इस समस्या पर पहले स्टैक ओवरफ्लो पर भी चर्चा की गई थी। नीचे लिंक है।

How to detect when an Android app goes to the background and come back to the foreground

इस समस्या को हल करने के बारे में अलग अलग तरीकों से हो सकता है। उपरोक्त लिंक इस बात पर अधिक अंतर्दृष्टि प्रदान करता है कि आप इसे कैसे हल कर सकते हैं।

+0

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

संबंधित मुद्दे