2016-10-26 14 views
9

मैं एक ऐप्स चौड़ा उपयोगिता वर्ग AppUtils, जहां मैं किसी भी दर पर एप्लिकेशन प्रासंगिक जानकारी प्रकाशित कर सकते हैं:वर्तमान देखें और कक्षा <?> वस्तुओं प्रबंध

  1. या तो एक Snackbar, जब मैं अनुप्रयोग में कर रहा हूँ के रूप में
  2. या अधिसूचना प्रबंधक

उदाहरण के लिए जब mesaages एक Snackbar मैं वर्तमान दिखाया गया दृश्य कंटेनर का ट्रैक की जरूरत Snackbar.make(view, text, length); में इसका उपयोग कब मैं द्वारा उस संदेश को प्रकाशित करना चाहते के रूप में जा रहा है के माध्यम से NotificationManager.notify(int, Builder); का मतलब है और मैं here

Intent resultIntent = new Intent(this, ResultActivity.class); 

में कक्षा हस्ताक्षर की जरूरत है इसलिए मैं अपने AppUtils में है:

public static void setCurrentViewAndClass(View v, Class<?> c) 
{ 
    view = v; // view is static 
    cls = c; // cls is static 
} 

जहाँ मैं हर जगह अपने प्रोजेक्ट (Snackbar पैरामीटर के लिए) वर्तमान दृश्य में से याद कर सकते हैं और सीएलएस (अधिसूचना इरादे के लिए)।

आगे, मैं उन पैरामीटर को साफ़ करता हूं, उदा। जब मैं पृष्ठभूमि एप्लिकेशन को छोड़: उन पैरामीटर नहीं अशक्त हैं

public static void clearCurrentViewAndClass() 
{ 
    view = null; 
    cls = null; 
} 

ए, मुझे पता है कि मेरे ऐप इसी दृष्टि से ध्यान केंद्रित किया और मैं एक Snackbar के रूप में प्रासंगिक संदेश दिखा सकते हैं। बी इन मानकों अशक्त कर रहे हैं, मुझे पता है कि मेरे ऐप पृष्ठभूमि में है और मैं एक अधिसूचना

तो जब भी एक टुकड़ा/गतिविधि बनाया है या फिर से शुरू है, मैं setClassAndview() इसे कहते हैं प्रासंगिक संदेश दिखाना चाहते हैं पैरामीटर को याद रखने के लिए प्रत्येक onResume() में।

क्या वर्तमान प्रदर्शित गतिविधि या सक्रिय कक्षा का ट्रैक पाने के लिए एक और शानदार तरीका है?

उत्तर

7

एक उदाहरण के रूप ... एक आवेदन वर्ग (MyApp) कि AndroidManifest में पंजीकृत है बनाने के लिए:

<application 
     android:name=".MyApp" 
     ...> 

MyApp आवेदन क्लास में।OnCreate() सेट:

registerActivityLifecycleCallbacks(new MyAppActivityLifecycleCallbacks()); 

MyApp में, एक स्थिर क्षेत्र है कि दृश्यमान गतिविधियां की गिनती और निर्धारित करने के लिए एक विधि रखती है बनाते हैं एप्लिकेशन को अग्रभूमि में है या नहीं:

private static int mActivityCount = 0; 

public static boolean isAppInForeground() { 
    return mActivityCount != 0; 
} 

और अंत में सेटअप दृश्यमान गतिविधियां की गिनती रखने के लिए अपने ActivityLifecycleCallbacks वर्ग:

private static final class MyAppActivityLifecycleCallbacks implements ActivityLifecycleCallbacks { 

     public void onActivityCreated(Activity activity, Bundle bundle) { 
      // No operations 
     } 

     public void onActivityDestroyed(Activity activity) { 
      // No operations 
     } 

     public void onActivityPaused(Activity activity) { 
      // No operations 
     } 

     public void onActivityResumed(Activity activity) { 
      // No operations 
     } 

     public void onActivitySaveInstanceState(Activity activity, Bundle outState) { 
      // No operations 
     } 

     public void onActivityStarted(Activity activity) { 
      mActivityCount++; 
     } 

     public void onActivityStopped(Activity activity) { 
      mActivityCount--; 
     } 
    } 

और अब आप MyApp.isAppInForeground कॉल करने के लिए सक्षम होना चाहिए() निर्धारित करें कि आपका क्रियाएँ के किसी भी वर्तमान में अग्रभूमि में हैं। यदि आपको वर्तमान दृश्य गतिविधि के संदर्भ की आवश्यकता है तो आप इसे यहां भी संभाल सकते हैं।

+0

को ट्रैक नहीं करना चाहता हूं यह क्रियाकलापों के लिए पूरी तरह से काम करता है; बहुत अच्छा! क्या टुकड़ों के लिए कुछ समान है? –

+0

एंड्रॉइड एसडीके इसे टुकड़ों के लिए प्रदान नहीं करता है, लेकिन आप बेस फ्रैगमेंट बना सकते हैं कि आपके सभी टुकड़े विस्तार से हैं। उस बेस फ्रैगमेंट लाइफसिकल घटनाओं में, आप कॉलबैक करेंगे। और आपकी एप्लिकेशन क्लास उन कॉलबैक के श्रोता के रूप में सेट की जा सकती है। –

+0

श्रोताओं के रूप में एक एप्लिकेशन सेटअप के साथ उन फ्रैगमेंट लाइफसाइक्ल कॉलबैक के लिए कोई उदाहरण हैं? –

2

आप वर्तमान गतिविधि प्राप्त करने के लिए ActivityManager का उपयोग कर सकते हैं।

This link explains how.

हालांकि, अगर आप वर्तमान टुकड़ा नहीं मिल सकता है के बाद से वहाँ कई टुकड़े एक साथ हो सकता है। आप FragmentManager का उपयोग कर एक विशिष्ट व्यू ग्रुप पर वर्तमान खंड पा सकते हैं।

getActivity().getFragmentManager().findFragmentById(R.id.fragment_container); 
+0

हाँ, तो मेरे पास है वैसे भी संबंधित आईडी R.id.fragment_container। –

+0

यदि उत्तर सहायक है, तो इसे सही के रूप में जांचें। –

+0

नहीं, इसकी नहीं। मैं कंटेनर –

0

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

यह इस तरह काम करता है:

  1. आप के बाद यह पूरी तरह से आरंभ प्रत्येक रुचि घटक में घटनाओं की सदस्यता लें।
  2. घटना प्राप्त करें और संभाल लें, वैकल्पिक रूप से घटना को रद्द करें, यदि घटक सोचता है कि अन्य घटकों को इसकी आवश्यकता नहीं है।
  3. जब सदस्यता घटक को अब घटनाओं की आवश्यकता नहीं है तो सदस्यता छोड़ें (दृश्य छुपा/अलग है, टुकड़ा नष्ट हो गया है, गतिविधि बंद/कम हो गई है)।

इस दृष्टिकोण की सुंदरता लचीलापन में निहित है - आप हमेशा अन्य घटकों को प्रभावित किए बिना प्रत्येक घटना के चारों ओर अधिक तर्क जोड़ सकते हैं, जो इसकी सदस्यता लेते हैं। इसके अलावा, आप प्रत्येक घटक के लिए स्वतंत्र रूप से सब्सक्राइब/सदस्यता समाप्त करने का सबसे अच्छा समय चुन सकते हैं (उदा। अधिसूचना किसी भी समय उत्सर्जित की जा सकती है, लेकिन स्नैकबार केवल तभी दिखाना चाहिए जब गतिविधि दिखाई दे और फिर से शुरू हो)।

अपना ऐप्लिकेशन में एक घटना बस को लागू करने के लिए कई अच्छे विकल्प हैं:

  1. Global Android broadcasts: सबसे अच्छा आप एक से अधिक उच्च आदेश घटकों (क्रियाएँ, सेवा, प्रसारण रिसीवर), आम घटनाओं में रुचि है, जब। आप इरादा फ़िल्टर प्राथमिकताओं का उपयोग कर सकते हैं और आधे हैंडलिंग इवेंट हैंडलिंग रद्द करने के लिए ब्रॉडकास्ट का आदेश दिया है।
  2. स्थानीय ब्रॉडकास्ट प्रबंधक। मृत सरल, कुछ विशेषताएं, लेकिन परिचित एपीआई के साथ उपयोग करना भी आसान है।
  3. Various specialized event bus libraries, आपको पसंदीदा चुनें।
  4. विभिन्न एपीआई, कि घटना बसों के रूप में इस्तेमाल किया जा सकता है, भले ही यह उनकी प्राथमिक उद्देश्य नहीं है: RxJava (मैं this article पढ़ने की सलाह देते), PendingIntents, ContentResolver.notifyUri आदि
  5. ट्रैक करने के लिए
संबंधित मुद्दे