एक आसान विजेट बनाएं

ऐप्लिकेशन विजेट, ऐप्लिकेशन के छोटे-छोटे व्यू होते हैं. इन्हें दूसरी चीज़ों में जोड़ा जा सकता है ऐप्लिकेशन—जैसे कि होम स्क्रीन—और समय-समय पर अपडेट पाते रहते हैं. ये यूज़र इंटरफ़ेस में व्यू को विजेट कहा जाता है और कोई ऐसा व्यक्ति जो ऐप्लिकेशन विजेट की सेवा देने वाली कंपनी (या विजेट सेवा देने वाली कंपनी) के साथ जुड़ा हो. एक ऐप्लिकेशन कॉम्पोनेंट जो दूसरे विजेट को होल्ड करता है, उन्हें ऐप्लिकेशन विजेट होस्ट (या विजेट होस्ट) कहा जाता है. इमेज 1 एक नमूना संगीत विजेट दिखाता है:

संगीत के विजेट का उदाहरण
पहली इमेज. संगीत के विजेट का उदाहरण.

इस दस्तावेज़ में, विजेट की सेवा देने वाली कंपनी का इस्तेमाल करके, विजेट को पब्लिश करने का तरीका बताया गया है. इसके लिए नया AppWidgetHost बनाने के बारे में जानकारी ऐप विजेट होस्ट करें, विजेट होस्ट बनाने की सुविधा देखें.

अपना विजेट डिज़ाइन करने के बारे में जानने के लिए, ऐप्लिकेशन विजेट की खास जानकारी देखें.

विजेट के कॉम्पोनेंट

विजेट बनाने के लिए, आपको नीचे दिए गए बुनियादी कॉम्पोनेंट की ज़रूरत होगी:

AppWidgetProviderInfo ऑब्जेक्ट
यह विजेट के मेटाडेटा के बारे में बताती है, जैसे कि विजेट का लेआउट, अपडेट फ़्रीक्वेंसी और AppWidgetProvider क्लास की जानकारी शामिल है. AppWidgetProviderInfo को एक्सएमएल में तय किया गया है, जैसे कि दिया गया है.
AppWidgetProvider क्लास
यह उन बुनियादी तरीकों के बारे में बताता है जो प्रोग्राम के हिसाब से आपको विजेट. इसके ज़रिए, आपको विजेट अपडेट होने पर ब्रॉडकास्ट मिलते हैं. चालू किया गया, बंद किया गया या मिटाया गया. आप AppWidgetProvider की घोषणा करते हैं मेनिफ़ेस्ट करें और फिर इसे इस तरह से लागू करें इस दस्तावेज़ में बताया गया है.
लेआउट देखें
यह बैज के लिए शुरुआती लेआउट के बारे में बताता है. लेआउट को XML के फ़ॉर्मैट में होना चाहिए, जैसा कि इस दस्तावेज़ में बताया गया है.

दूसरी इमेज में दिखाया गया है कि ये कॉम्पोनेंट, ऐप्लिकेशन के विजेट की पूरी प्रोसेसिंग में कैसे फ़िट होते हैं फ़्लो.

ऐप्लिकेशन विजेट को प्रोसेस करने का फ़्लो
दूसरी इमेज. ऐप्लिकेशन के विजेट को प्रोसेस करने का फ़्लो.

अगर आपके विजेट को उपयोगकर्ता कॉन्फ़िगरेशन की ज़रूरत है, तो ऐप्लिकेशन के विजेट का कॉन्फ़िगरेशन लागू करें गतिविधि. इस गतिविधि से उपयोगकर्ता विजेट की सेटिंग में बदलाव कर सकते हैं—उदाहरण के लिए, घड़ी विजेट के लिए समय क्षेत्र.

हम आपको, नीचे दिए गए सुधारों का भी सुझाव देते हैं: ज़रूरत के हिसाब से विजेट लेआउट, कई तरह के बदलाव, बेहतर विजेट, कलेक्शन विजेट, और विजेट बनाना होस्ट.

AppWidgetProviderInfo एक्सएमएल का एलान करें

AppWidgetProviderInfo ऑब्जेक्ट, विजेट की ज़रूरी क्वालिटी के बारे में बताता है. एक का इस्तेमाल करके, एक्सएमएल संसाधन फ़ाइल में AppWidgetProviderInfo ऑब्जेक्ट के बारे में बताएं <appwidget-provider> एलिमेंट खोलें और उसे प्रोजेक्ट के res/xml/ फ़ोल्डर में सेव करें.

यह नीचे दिए गए उदाहरण में दिखाया गया है:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:targetCellWidth="1"
    android:targetCellHeight="1"
    android:maxResizeWidth="250dp"
    android:maxResizeHeight="120dp"
    android:updatePeriodMillis="86400000"
    android:description="@string/example_appwidget_description"
    android:previewLayout="@layout/example_appwidget_preview"
    android:initialLayout="@layout/example_loading_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigurationActivity"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen"
    android:widgetFeatures="reconfigurable|configuration_optional">
</appwidget-provider>

विजेट के साइज़ से जुड़े एट्रिब्यूट

डिफ़ॉल्ट होम स्क्रीन, सेल के ग्रिड के आधार पर विजेट को अपनी विंडो में रखती है जिनकी लंबाई और चौड़ाई तय होती है. ज़्यादातर होम स्क्रीन पर विजेट सिर्फ़ चालू होते हैं साइज़ जो ग्रिड सेल के पूर्णांक के मल्टीपल होते हैं—उदाहरण के लिए, दो सेल हॉरिज़ॉन्टल तौर पर, तीन सेल वर्टिकल तौर पर.

विजेट के साइज़ से जुड़ी विशेषताओं की मदद से, आप विजेट के लिए डिफ़ॉल्ट साइज़ तय कर सकते हैं और विजेट के साइज़ के लिए निचली और ऊपरी सीमाएं दें. इस संदर्भ में, विजेट का डिफ़ॉल्ट साइज़, वह साइज़ होता है जो पहली बार होने पर विजेट को मिलता है होम स्क्रीन पर जोड़ा गया.

नीचे दी गई टेबल में, <appwidget-provider> एट्रिब्यूट के बारे में बताया गया है विजेट के साइज़ के लिए:

एट्रिब्यूट और ब्यौरा
targetCellWidth और targetCellHeight (Android 12), minWidth और minHeight
  • Android 12 से, targetCellWidth और targetCellHeight एट्रिब्यूट, ग्रिड के हिसाब से विजेट के डिफ़ॉल्ट साइज़ को बताते हैं सेल. Android 11 में इन एट्रिब्यूट को अनदेखा किया जाता है और लोअर क्लास के साथ-साथ को को अनदेखा किया जा सकता है, अगर होम स्क्रीन जिनमें ग्रिड-आधारित लेआउट का इस्तेमाल किया जा सकता है.
  • minWidth और minHeight एट्रिब्यूट, विजेट के डिफ़ॉल्ट साइज़ की जानकारी देते हैं डीपी में. अगर विजेट की कम से कम चौड़ाई या ऊंचाई के मान मेल नहीं खाते हैं तो वैल्यू, सेल के डाइमेंशन के आधार पर तय की जाती हैं. इसके बाद, वैल्यू को सेल का सबसे नज़दीकी साइज़.
हम सुझाव देते हैं कि आप दोनों के सेट एट्रिब्यूट—targetCellWidth और targetCellHeight, और minWidth और minHeight—ताकि आपका ऐप्लिकेशन दोबारा इस्तेमाल किया जा सके minWidth और minHeight, अगर उपयोगकर्ता का डिवाइस targetCellWidth और targetCellHeight. अगर यह सुविधा उपलब्ध है, तो targetCellWidth और targetCellHeight एट्रिब्यूट minWidth और minHeight के ऊपर प्राथमिकता लें एट्रिब्यूट.
minResizeWidth और minResizeHeight विजेट के कम से कम साइज़ के बारे में बताएं. इन वैल्यू से पता चलता है कि ऐसा साइज़ जिसके तहत विजेट पढ़ा नहीं जा सकता या किसी काम का नहीं रहता. इसका इस्तेमाल किया जा रहा है इन एट्रिब्यूट की मदद से उपयोगकर्ता, विजेट का साइज़ छोटा करके बड़ा कर सकते हैं के साइज़ से ज़्यादा. यह minResizeWidth एट्रिब्यूट है अगर यह minWidth से बड़ा है या हॉरिज़ॉन्टल है, तो अनदेखा कर दिया जाता है साइज़ बदलने की सुविधा चालू नहीं है. यहां जाएं: resizeMode. इसी तरह, अगर minResizeHeight एट्रिब्यूट की वैल्यू इससे बड़ी होती है, तो उसे नज़रअंदाज़ कर दिया जाता है minHeight या अगर वर्टिकल साइज़ बदलने की सुविधा चालू नहीं है.
maxResizeWidth और maxResizeHeight विजेट के लिए सुझाए गए ज़्यादा से ज़्यादा साइज़ के बारे में बताएं. अगर वैल्यू ग्रिड सेल डाइमेंशन का मल्टीपल, उन्हें सबसे नज़दीक के पूर्णांक में बदल दिया जाता है सेल का साइज़. maxResizeWidth एट्रिब्यूट को अनदेखा किया जाता है, अगर ऐसा है minWidth से कम हो या हॉरिज़ॉन्टल साइज़ न हो चालू किया गया. resizeMode देखें. इसी तरह, अगर maxResizeHeight एट्रिब्यूट की वैल्यू इससे बड़ी होती है, तो उसे अनदेखा कर दिया जाता है minHeight से ज़्यादा हो या वर्टिकल साइज़ बदलने की सुविधा चालू न हो. Android 12 में पेश किया गया.
resizeMode उन नियमों को तय करता है जिनके हिसाब से विजेट का साइज़ बदला जा सकता है. आप इसका इस्तेमाल कर सकते हैं होम स्क्रीन विजेट का हॉरिज़ॉन्टल, वर्टिकल तौर पर साइज़ बदलने की सुविधा, या दोनों ऐक्सिस पर होता है. उपयोगकर्ता, टच & इसके साइज़ बदलने वाले हैंडल दिखाने के लिए विजेट को होल्ड पर रखें, इसके बाद, हॉरिज़ॉन्टल या वर्टिकल हैंडल को खींचें और उसका साइज़ लेआउट ग्रिड. resizeMode एट्रिब्यूट की वैल्यू में ये शामिल हैं horizontal, vertical, और none. यहां की यात्रा पर हूं यह एलान कर सकते हैं कि विजेट का साइज़ हॉरिज़ॉन्टल तौर पर और वर्टिकल तौर पर बदला जा सकता है. horizontal|vertical.

उदाहरण

यह समझाने के लिए कि पिछली टेबल में दिए गए एट्रिब्यूट, विजेट के साइज़ पर कैसे असर डालते हैं, नीचे दी गई जानकारी की उम्मीद करते हैं:

  • ग्रिड सेल की चौड़ाई 30 डीपी और ऊंचाई 50 डीपी होती है.
  • यहां एट्रिब्यूट की खास बातें बताई गई हैं:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="80dp"
    android:minHeight="80dp"
    android:targetCellWidth="2"
    android:targetCellHeight="2"
    android:minResizeWidth="40dp"
    android:minResizeHeight="40dp"
    android:maxResizeWidth="120dp"
    android:maxResizeHeight="120dp"
    android:resizeMode="horizontal|vertical" />

Android 12 और उसके बाद के वर्शन में उपलब्ध:

targetCellWidth और targetCellHeight एट्रिब्यूट को डिफ़ॉल्ट के तौर पर इस्तेमाल करें विजेट का साइज़.

विजेट का साइज़, डिफ़ॉल्ट रूप से 2x2 होता है. विजेट का आकार बदलकर 2x1 किया जा सकता है या 4x3 तक.

Android 11 और उससे पहले वाले वर्शन पर:

वैल्यू के डिफ़ॉल्ट साइज़ का हिसाब लगाने के लिए, minWidth और minHeight एट्रिब्यूट का इस्तेमाल करें विजेट.

डिफ़ॉल्ट चौड़ाई = Math.ceil(80 / 30) = 3

डिफ़ॉल्ट ऊंचाई = Math.ceil(80 / 50) = 2

विजेट का साइज़, डिफ़ॉल्ट रूप से 3x2 होता है. विजेट का आकार बदलकर 2x1 किया जा सकता है या सकता है.

विजेट के अन्य एट्रिब्यूट

नीचे दी गई टेबल में, <appwidget-provider> एट्रिब्यूट के बारे में बताया गया है विजेट के साइज़ के अलावा, बाकी क्वालिटी के लिए भी बेहतर विकल्प हो सकते हैं.

एट्रिब्यूट और ब्यौरा
updatePeriodMillis इससे पता चलता है कि विजेट फ़्रेमवर्क कितनी बार onUpdate() पर कॉल करके AppWidgetProvider कॉलबैक का तरीका. वास्तविक अपडेट के ठीक होने की गारंटी नहीं है समय सबमिट करें, और हम आपको कम से कम इतनी बार अपडेट करने का सुझाव देते हैं बैटरी बचाने के लिए—एक घंटे में एक बार से अधिक नहीं—भी संभव है. अपडेट की सही अवधि चुनने से पहले, यहां दी गई सूची में शामिल चीज़ों के बारे में जानने के लिए, देखें विजेट अपडेट करने के लिए ऑप्टिमाइज़ेशन कॉन्टेंट.
initialLayout बैज के लेआउट के बारे में बताने वाले लेआउट रिसॉर्स पर ले जाता है.
configure उपयोगकर्ता के विजेट जोड़ने पर लॉन्च होने वाली गतिविधि तय करता है, इससे विजेट की प्रॉपर्टी कॉन्फ़िगर की जा सकती हैं. यहां जाएं: उपयोगकर्ताओं को विजेट कॉन्फ़िगर करने की सुविधा दें. Android 12 से, अपने ऐप्लिकेशन के शुरुआती हिस्से को स्किप किया जा सकता है कॉन्फ़िगरेशन. देखें जानकारी के लिए, विजेट का डिफ़ॉल्ट कॉन्फ़िगरेशन देखें.
description विजेट पिकर का विवरण तय करता है, ताकि विजेट. Android 12 में पेश किया गया.
previewLayout (Android 12) और previewImage (Android 11 और इससे पहले के वर्शन)
  • Android 12 से, previewLayout एट्रिब्यूट का इस्तेमाल करके झलक को बढ़ाया जा सकता है. यह एक्सएमएल लेआउट को विजेट के डिफ़ॉल्ट साइज़ पर सेट करके उपलब्ध कराया जाता है. आम तौर पर, इस एट्रिब्यूट के तौर पर बताई गई लेआउट एक्सएमएल, लेआउट एक्सएमएल के असली विजेट को डिफ़ॉल्ट तौर पर सेट करने के लिए इस्तेमाल किया जाता है.
  • Android 11 या इससे पहले के वर्शन में, previewImage एट्रिब्यूट यह झलक बताता है कि बैज पूरा होने के बाद वह कैसा दिखता है कॉन्फ़िगर किया गया है, जो उपयोगकर्ता को ऐप्लिकेशन विजेट चुनते समय दिखता है. अगर नहीं दिया गया है, तो उपयोगकर्ता को इसके बजाय आपके ऐप्लिकेशन का लॉन्चर आइकॉन दिखेगा. यह फ़ील्ड में android:previewImage एट्रिब्यूट की वैल्यू दी गई है <receiver> एलिमेंट में AndroidManifest.xml फ़ाइल.
ध्यान दें: हम previewImage, दोनों को बताने का सुझाव देते हैं और previewLayout एट्रिब्यूट का इस्तेमाल करें, ताकि आपका ऐप्लिकेशन वापस इस्तेमाल किया जा सके अगर उपयोगकर्ता के डिवाइस में सुविधा नहीं है, तो previewImage का इस्तेमाल करें previewLayout. ज़्यादा जानकारी के लिए, यह देखें स्केलेबल के साथ पुराने सिस्टम के साथ काम करने की सुविधा विजेट की झलक.
autoAdvanceViewId इससे विजेट सबव्यू का व्यू आईडी अपने-आप बेहतर हो जाता है विजेट का होस्ट.
widgetCategory यह बताता है कि आपका विजेट, होम स्क्रीन पर दिखाया जा सकता है या नहीं (home_screen), लॉक स्क्रीन (keyguard) या दोनों. Android 5.0 और उसके बाद वाले वर्शन के लिए, सिर्फ़ home_screen मान्य है.
widgetFeatures विजेट पर काम करने वाली सुविधाओं की जानकारी देता है. उदाहरण के लिए, अगर आपको आपका विजेट, जब कोई उपयोगकर्ता उसे जोड़ता है, तो अपने डिफ़ॉल्ट कॉन्फ़िगरेशन का इस्तेमाल करने के लिए दोनों configuration_optional और reconfigurable फ़्लैग. इससे किसी उपयोगकर्ता के बाद कॉन्फ़िगरेशन गतिविधि लॉन्च करने की ज़रूरत नहीं पड़ती विजेट जोड़ता है. उपयोगकर्ता अब भी ये काम कर सकता है: विजेट को फिर से कॉन्फ़िगर करना उससे बचा जा सकता है.

विजेट ब्रॉडकास्ट मैनेज करने के लिए, AppWidgetProvider क्लास का इस्तेमाल करें

AppWidgetProvider क्लास, विजेट के ब्रॉडकास्ट को मैनेज करती है और विजेट को अपडेट करती है विजेट लाइफ़साइकल इवेंट के रिस्पॉन्स के तौर पर. इन सेक्शन में, मेनिफ़ेस्ट में AppWidgetProvider के बारे में बताएं और फिर उसे लागू करें.

मेनिफ़ेस्ट में किसी विजेट का एलान करना

सबसे पहले, अपने ऐप्लिकेशन की AndroidManifest.xml में AppWidgetProvider क्लास का एलान करें फ़ाइल से मिलता-जुलता है, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है:

<receiver android:name="ExampleAppWidgetProvider"
                 android:exported="false">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
               android:resource="@xml/example_appwidget_info" />
</receiver>

<receiver> एलिमेंट के लिए android:name एट्रिब्यूट की ज़रूरत होती है, जिससे पता चलता है कि विजेट के लिए इस्तेमाल किया गया AppWidgetProvider. कॉम्पोनेंट को एक्सपोर्ट नहीं करना चाहिए जब तक कि आपके AppWidgetProvider पर किसी अलग प्रोसेस को ब्रॉडकास्ट करने की ज़रूरत न हो, आम तौर पर ऐसा नहीं होता.

<intent-filter> एलिमेंट में,<action> android:name एट्रिब्यूट की वैल्यू सबमिट करें. इस एट्रिब्यूट से पता चलता है कि AppWidgetProvider स्वीकार करता है ACTION_APPWIDGET_UPDATE ब्रॉडकास्ट. आपको सिर्फ़ यही ब्रॉडकास्ट के बारे में बताना होगा. कॉन्टेंट बनाने AppWidgetManager अन्य सभी विजेट ब्रॉडकास्ट, AppWidgetProvider को इस तरह अपने-आप भेज दिए जाते हैं ज़रूरी है.

<meta-data> एलिमेंट, AppWidgetProviderInfo रिसॉर्स और इन एट्रिब्यूट की ज़रूरत होती है:

  • android:name: मेटाडेटा का नाम बताता है. इस्तेमाल की जाने वाली चीज़ें android.appwidget.provider की मदद से, AppWidgetProviderInfo डिस्क्रिप्टर.
  • android:resource: AppWidgetProviderInfo संसाधन के बारे में बताता है स्थान.

AppWidgetProvider क्लास लागू करें

AppWidgetProvider क्लास एक्सटेंड होती है BroadcastReceiver सुविधा क्लास का इस्तेमाल करें. इसे सिर्फ़ इवेंट की जानकारी मिलती है ऐसे ब्रॉडकास्ट जो विजेट के हिसाब से काम के हैं. जैसे, विजेट को कब अपडेट किया जाता है, मिटाया गया, चालू किया गया, और बंद किया गया. जब ये ब्रॉडकास्ट इवेंट होते हैं, तो ये AppWidgetProvider तरीकों का इस्तेमाल किया जाता है:

onUpdate()
इसे विजेट को अपडेट करने के लिए, AppWidgetProviderInfo में updatePeriodMillis एट्रिब्यूट. टेबल इस पेज में के लिए अतिरिक्त विजेट की विशेषताओं के बारे में ज़्यादा जानकारी देखें.
यह तरीका तब भी कॉल किया जाता है, जब उपयोगकर्ता विजेट जोड़ता है, इसलिए यह ज़रूरी सेटअप, जैसे कि इवेंट हैंडलर तय करना View ऑब्जेक्ट या डेटा लोड करने के लिए जॉब शुरू करना विजेट में दिखाई दे सकती है. हालांकि, अगर आपको बिना किसी शुल्क के कॉन्फ़िगरेशन गतिविधि का एलान करना है, configuration_optional फ़्लैग, इस तरीके को तब कॉल नहीं किया जाता है, जब उपयोगकर्ता विजेट को जोड़ता है, लेकिन बाद में होने वाले अपडेट के लिए इसे कॉल किया जाता है. यह है पहला अपडेट करते समय कॉन्फ़िगरेशन गतिविधि की ज़िम्मेदारी कॉन्फ़िगरेशन पूरा हुआ. ज़्यादा जानकारी के लिए, उपयोगकर्ताओं को ऐप्लिकेशन विजेट कॉन्फ़िगर करने की अनुमति दें लेख पढ़ें.
सबसे ज़रूरी कॉलबैक onUpdate() है. देखें इवेंट मैनेज करने के लिए, onUpdate() क्लास के बारे में ज़्यादा जानें.
onAppWidgetOptionsChanged()

इसे तब कॉल किया जाता है, जब विजेट को पहली बार किसी जगह पर रखा गया हो और किसी भी समय यह आकार बदला गया. विजेट के साइज़ के आधार पर कॉन्टेंट दिखाने या छिपाने के लिए, इस कॉलबैक का इस्तेमाल करें रेंज. साइज़ की रेंज देखें—और Android 12 से, कॉल करके, विजेट के इंस्टेंस को मिल सकने वाले साइज़ की सूची getAppWidgetOptions() जो Bundle दिखाता है, जिसमें फ़ॉलो किया जा रहा है:

  • OPTION_APPWIDGET_MIN_WIDTH: किसी विजेट के इंस्टेंस की चौड़ाई की निचली सीमा, डीपी इकाइयों में होती है.
  • OPTION_APPWIDGET_MIN_HEIGHT: किसी विजेट के इंस्टेंस की ऊंचाई की निचली सीमा, डीपी इकाइयों में होती है.
  • OPTION_APPWIDGET_MAX_WIDTH: किसी विजेट के इंस्टेंस की चौड़ाई की ऊपरी सीमा, डीपी यूनिट में होती है.
  • OPTION_APPWIDGET_MAX_HEIGHT: किसी विजेट के इंस्टेंस की ऊंचाई की ऊपरी सीमा, डीपी इकाइयों में होती है.
  • OPTION_APPWIDGET_SIZES: संभावित साइज़ (List<SizeF>) की सूची मौजूद है, जो कि dp यूनिट में है. विजेट इंस्टेंस ले सकता है. Android 12 में पेश किया गया.
onDeleted(Context, int[])

जब भी किसी विजेट को विजेट होस्ट से मिटाया जाता है, तब यह कॉल किया जाता है.

onEnabled(Context)

इसे तब कॉल किया जाता है, जब विजेट का इंस्टेंस पहली बार बनाया जाता है. उदाहरण के लिए, यदि उपयोगकर्ता आपके विजेट के दो इंस्टेंस जोड़ता है, तो इसे केवल पहली बार. अगर आपको कोई नया डेटाबेस खोलना या कोई दूसरा सेटअप करना हो, तो सभी विजेट इंस्टेंस के लिए सिर्फ़ एक बार होना चाहिए, तो यह ऐसी जगह है करते हैं.

onDisabled(Context)

यह तब कॉल किया जाता है जब आपके विजेट का अंतिम इंस्टेंस विजेट होस्ट. आप यहां onEnabled(Context) में किए गए सभी काम व्यवस्थित करते हैं, जैसे कि अस्थायी डेटाबेस को मिटाना.

onReceive(Context, Intent)

यह हर ब्रॉडकास्ट के लिए और पिछले हर कॉलबैक से पहले कॉल किया जाता है तरीकों का इस्तेमाल करना होगा. आम तौर पर, आपको यह तरीका लागू करने की ज़रूरत नहीं होती, क्योंकि डिफ़ॉल्ट AppWidgetProvider लागू करने की सुविधा, विजेट के सभी ब्रॉडकास्ट को फ़िल्टर करती है पिछले तरीकों का इस्तेमाल करें.

आपको AppWidgetProvider क्लास लागू करने के बारे में, ब्रॉडकास्ट के तौर पर एलान करना होगा पाने वाला व्यक्ति, AndroidManifest में <receiver> एलिमेंट का इस्तेमाल कर रहा है. देखें एलान करें विजेट के तौर पर साइन इन करें.

onUpdate() क्लास के साथ इवेंट मैनेज करना

सबसे ज़रूरी AppWidgetProvider कॉलबैक onUpdate() है, क्योंकि यह है कॉल किया जाता है, जब तक कि कॉन्फ़िगरेशन का इस्तेमाल नहीं किया जाता, तब तक हर विजेट को होस्ट में जोड़ दिया जाता है गतिविधि जिसमें configuration_optional फ़्लैग शामिल नहीं है. अगर आपका विजेट उपयोगकर्ता इंटरैक्शन इवेंट को फ़्लैग करने के बाद, इस कॉलबैक में इवेंट हैंडलर रजिस्टर करें. अगर आपने आपका विजेट अस्थायी फ़ाइलें या डेटाबेस नहीं बनाता है और न ही कोई दूसरा काम करता है जिसे हटाने की ज़रूरत है, तो शायद onUpdate() ही कॉलबैक का तरीका हो परिभाषित करने की ज़रूरत है.

उदाहरण के लिए, अगर आपको बटन वाला ऐसा विजेट चाहिए जो गतिविधि को लॉन्च करे, तो टैप किया गया है, तो AppWidgetProvider को लागू करने के इस तरीके का इस्तेमाल किया जा सकता है:

Kotlin

class ExampleAppWidgetProvider : AppWidgetProvider() {

    override fun onUpdate(
            context: Context,
            appWidgetManager: AppWidgetManager,
            appWidgetIds: IntArray
    ) {
        // Perform this loop procedure for each widget that belongs to this
        // provider.
        appWidgetIds.forEach { appWidgetId ->
            // Create an Intent to launch ExampleActivity.
            val pendingIntent: PendingIntent = PendingIntent.getActivity(
                    /* context = */ context,
                    /* requestCode = */  0,
                    /* intent = */ Intent(context, ExampleActivity::class.java),
                    /* flags = */ PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
            )

            // Get the layout for the widget and attach an onClick listener to
            // the button.
            val views: RemoteViews = RemoteViews(
                    context.packageName,
                    R.layout.appwidget_provider_layout
            ).apply {
                setOnClickPendingIntent(R.id.button, pendingIntent)
            }

            // Tell the AppWidgetManager to perform an update on the current
            // widget.
            appWidgetManager.updateAppWidget(appWidgetId, views)
        }
    }
}

Java

public class ExampleAppWidgetProvider extends AppWidgetProvider {

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // Perform this loop procedure for each widget that belongs to this
        // provider.
        for (int i=0; i < appWidgetIds.length; i++) {
            int appWidgetId = appWidgetIds[i];
            // Create an Intent to launch ExampleActivity
            Intent intent = new Intent(context, ExampleActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(
                /* context = */ context,
                /* requestCode = */ 0,
                /* intent = */ intent,
                /* flags = */ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
            );

            // Get the layout for the widget and attach an onClick listener to
            // the button.
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget_layout);
            views.setOnClickPendingIntent(R.id.button, pendingIntent);

            // Tell the AppWidgetManager to perform an update on the current app
            // widget.
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

यह AppWidgetProvider सिर्फ़ onUpdate() तरीके के बारे में बताता है. इसके लिए, इसका इस्तेमाल किया जाता है लॉन्च होने वाला PendingIntent बनाएं एक Activity और उसे विजेट के बटन setOnClickPendingIntent(int, PendingIntent) का उपयोग कर रहे हैं. इसमें एक लूप शामिल है, जो हर एंट्री के बाद फिर से आता है appWidgetIds में, जो आईडी का कलेक्शन होता है. इससे बनाए गए हर विजेट की पहचान की जाती है यह कंपनी. अगर उपयोगकर्ता विजेट के एक से ज़्यादा इंस्टेंस बनाता है, तो वे सभी एक साथ अपडेट होते हैं. हालांकि, updatePeriodMillis का सिर्फ़ एक शेड्यूल को विजेट के सभी इंस्टेंस के लिए मैनेज किया जाता है. उदाहरण के लिए, अगर अपडेट शेड्यूल को हर दो घंटे में एक बार सेट किया जाता है और विजेट का दूसरा इंस्टेंस जोड़ा जाता है पहले घंटे के एक घंटे बाद, फिर वे दोनों अपडेट करने की अवधि को अनदेखा कर दिया जाता है. वे दोनों हर दो में अपडेट होते हैं घंटे, हर घंटे नहीं.

ज़्यादा जानकारी के लिए, ExampleAppWidgetProvider.java सैंपल क्लास देखें.

विजेट ब्रॉडकास्ट के इंटेंट पाएं

AppWidgetProvider एक सुविधा क्लास है. अगर आपको बैज पाना है सीधे ब्रॉडकास्ट करता है, तो आप अपना खुद का BroadcastReceiver लागू कर सकते हैं या खुद के ब्रॉडकास्ट को बदल सकते हैं यह onReceive(Context,Intent) कॉलबैक. आपको जिन मकसदों पर ध्यान देने की ज़रूरत है वे ये हैं: फ़ॉलो किया जा रहा है:

विजेट का लेआउट बनाएं

आपको एक्सएमएल में अपने विजेट के लिए एक शुरुआती लेआउट तय करना होगा और इसे प्रोजेक्ट की res/layout/ डायरेक्ट्री. डिज़ाइन देखें दिशा-निर्देशों के बारे में ज़्यादा जानें.

अगर आपको पता है, तो विजेट का लेआउट बनाना आसान है लेआउट. हालांकि, ध्यान रखें कि विजेट लेआउट RemoteViews पर आधारित हैं, जो हर तरह के लेआउट या व्यू विजेट के साथ काम नहीं करता. कस्टम पैरामीटर का इस्तेमाल नहीं किया जा सकता व्यू की ऐसी सब-क्लास और व्यू जो RemoteViews में काम करते हैं.

RemoteViews ViewStub का भी समर्थन करता है, यह एक दिखाई नहीं देने वाला, शून्य साइज़ का View है. इसे लेआउट में लेज़ी तरीके से इनफ़्लेट किया जा सकता है रनटाइम पर संसाधन इस्तेमाल करना चाहिए.

स्टेटफ़ुल व्यवहार के लिए सहायता

Android 12 में, स्टेटफ़ुल व्यवहार की सुविधा मिलती है. इसके लिए, इनका इस्तेमाल किया जाता है मौजूदा कॉम्पोनेंट:

विजेट अब भी स्टेटलेस है. आपके ऐप्लिकेशन को राज्य का नाम सेव करना होगा और राज्य में होने वाले बदलाव से जुड़े इवेंट.

खरीदारी की सूची के विजेट का उदाहरण, जिसमें स्टेटफ़ुल व्यवहार दिखाया गया है
तीसरी इमेज. स्टेटफ़ुल व्यवहार का उदाहरण.

नीचे दिया गया कोड उदाहरण इन कॉम्पोनेंट को लागू करने का तरीका दिखाता है.

Kotlin

// Check the view.
remoteView.setCompoundButtonChecked(R.id.my_checkbox, true)

// Check a radio group.
remoteView.setRadioGroupChecked(R.id.my_radio_group, R.id.radio_button_2)

// Listen for check changes. The intent has an extra with the key
// EXTRA_CHECKED that specifies the current checked state of the view.
remoteView.setOnCheckedChangeResponse(
        R.id.my_checkbox,
        RemoteViews.RemoteResponse.fromPendingIntent(onCheckedChangePendingIntent)
)

Java

// Check the view.
remoteView.setCompoundButtonChecked(R.id.my_checkbox, true);

// Check a radio group.
remoteView.setRadioGroupChecked(R.id.my_radio_group, R.id.radio_button_2);

// Listen for check changes. The intent has an extra with the key
// EXTRA_CHECKED that specifies the current checked state of the view.
remoteView.setOnCheckedChangeResponse(
    R.id.my_checkbox,
    RemoteViews.RemoteResponse.fromPendingIntent(onCheckedChangePendingIntent));

दो लेआउट उपलब्ध कराएं: एक को टारगेट करने वाला डिवाइस, जो Android 12 पर चल रहा हो या res/layout-v31 में उच्च और अन्य लक्ष्यीकरण पिछला डिफ़ॉल्ट res/layout फ़ोल्डर में, Android 11 या इससे पहले का वर्शन होना चाहिए.

किनारों को गोल करें

Android 12 में ये सिस्टम पैरामीटर मिलते हैं, जिनकी मदद से आपके विजेट के गोल किनारों का दायरा:

  • system_app_widget_background_radius: विजेट के बैकग्राउंड के कोने की रेडियस, जो कभी भी इससे ज़्यादा नहीं होती 28 डीपी.

  • system_app_widget_inner_radius: विजेट के अंदर किसी भी व्यू के कोने की रेडियस. यह ठीक 8 डीपी है 8 dp का इस्तेमाल करते समय सही तरीके से अलाइन करने के लिए, बैकग्राउंड के रेडियस से कम होता है पैडिंग.

नीचे दिया गया उदाहरण एक ऐसा विजेट दिखाता है जो विजेट के कोने के लिए system_app_widget_background_radius और विजेट के अंदर व्यू के लिए system_app_widget_inner_radius.

विजेट में, विजेट के बैकग्राउंड की रेडियस और उसके अंदर के व्यू दिखते हैं
चौथी इमेज. गोल कोने.

1 विजेट का कोना.

2 विजेट के अंदर किसी व्यू का कोना.

गोलाकार कोनों के लिए ज़रूरी बातें

  • तृतीय-पक्ष लॉन्चर और डिवाइस निर्माता system_app_widget_background_radius पैरामीटर का साइज़ 28 डीपी से कम होना चाहिए. system_app_widget_inner_radius पैरामीटर हमेशा 8 डीपी से कम होता है system_app_widget_background_radius की वैल्यू डालें.
  • अगर आपका विजेट @android:id/background का इस्तेमाल नहीं करता या बैकग्राउंड को तय नहीं करता जो आउटलाइन के आधार पर अपने कॉन्टेंट को क्लिप करती है—android:clipToOutline के साथ true पर सेट किया जाता है—लॉन्चर अपने-आप बैकग्राउंड की पहचान करता है और 16 dp तक के गोल किनारों वाले रेक्टैंगल का इस्तेमाल करके, विजेट को क्लिप करने की सुविधा मिलती है. देखें कि पक्का करें कि आपका विजेट इनके साथ काम करता हो Android 12.

हमारा सुझाव है कि Android के पिछले वर्शन के साथ विजेट की सुविधा को इस्तेमाल करने के लिए, कस्टम एट्रिब्यूट तय करना और उन्हें ओवरराइड करने के लिए कस्टम थीम इस्तेमाल करना Android 12, जैसा कि नीचे दिए गए सैंपल एक्सएमएल फ़ाइलों में दिखाया गया है:

/values/attrs.xml

<resources>
  <attr name="backgroundRadius" format="dimension" />
</resources>

/values/styles.xml

<resources>
  <style name="MyWidgetTheme">
    <item name="backgroundRadius">@dimen/my_background_radius_dimen</item>
  </style>
</resources>

/values-31/styles.xml

<resources>
  <style name="MyWidgetTheme" parent="@android:style/Theme.DeviceDefault.DayNight">
    <item name="backgroundRadius">@android:dimen/system_app_widget_background_radius</item>
  </style>
</resources>

/drawable/my_widget_background.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
  <corners android:radius="?attr/backgroundRadius" />
  ...
</shape>

/layout/my_widget_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  ...
  android:background="@drawable/my_widget_background" />