डी 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);
}
स्रोत
2015-05-16 19:16:56
एक ऐसी गतिविधि बनाएं जो आपके लिए एक टैग सेट करे और अपनी वर्तमान गतिविधियों में गतिविधि को विस्तारित करने के बजाय उस वर्ग का विस्तार करे। इस तरह आपको केवल एक बार कोड लिखना होगा। – zgc7009
@ zgc7009 एक ऐसा विचार प्रस्तुत करता है जो अक्सर अच्छी तरह से काम करता है। पकड़ यह है कि अगर आपकी कुछ गतिविधियों को कुछ अन्य लाइब्रेरी से आने वाली गतिविधि के कुछ पहले से ही विशेष भिन्नता को बढ़ाने की आवश्यकता है - तो आपको भी इसका एक विशेष संस्करण बनाना होगा। –
@ChrisStratton यह भी जब कोई गतिविधि बंद हो जाती है, तो चेक-इन और चेकआउट नहीं करना चाहता, बल्कि जब एप्लिकेशन लॉन्च या फिर से शुरू किया जाता है। इसलिए जब आप ऐप खोलते हैं तो आप गतिविधियों के बीच बंद या आगे बढ़ते समय समस्याग्रस्त हो सकते हैं। – ngoa