2013-10-02 7 views
10

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

मैं क्या करने की कोशिश की

मैं एक आधार गतिविधि बनाया है और फिर से शुरू घटना पर यदि काउंटर शून्य है, मैं सत्र और वेतन वृद्धि शुरू काउंटर और स्टॉप इवेंट पर, मैं काउंटर कम करता हूं और यदि काउंटर शून्य है, तो मैं सत्र

रोकता हूं लेकिन यह ट्रैकिंग की वास्तविक समस्या की गणना नहीं करेगा क्योंकि एंड्रॉइड गतिविधि को रोक नहीं देता है क्योंकि उपयोगकर्ता किसी अन्य ऐप पर स्विच करता है।

तो ऐसी चीज हासिल करने का कोई तरीका है।

अतिरिक्त:

हम लगाने देती है गतिविधि स्क्रीन पर सक्रिय है, इसलिए घटना शुरू करने या अंत सत्र के लिए इस्तेमाल किया जा सकता प्राप्त कर सकते हैं।

उत्तर

0

आपको एंड्रॉइड पर गतिविधि जीवनशैली देखने की आवश्यकता है।

आपको क्या चाहिए है - प्रलेखन here

मैं भी है कि जब भी कई गतिविधियों के बीच स्विच onPause निकाल दिया जाता है का उल्लेख होता देखते हैं, तो आप जब यह एक और स्क्रीन पर जाने के रोक रहा है ट्रैक करने की जरूरत होगी।

विकल्प 1::

आप एक सेवा है जो अग्रभूमि पर वर्तमान आवेदन के लिए स्कैन करता है बना सकते हैं और अगर यह आपके गतिविधि है देख सकते हैं

+0

इसलिए ऑनपॉज़ का उपयोग करने से यह ऐप जानकारी नहीं देगी कि यह किसी अन्य ऐप या किसी अन्य गतिविधि पर स्विच कर रहा है ... – Kasma

+0

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

+0

लेकिन यह ट्रैक करने के लिए कि क्या यह किसी अन्य गतिविधि पर जा रहा है ... – Kasma

5

मैं इसे करने के दो तरीके के बारे में सोच सकते हैं। इधर, कुछ कोड का उपयोग कर सकते है मैं एक और उत्तर से ले लिया:

ActivityManager सेवा से चल रहे कार्यों के की सूची प्राप्त करने के लिए एक आसान तरीका नहीं है। आप फ़ोन पर चल रहे कार्यों की अधिकतम संख्या का अनुरोध कर सकते हैं, और डिफ़ॉल्ट रूप से, वर्तमान में सक्रिय कार्य पहले लौटाया गया है।

एक बार आपके पास यह है कि आप को अपनी सूची से शीर्ष सक्रियता का अनुरोध करके एक घटक नाम वस्तु प्राप्त कर सकते हैं।

यहां एक उदाहरण है। जवाब देने के लिए

<uses-permission android:name="android.permission.GET_TASKS"/> 

लिंक::

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); 

    // get the info from the currently running task 
    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 

    Log.d("topActivity", "CURRENT Activity ::" 
      + taskInfo.get(0).topActivity.getClassName()); 

    ComponentName componentInfo = taskInfo.get(0).topActivity; 
    componentInfo.getPackageName(); 

आप अपने प्रकट पर निम्न अनुमति की आवश्यकता होगी Android: How can I get the current foreground activity (from a service)?

आप अपने ऐप अगर पता लगाने के लिए इस हर एक सेकंड या उससे कम कॉल कर सकते हैं अभी भी सक्रिय हैकृपया ध्यान दें कि यह एक अनुचित बताया गया है और चीजों की इस तरह के प्रयोग करने के लिए अनुशंसित नहीं है, आधिकारिक दस्तावेज के अनुसार:

getRunningTasks()

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


विकल्प 2:

दूसरा विकल्प अगर आपके आवेदन पर है एक वर्ग है कि एक ध्वज के साथ Application फैली हुई है, उदाहरण के लिए isAppRunning है, जो सच या अनुसार झूठी हो जाएगा बनाने के लिए है foreground या नहीं:

public class MyAppContext extends Application { 

    public boolean isAppRunning = true; 

    public void setIsAppRunning(boolean v){ 
     isAppRunning = v; 
    } 

    public boolean isAppRunning(){ 
     return isAppRunning; 
    } 

} 

Then पर अपने AndroidManifest.xml आप Have को add इस class इतना यह इच्छाशक्ति be used when अपने applic आयन शुरू होता है। हर बार

class BaseActivity extends Activity { 


    @Override 
    protected void onResume() { 
     super.onResume(); 
     ((MyAppContext)getApplication()).setIsAppRunning(true); 
    } 

    @Override 
    protected void onPause() { 
     ((MyAppContext)getApplication()).setIsAppRunning(false); 
     super.onPause(); 
    } 
} 

इस तरह पर आप: हर गतिविधि आप आप onResume() और onPause() ओवरराइड और इसी मूल्य को ध्वज सेट करना चाहिए कि में

<application 
     android:name=".MyAppContext" 

अब: बस आवेदन टैग के तहत android:name=".MyAppContext" जोड़ने MyAppContext में isAppRunning में होगा, लेकिन यदि कोई अन्य गतिविधि खुलती है (उदाहरण के लिए यदि आप बैक बटन दबाते हैं तो आप वापस लौट रहे हैं पिछली गतिविधि) मूल्य तुरंत true होगा।

जब आप अंत में अपने सभी क्रियाएँ onResume() तरीकों में से कोई भी बुलाया जाएगा समाप्त करने और सभी onPause() तरीकों बुलाया जाएगा तो isAppRunningfalse हो जाएगा और आप जानते हैं कि आपके Activity नहीं रह गया है अग्रभूमि पर।

तो isAppRunningtrue आपका आवेदन अग्रभूमि पर है (सत्र ट्रैकिंग शुरू करें) अन्यथा यह चला गया है (सत्र ट्रैकिंग रोकें)। आप समय-समय isAppRunning के मान की जाँच करने के लिए एक MyAppContext में Timer वर्ग बना सकते हैं, तो यह होगा:

public class MyAppContext extends Application { 

    public boolean isAppRunning = true; 
    public final int timerRate = 500; // Execute timer task every 500mS 

    public void setIsAppRunning(boolean v){ 
     isAppRunning = v; 
    } 

    public boolean isAppRunning(){ 
     return isAppRunning; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Timer mTimer = new Timer(); 

     mTimer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      if(isAppRunning) startSesionTracking(); 
      else stopSesionTracking(); 
     } 
     }, 0, REFRESH_TIME); 
    } 

    private void startSesionTracking() { ... }; 
    private void stopSesionTracking() { ... }; 

} 

आप सटीक आप अपने सत्र ट्रैकिंग में प्राप्त करना चाहते हैं के अनुसार timerRate संशोधित करना चाहिए।

+0

यह एक बहिष्कृत एपीआई है और हमेशा सही मान नहीं देता है। मुझे अपने ऐप में इसका इस्तेमाल करने के लिए मजबूर होना पड़ता है और यह हर समय काम नहीं करता है। एपीआई दस्तावेज़ स्पष्ट रूप से उल्लेख करते हैं। –

+0

हां, लेकिन मैं किसी गतिविधि को ट्रैक करने के लिए किसी और चीज के बारे में नहीं सोच सकता। – Andres

2

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

class BaseActivity extends Activity { 


    @Override 
    protected void onResume() { 
     super.onResume(); 
     // Start Logging 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     // End Logging 
    } 
} 
+0

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

0

1. AppLifecycleTracker नामक एक वर्ग बनाएं और इसे पेस्ट करें।

private class AppLifecycleTracker implements ActivityLifecycleCallbacks { 
      private int numStarted = 0; 
      private String TAG = "AppLifecycleTracker"; 


      private int numOfCreated = 0; 

      @Override`enter code here` 
      public void onActivityCreated(Activity activity, Bundle bundle) { 
       if (numOfCreated == 0) { 
        Log.d(TAG, "onActivityCreated: app started"); 
       } 
       numOfCreated++; 
       Log.d(TAG, "onActivityCreated: " + numOfCreated); 
      } 

      @Override 
      public void onActivityStarted(Activity activity) { 
       if (numStarted == 0) { 
        // app went to foreground 
        Log.d(TAG, "onActivityStarted: foreground"); 

       } 
       numStarted++; 


      } 

      @Override 
      public void onActivityResumed(Activity activity) { 

      } 

      @Override 
      public void onActivityPaused(Activity activity) { 

      } 

      @Override 
      public void onActivityStopped(Activity activity) { 
       numStarted--; 
       if (numStarted == 0) { 
        // app went to background 
        Log.d(TAG, "onActivityStarted: background"); 

       } 
      } 

      @Override 
      public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { 

      } 

      @Override 
      public void onActivityDestroyed(Activity activity) { 
       numOfCreated--; 
       Log.d(TAG, "onActivityDestroyed: " + numOfCreated); 
      } 
     } 

* onActivityCreate में अगर numOfCreated = 0, तो आप कह सकते हैं एप्लिकेशन शुरू कर दिया है। * पर एक्टिविटी में अगर numOfCreated = 0 है, तो आप कह सकते हैं कि ऐप बंद है।

  1. एक वर्ग का विस्तार आवेदन बनाएँ, onCreate में, इस लाइन

    registerActivityLifecycleCallbacks जोड़ने (नई AppLifecycleTracker()); Manifest.xml

यही उस में आवेदन वर्ग के रूप में

  • सेट आवेदन नाम। तुम तैयार हो।

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