फ़्लटर में अधिसूचना और अलार्म
फ़्लटर प्लगिन के साथ काम करना, Android_Alarm_Manager।
यह जानो! यह प्लगइन केवल एंड्रॉइड प्लेटफॉर्म के लिए काम करता है! मैं व्यक्तिगत रूप से किसी भी iOS समकक्ष के बारे में नहीं जानता। वैकल्पिक रूप से, इस लेख को प्रकाशित करने के एक महीने बाद, मैं एक ऐसे प्लगइन पर आया जो एंड्रॉइड और आईओएस दोनों प्लेटफार्मों पर सूचनाएं प्रदान करता है। मैंने, निश्चित रूप से, एक लेख लिखा है और वह भी। निचे देखो।
पता है कि यदि आप यहाँ वर्णित प्लगइन का उपयोग करना चाहते हैं, तो आपको चीजों को सही ढंग से सेट करने के लिए इसकी रीडमी फ़ाइल का स्पष्ट रूप से पालन करना चाहिए । आप AndroidManfest.xml को कम से कम कुछ इस तरह से देखना चाहिए:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="NAME OF YOUR APPLICATION STARTING WITH COM.">
<!-- The INTERNET permission access.-->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- android_alarm_manager -->
<!-- Start an Alarm When the Device Boots if past due -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<!-- application needs to have the device stay on -->
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android:name="io.flutter.app.FlutterApplication"
android:label="code_samples"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<meta-data android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<meta-data
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- android_alarm_manager -->
<service
android:name="io.flutter.plugins.androidalarmmanager.AlarmService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false"/>
<receiver
android:name="io.flutter.plugins.androidalarmmanager.AlarmBroadcastReceiver"
android:exported="false"/>
<receiver
android:name="io.flutter.plugins.androidalarmmanager.RebootBroadcastReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
# https://pub.dev/packages/android_alarm_manager
android_alarm_manager: ^0.4.0
इस मामले में, यह आपके ऐप में अलार्म सेट करने के लिए है! मेरे मामले में, मुझे फ़्लटर प्लगइन मिला, android_alarm_manager , हाल ही में मैं जिस ऐप पर काम कर रहा था, उसकी ज़रूरतों को पूरा किया ... इसलिए मैंने आसानी से इसके साथ काम करने की दिनचर्या बना ली। यदि आप इसे चाहते हैं, तो एक प्रति लें , इसे अपना बनाएं और आपके द्वारा किए गए किसी भी सुधार को साझा करें। ठंडा?
अब अगर आपके पास समय है, तो कृपया पढ़ते रहें कि मुझे क्या मिला जो मुझे इस प्लगइन के काम को लगभग 'फुलप्रूफ' बनाने के लिए करना था, ताकि आसानी से और जल्दी से एक अलार्म सेट किया जा सके या किसी अन्य ऑपरेशन को 'पृष्ठभूमि में' किया जा सके। समय में भविष्य में जब एप्लिकेशन चल रहा है। यह जीवन को थोड़ा आसान बनाता है, और यह एक अच्छी बात है। सही?
केवल स्क्रीनशॉट। Gists के लिए क्लिक करें।
हमेशा की तरह, मैं अपने लेखों में कोड दिखाने के लिए स्क्रीन पर स्क्रीनशॉट का उपयोग करना पसंद करता हूं। मुझे उनके साथ काम करना आसान है, और पढ़ना आसान है। हालाँकि, आप एक जिस्ट या गिथब में कोड देखने के लिए उन पर क्लिक / टैप कर सकते हैं। विडंबना यह है कि इस लेख को अपने कंप्यूटर पर अपने कंप्यूटर पर मोबाइल विकास के बारे में पढ़ना बेहतर है। इसके अलावा, हम ज्यादातर अपने कंप्यूटर पर प्रोग्राम करते हैं; हमारे फोन पर नहीं। अभी के लिए।
चलो शुरू करें।
यहां मेरा दृष्टिकोण इस उपयोगिता वर्ग को पहले एक उदाहरण में प्रस्तुत करना है और इसका उपयोग करने का तरीका प्रदर्शित करता है - इस प्रकार फ़्लटर प्लगइन, android_alarm_manager का लाभ उठा रहा है । वास्तव में, मैं प्लगइन के स्वयं के उदाहरण पृष्ठ में सूचीबद्ध बहुत ही उदाहरण का उपयोग करूंगा । हालाँकि, इस उदाहरण को यहां प्रस्तुत लाइब्रेरी फ़ाइल का उपयोग करने के लिए संशोधित किया गया है। इस उदाहरण की एक कॉपी आपको gist, android_alarm_manager के रूप में उपलब्ध है । उदाहरण के बाद, मैं उपयोगिता वर्ग के कुछ हिस्सों के माध्यम से ही चलूँगा, जो कई बार यह बताता है कि इस तरह के वर्ग को आम जनता द्वारा इस्तेमाल किए जाने की अनुमति देने के लिए क्या किया जाना चाहिए जो कि आम जनता है।
इसे स्थिर रखें
इस बहुत ही सरल उदाहरण में, आपको प्रदर्शित बटन दबाना है, और 5 सेकंड बाद, नीचे के स्क्रीनशॉट में चित्र के रूप में उन दो शून्य लोगों में बदल जाएंगे। Wheeee! क्या वास्तव में दिलचस्प है, ज़ाहिर है, कोड में हुड के नीचे क्या है।
ध्यान दें, मैंने असिंक्रोनस ऑपरेशंस को समायोजित करने के लिए मूल से कोड को बदल दिया था जो कि ऐप को वास्तव में चलाने से पहले किया जा सकता है। मैंने इसे पूरा करने के लिए FutureBuilder विजेट का उपयोग किया है। ऐसा करते हुए, मैंने 'साझा प्राथमिकताएँ' दिनचर्या को आरंभ करने के लिए , initSettings नामक एक नए फ़ंक्शन को परिभाषित किया, जिसका उपयोग ऊपर दिए गए स्क्रीनशॉट पर देखे गए के रूप में निकाल दिए गए कुल अलार्म की संख्या को 'याद' करने के लिए किया जाता है।
आप नीचे प्रदर्शित initSettings () फ़ंक्शन को भी देख सकते हैं, यह 'टोटल काउंट' को शून्य पर सेट करता है यदि यह पहली बार ऐप चला है। यह शुरुआत में है, हालांकि, लाइब्रेरी रूटीन, अलार्ममैन , को एंड्रॉइड फोन पर नोटिफिकेशन करने के लिए आवश्यक विशेष 'अलार्म सेवा' स्थापित करने के लिए आरम्भ किया जाता है।
चलिए आगे उदाहरण कोड नीचे जाते हैं और देखते हैं कि उस छोटे बटन से क्या बनता है। ध्यान दें, लाइब्रेरी रुटीन पैरामीटर और फ़ंक्शंस के लिए बहुत ही नामों का उपयोग करता है जो फ़्लटर प्लगइन, Android_Alarm_Manager को रेखांकित करता है । ऐसी चीजों के अनुरूप होना बेहतर है। इसके अलावा, प्लगइन के अपने वनशॉट () फ़ंक्शन की तरह, इस लाइब्रेरी का संस्करण, जिसे एक बार कहा जाता है, निर्दिष्ट कॉलबैक रूटीन को फायर करने से पहले निर्दिष्ट अवधि के लिए 'प्रतीक्षा' करेगा। इस संशोधित उदाहरण के मामले में, कॉलबैक दिनचर्या एक अनाम फ़ंक्शन है जो 5 सेकंड की अवधि के बाद चलेगा। नीचे स्क्रीनशॉट में, ऐप, वास्तव में, फिर से शुरू किया गया बटन फिर से इंगित करता है, साझा वरीयता के लिए धन्यवाद, कि बटन को दो बार दबाया गया है क्योंकि यह पहली बार चलाया गया था। Wheeee।
नीचे उस अनाम फ़ंक्शन को करीब से देखें, और हम देखते हैं कि यह एक प्रकार का एकल पैरामीटर पूर्णांक है। आप अनुमान लगा सकते हैं कि डार्ट फ़ंक्शंस, रैंडम () (अगला। Pow (2,31)) का उपयोग करके यादृच्छिक संख्या के रूप में एक ही आईडी मान बहुत ही आईडी मान है । अब उस मान को पास करने में क्यों दिक्कत आती है जब यह पहले से ही इसके बगल में पैरामीटर में पारित हो जाता है? हम उस तक पहुँचेंगे।
अभी के लिए, आप आगे देख सकते हैं कि कॉलबैक फ़ंक्शन, बदले में, फ़ंक्शन को कॉल करता है, _incrementCounter ()। वहां, बटन प्रेस की वर्तमान 'कुल गिनती' को 'साझा प्राथमिकताएं' दिनचर्या से पुनर्प्राप्त किया जाता है। यह इस मौजूदा बटन प्रेस के लिए एक से एक करके अद्यतन किया जाता है और साझा प्राथमिकता पर वापस सहेजा जाता है। एप्लिकेशन की स्क्रीन को फिर से बढ़े हुए वैरिएबल, _counter , फ़ंक्शन का उपयोग करके , setState () के साथ अपडेट किया जाता है । क्या आपने अब तक सब का पालन किया?
इसे स्थिर रखना
मूल उदाहरण (नीचे देखें) के विपरीत, इस उदाहरण को एक अनाम फ़ंक्शन का उपयोग करने की अनुमति है और विशेष रूप से एक स्थिर फ़ंक्शन का उपयोग करने की आवश्यकता नहीं है। बेशक, आपको इस उदाहरण में एक स्थिर फ़ंक्शन का उपयोग करने की अनुमति है - जब तक कि यह अभी भी उस पूर्णांक मान को स्वीकार नहीं करता है। हालाँकि, मूल उदाहरण में, यह एक स्थिर फ़ंक्शन या उच्च स्तरीय स्तर होना चाहिए जो कि लाइब्रेरी डार्ट फ़ाइल में किसी भी वर्ग के बाहर परिभाषित हो - या तो एक, आप देखते हैं, एक आवश्यकता है जब सीधे फ़्लटर प्लगइन, Android_Alarm_Manager के साथ काम करते हैं ।
हालाँकि, यदि आप मेरे लेखों का अनुसरण कर रहे हैं, तो आप जानते हैं कि मुझे विकल्प पसंद हैं। यह सब मेरे साथ विकल्प होने के बारे में है। उदाहरण के लिए अनाम फ़ंक्शंस की अनुमति देने के लिए मैंने इस उपयोगिता वर्ग को और अधिक संक्षिप्त रूप में लिखा है। इस तरह की व्यवस्था के साथ, इसलिए, उस आईडी पूर्णांक मान को एक पैरामीटर के रूप में पारित करना वास्तव में फ़ंक्शन को स्टेटिक फ़ंक्शन, एक उच्च-स्तरीय फ़ंक्शन या एक अनाम फ़ंक्शन की अनुमति देता है। विकल्प! फिर, मूल उदाहरण के स्क्रीनशॉट नीचे दिए गए हैं:
आइए उपयोगिता वर्ग, अलार्म मैनजर की ओर मुड़ें । फिर से, यह प्लगइन के साथ काम करने के लिए डिज़ाइन किया गया है। और फिर, यह कई पैरामीटर हैं जो प्लगइन द्वारा उपयोग किए जाने वाले बहुत ही पैरामीटर हैं और इसलिए उस प्लगइन को पास किया जाता है-लेकिन मान्य मानों के लिए कुछ व्यापक पैरामीटर परीक्षण से पहले नहीं। ऐसी उपयोगिता वर्गों का एक और आवश्यक लक्षण। यह सब काम करता है इसलिए आपको नहीं करना है। सही?
नीचे स्क्रीनशॉट में, इस उपयोगिता वर्ग का पहला भाग है। अपने स्थिर कार्य, init () में, हम देखते हैं कि प्लगइन वास्तव में आरंभिक है। ध्यान दें, आरंभ करने के प्रयास में जो भी दुर्भाग्यपूर्ण त्रुटियां हो सकती हैं उन्हें ट्राइ -कैच स्टेटमेंट में पकड़ा जाएगा । उपयोगिता वर्गों को भी ऐसा करने की आवश्यकता है। में अगला init () फ़ंक्शन, वहाँ 'सहायक' वर्ग, है _Callback , जो एप्लिकेशन अलग के साथ संवाद करने के लिए आवश्यक का मतलब प्रारंभ करने में कहा जाता है को अलग पृष्ठभूमि में अलार्म सेवा द्वारा इस्तेमाल किया।
अंत में, आप नीचे देख सकते हैं कि किसी भी और सभी पैरामीटर मान शून्य नहीं हैं जो विशिष्ट वर्ग को सौंपे गए हैं और उपयोगिता वर्ग, अलार्ममैनगर को भी बनाते हैं । इधर-उधर बहुत सारा स्टैटिक नहीं चल रहा है।
आपको इस वर्ग को बनाने वाले बहुत से गुण और कार्य मिलेंगे। एक कक्षा में स्थैतिक सदस्यों का उपयोग करने का विकल्प अच्छी तरह से स्वभाव होना चाहिए। उदाहरण के लिए, चूंकि init () फ़ंक्शन स्टेटिक है, इसका मतलब है कि इसे कहीं भी, कभी भी और किसी भी समय कहा जा सकता है। इस तथ्य पर कुछ अतिरिक्त विचार की आवश्यकता है। इस उदाहरण में, ऊपर दिए गए स्क्रीनशॉट में बहुत पहले एक-लाइन स्टेटमेंट एक स्टेटमेंट है: 'i f (_init) _ _init;'। यह इनिट () फ़ंक्शन लिखते समय आवश्यक था । इसके साथ, अब आप उस फ़ंक्शन को जितनी बार चाहें कॉल कर सकते हैं। भले ही, आवश्यक सेवाएं और प्लगइन्स केवल पहले कॉल के साथ आरंभिक हों। और इसलिए, डेवलपर्स की एक टीम में, उदाहरण के लिए, यदि कॉल init () फ़ंक्शन को गलती से एक से अधिक बार बनाया गया है, तो कोई नुकसान नहीं हुआ है। उपयोगिता वर्ग की एक और वांछनीय विशेषता। देखो मैं यहाँ क्या कर रहा हूँ? इसे छांट कर 'मूर्खतापूर्ण।' सही?
अपनी सेटिंग्स से बाहर निकलें
वैसे, उन मापदंडों के साथ उन स्थिर चर के साथ पारित किया जा रहा है, इसका मतलब है कि आपको हमारे उदाहरण में अधिक विकल्प मिल गए हैं। जब init () फ़ंक्शन कहा जाता है, तो सेटिंग्स को तब और वहां निर्दिष्ट किया जा सकता था। ऐसा करने से फ़ंक्शंस में कोई भी और सभी कॉल, वनशॉट (), वनशॉट (), और पीरियोडिक (), उन सेटिंग्स का उपयोग करने की अनुमति देगा यदि स्पष्ट रूप से अपना स्वयं का प्रदान नहीं करते हैं। मैंने इसे नीचे प्रदर्शित किया है। यदि आप init () फ़ंक्शन के अतिरिक्त पैरामीटर का उपयोग किया गया था, तो आप उदाहरण कोड में किए गए अंतर देख सकते हैं । यह सिर्फ 'वनशॉट' कॉल को उसकी अवधि, उसकी आईडी और आवश्यक कॉलबैक फ़ंक्शन के साथ छोड़ देता है। कोड को थोड़ा क्लीनर बनाता है। विकल्प!
D एक बिल्ड () फ़ंक्शन में init () को न रखें ! यह Flutter plugin का स्वयं का init () फ़ंक्शन है, जिसे AndroidAlarmManager कहा जाता है । इनिशियलाइज़ () ;, साइड-इफ़ेक्ट्स या मुद्दों के कारण होने का खतरा है। कुछ मामलों में, यह एक पुनर्निर्माण की शुरुआत करेगा (बहुत कुछ जैसे सेटस्टैट () फ़ंक्शन को कॉल करना)। इसलिए मेरी उपयोगिता वर्ग में एक अलग इनिट () फ़ंक्शन है। यह बेहतर है कि इसे आपके ऐप की शुरुआत के निकट कहा जाए - उदाहरण के लिए MaterialApp के साथ FutureBuilder विजेट में। अपने आप को और, अपने संशोधित उदाहरण में देखें, InitSettings () से AlarmManger.init () फ़ंक्शन को कमेंट करने का प्रयास करें और इसे अपने OneShot () फ़ंक्शन (नीचे देखें) से ठीक पहले रखें और फिर आपका उदाहरण त्रुटियों का सामना करना शुरू कर देगा।
अपना वनशॉट ले लो
ठीक है, उपयोगिता वर्ग में वापस। में Oneshot () फ़ंक्शन, पहले तीन 'आवश्यक' पैरामीटर मान वैधता के लिए परीक्षण और प्लगइन के स्वयं को भेज दिया जाता है Oneshot () फ़ंक्शन। 'फंक्शन' पैरामीटर, कॉलबैक को छोड़कर सभी । इसके बजाय, निम्नलिखित आदेश का उपयोग करके पूर्णांक आईडी द्वारा विशिष्ट रूप से पहचाने जाने वाले स्थिर मानचित्र ऑब्जेक्ट में जोड़ा जाता है, _Callback.oneShots [आईडी] = कॉलबैक । हम जल्द ही वापस आ जाएंगे। अंत में, आप देखते हैं कि स्टेटिक फंक्शन के लिए एक कॉल है, वनशॉट (), जो उस सहायक वर्ग में भी पाया जाता है, _Callback । यह प्लगइन द्वारा उपयोग किए जाने वाले आवश्यक 'स्टैटिक फंक्शन' के रूप में है। यह अशक्त-संचालक ऑपरेटर का उपयोग करके उन कई स्टेटिक चर में लेने के लिए बाकी पैरामीटर मान छोड़ देता है, ?? । ऑपरेटर का उपयोग तब किया जाता है जब एक स्पष्ट पैरामीटर पास नहीं होता है, इसके बजाय उन स्टैटिक चर में मूल्यों का उपयोग किया जाता है। उसे ले लो? उन स्टैटिक वेरिएबल्स को सभी तरह से इनिशियलाइज़ किया जाता है, वैसे ही डिफॉल्ट वैल्यूज़ के साथ, इसलिए कोई भी वैल्यू वैल्यू नहीं होती है जो कि आखिरकार खुद ही प्लग इन हो जाती हैं। अच्छा लगा।
नो चांस लो
ध्यान दें, प्लगइन को कॉल स्वयं भी एक कोशिश-कैच स्टेटमेंट में संलग्न है । ऐसा इसलिए है क्योंकि यह एक तृतीय-पक्ष कार्यक्रम है। हमें नहीं पता कि क्या हो सकता है, और चूंकि यह एक उपयोगिता वर्ग है, इसलिए हम आपके ऐप को क्रैश नहीं करना चाहते हैं, बल्कि ऐसा कोई अपवाद भी पकड़ सकते हैं जो हो सकता है।
इसके अलावा, किसी भी अच्छी उपयोगिता वर्ग की तरह, इस वर्ग के पास डेवलपर के लिए 'परीक्षण' करने का साधन है कि क्या ऑपरेशन सफल था या नहीं। यदि नहीं, तो हो सकता है कि कोई भी अपवाद रिकॉर्ड किया गया है, इसलिए डेवलपर तब इसे संभाल सकता है। इस नव डाला साथ संशोधित उदाहरण में नीचे बताया गया है कि अगर बयान।
अधिक स्थिर
इसके अलावा उपयोगिता वर्ग में, अलार्म मैनजर । हम oneShotAt () फ़ंक्शन देखते हैं । फिर से, क्योंकि ये सभी कार्य स्टेटिक फ़ंक्शन हैं, कुछ सुरक्षा उपायों को कोड में शामिल करने की आवश्यकता है। दुर्भाग्यपूर्ण परिस्थितियों में, उदाहरण के लिए, प्लगइन को पहले शुरू नहीं किया जा सकता है जब यह ऑनशॉट () फ़ंक्शन कहा जाता है। दूसरे शब्दों में, यह init () फ़ंक्शन को पहले नहीं कहा गया था। यह आम जनता द्वारा उपयोग किए जाने पर हो सकता है। आप नीचे स्क्रीनशॉट में देख सकते हैं, इस तरह की स्थिति को एस्टर () फ़ंक्शन के साथ परीक्षण किया गया है। यह इस उम्मीद में है कि विकास के दौरान एक डेवलपर ऐसी गलती पकड़ लेगा। उत्पादन में, यह उस द्वारा पकड़ा जाता है यदि कथन जो मुखर () फ़ंक्शन का अनुसरण करता है।
ध्यान दें, इस oneShotAt () फ़ंक्शन के पास 'कॉलबैक' फ़ंक्शन में स्टोर करने के लिए अपना स्वयं का मानचित्र ऑब्जेक्ट है, और इसका अपना स्वयं का स्थिर फ़ंक्शन, _Callback.onShatAt () है, जिसे प्लगइन के स्वयं के शोशॉट () फ़ंक्शन में पास किया जाना है। इसका तात्पर्य यह है कि, आप भविष्य में होने वाले किसी भी ऑपरेशन को शेड्यूल करने के लिए अपने ऐप में किसी भी समय इन कार्यों को कॉल कर सकते हैं। बेशक, प्रत्येक को अपनी विशिष्ट आईडी वैल्यू याद रखनी चाहिए। अन्यथा, पहले से ही निर्धारित किसी भी ऑपरेशन को एक नए के साथ ओवरराइट किया जाएगा यदि यह उसी आईडी मान का उपयोग करने के लिए होता है। अद्वितीय आईडी का उपयोग करते समय यह बात है। सही?
हालाँकि, इसका मतलब यह भी है कि आप एक ही आईडी का उपयोग कर सकते हैं, लेकिन तीन अलग-अलग कार्यों के बीच, वनशॉट (), वनशॉट () और आवधिक () अलग से। याद रखें, उनके पास अपनी अलग मैप ऑब्जेक्ट्स और स्टेटिक फ़ंक्शन हैं। इस तथ्य ने मुझे अपनी हालिया परियोजना में अच्छी तरह से सेवा प्रदान की जहां आईडी का उपयोग निवासी डेटाबेस के प्राथमिक क्षेत्रों में पाए जाने वाले मूल्य थे। विकल्प, बेबी! इसे प्यार करना!
एक प्लगइन पीक
फ़्लटर प्लगइन के अपने वनशॉट () और वनशॉट (फ़ंक्शंस) पर त्वरित नज़र डालना , और आप देख सकते हैं कि इसका वनशॉट () फ़ंक्शन, वास्तव में, अपने पैरामीटर के साथ इसके वनशॉट () समकक्ष पर ही गुजरता है। ध्यान दें, नीचे दिए गए स्क्रीनशॉट में ' कॉलबैकहैंडल ' ऑब्जेक्ट आपको फ़ंक्शन से आता है, _getCallbackHandle (), जो बदले में, फ़्लटर के फ्रेमवर्क फ़ंक्शन, प्लगइन यूटिलिटीज .getCallbackHandle (कॉलबैक) कहलाता है । यह ऑपरेशन कॉलबैक फ़ंक्शन की एक प्रतिलिपि को 'आँसू-बंद' करता है ताकि इसकी पहुँच हो और पृष्ठभूमि में चल रहे आइसोलेट में ऐसे फ़ंक्शन को कॉल किया जा सके। मैं उसी के पास वापस जाऊंगा।
कॉलबैक ऑपरेशन
आइए अब जारी रखें और लाइब्रेरी फ़ाइल में 'सहायक वर्ग,' _Callback पर एक नज़र डालें । आप नीचे उन मैप ऑब्जेक्ट्स को देख सकते हैं जो कॉलबैक फ़ंक्शन ऑब्जेक्ट्स में जोड़ रहे हैं इस क्लास में स्टेटिक गुणों के रूप में परिभाषित किया गया है। इस वर्ग में एक init () फ़ंक्शन भी होता है और इसे AlarmManger के अपने init () फ़ंक्शन में कहा जाता है । यह इस init () फ़ंक्शन में है जहां एक 'संचार का बंदरगाह' तीन विशिष्ट नाम पहचानकर्ताओं के साथ पंजीकृत है। पोर्ट का उपयोग बैकग्राउंड आइसोलेट द्वारा संदेश को पास करके अग्रभूमि आइसोलेट के साथ संचार करने के लिए किया जाता है। अनुमान करें कि उन नामों के पहचानकर्ताओं के मूल्य क्या हैं? वे नीचे दिए गए स्क्रीनशॉट में चर, _oneShot , _oneShotAt , और _periodic में दिखाई देते हैं ।
जैसा कि नाम का तात्पर्य है, आइसोलेट्स, मेमोरी के अलग-अलग सेगमेंट
हैं जो डिज़ाइन द्वारा, अच्छी तरह से,… पृथक हैं। स्मृति का कोई साझाकरण नहीं है। आइसोलेट्स के बीच केवल संदेशों का पारित होना है। इस तरह के संदेश की सामग्री एक आदिम मूल्य (शून्य, संख्या, बूल, डबल, स्ट्रिंग) हो सकती है, एक SendPort ऑब्जेक्ट का उदाहरण , सूची ऑब्जेक्ट या मानचित्र ऑब्जेक्ट जिसमें से कोई भी पहला आदिम मान हो।
पृष्ठभूमि में सुनो
पोर्ट को एक 'श्रोता' के रूप में सौंपा जाता है ताकि प्रतिक्रिया मिल सके कि क्या और कब एक संदेश प्राप्त होता है, इस मामले में, अलार्म सेवा को चलाने वाली पृष्ठभूमि को अलग करें। श्रोता मानचित्र ऑब्जेक्ट में अपने पैरामीटर के रूप में लेने वाले एक अनाम फ़ंक्शन के रूप में है। आप नीचे देख सकते हैं कि मैप ऑब्जेक्ट में एक पूर्णांक मान होता है (जो आईडी होता है) और स्ट्रिंग एक उन 'नाम पहचानकर्ताओं' में से एक है। मामले बयान तो निर्धारित करता है समारोह की जो 'प्रकार' आग है। देखें कि कैसे काम करता है? बेशक, एक उपयोगिता वर्ग होने के नाते, यह सब एक कोशिश के बयान में संलग्न है । उदाहरण के लिए, हमें नहीं पता कि चुने गए फ़ंक्शन को चलाने पर क्या होगा। हम किसी भी अपवाद को पकड़ना चाहते हैं जो हो सकता है। सही?
एक संदेश भेजें
तो यह संदेश अग्रभूमि में चल रहे ऐप पर कैसे भेजा जाता है? खैर, एक बार उन नाम पहचानकर्ता ऊपर पंजीकृत हैं, तो (नीचे देखें) तीन उपयोगिता वर्ग कार्यों में से कोई भी, अलार्ममैनगर । Oneshot (), AlarmManager । oneShotAt () , और AlarmManager । समय-समय पर (), तीन संगत स्थैतिक कार्यों को पारित करेगा, _Callback । onShot (), _Callback । onShotAt () और _Callback । आवधिक (), सीधे स्पंदन प्लगइन के लिए। ऐसा करने से बैकग्राउंड आइसोलेट तब अग्रभूमि आइसोलेट में चल रहे ऐप पर वापस संदेश भेज देगा। सभी तीन प्रकार की कॉल नीचे सूचीबद्ध हैं।
आप देखते हैं, यह इन तीन इसी स्थिर कार्य है, _Callback । onShot (), _Callback । onShotAt () और _Callback । समय-समय पर (), जो कि बैकग्राउंड आइसोलेट से अग्रभूमि आइसोलेट तक 'ब्रिज' हैं। जब यह अलार्म सेट करने का समय होता है, उदाहरण के लिए, अलार्म सेवा इन तीन स्थैतिक कार्यों में से एक को कॉल करेगी। ध्यान दें, जैसा कि होता है, यह अग्रभूमि आइसोलेट में परिभाषित वास्तविक कार्य नहीं है, लेकिन इसकी एक 'फटी हुई नकल' है। आप इस तथ्य के कारण कुछ प्रति-सहज व्यवहार देखेंगे। उदाहरण के लिए, उस फ़ंक्शन में कोई भी स्टेटिक वैरिएबल जिसे सामान्य रूप से अग्रभूमि में परिभाषित किया गया है, पृष्ठभूमि आइसोलेट में शून्य होगा। आप इस घटना का परीक्षण स्वयं कर सकते हैं।
उदाहरण के लिए, हमारे संशोधित उदाहरण में, यदि मैंने तीसरी बार बटन दबाया है, तो हम मैप ऑब्जेक्ट, वनशॉट्स को जानते हैं , इसमें एक फंक्शन ऑब्जेक्ट है जो स्क्रीन को चलाने और अपडेट करने के लिए पांच सेकंड के बाद आता है, और यह स्क्रीनशॉट में बस इतना ही करता है नीचे 'श्रोता' की दिनचर्या। हालाँकि, इस प्रक्रिया में, वह मैप ऑब्जेक्ट खाली है यदि बैकग्राउंड आइसोलेट में एक्सेस किया गया है ?! वो कैसे संभव है? यह संभव है क्योंकि यह मैप ऑब्जेक्ट की एक प्रति है और न कि अग्रभूमि के अलगाव में। फिर, आइसोलेट्स केवल एक-दूसरे को 'संदेश' दे सकते हैं। वे स्मृति साझा नहीं करते हैं।
फिर, ये तीन स्थैतिक कार्य सहायक वर्ग में हैं, _Callback , एक के बाद एक सूचीबद्ध। वे नीचे स्क्रीनशॉट में प्रदर्शित हैं। प्रत्येक में, आप देख सकते हैं कि अग्रभूमि आइसोलेट को 'नाम पहचानकर्ताओं' का उपयोग करके संदर्भित किया जाता है और पृष्ठभूमि आइसोलेट से एक मानचित्र ऑब्जेक्ट पास किया जाता है। ध्यान दें, सशर्त सदस्य पहुंच ऑपरेटर ; ? का उपयोग किया जाता है, अगर लुकअप ऑपरेशन वापस आता है। यदि नाम उदाहरण के लिए मौजूद नहीं है तो वह ऐसा करेगा। यह कभी भी होने की संभावना नहीं है क्योंकि यह सभी आंतरिक कोड है, लेकिन एक उपयोगिता वर्ग होने के नाते, हम कोई संभावना नहीं लेते हैं। सही?
सभी इस पुस्तकालय फ़ाइल के अंत में है, और जहाँ हम अंत में चर, में उन लोगों के नाम पहचानकर्ता 'का मान देखें कि यह यहाँ है _oneShot , _oneShotAt , और _periodic । वे प्रत्येक अपने इसी प्रकार के कार्य के नाम पर हैं। बहुत कल्पनाशील नहीं है, लेकिन यह समझ में आता है। हम यह भी देखते हैं कि वे उच्च-स्तरीय चर वर्ग या उच्च-स्तरीय फ़ंक्शन के बाहर परिभाषित हैं। वास्तव में, वे कीवर्ड, कॉन्स्टेबल के साथ निरंतर चर हैं । अंतिम चर की तरह, कांस्टेबल चर केवल एक बार आरंभिक होते हैं और फिर बदले नहीं जा सकते। अंतिम चर के विपरीत, वे परिभाषित होते हैं जब ऐप संकलित होता है। इसलिए, हमारी जरूरतों के लिए, वे यहां तक कि पृष्ठभूमि के लिए उपलब्ध हैं। अच्छा लगा।
यदि आपके पास इस सब सामान पर नियंत्रण नहीं है। इसके बारे में अभी चिंता मत करो। यही उपयोगिता वर्ग के लिए है। मूल प्लगइन उदाहरण कोड के विपरीत, आपको 'संचार के बंदरगाहों' की स्थापना या जब एक स्टेटिक या एक उच्च-स्तरीय फ़ंक्शन या चर का उपयोग करने के बारे में चिंता करने की ज़रूरत नहीं है। इसलिए मैंने इस वर्ग को पहली जगह पर लिखा है - इसलिए मुझे उस सामान के बारे में चिंता करने की ज़रूरत नहीं है। इसीलिए इस तरह की यूटिलिटी क्लासेस लिखी जाती हैं - इसलिए इनका इस्तेमाल हम अपने भविष्य में कई एप्स के जरिए कर सकते हैं। सही?
चीयर्स।
→ ग्रेग पेरी द्वारा अन्य कहानियाँ