Android 4.2 API

एपीआई लेवल: 17

Android 4.2 (JELLY_BEAN_MR1) है, जो gel Bean रिलीज़ में अपडेट किया गया है. इसमें लोगों और ऐप्लिकेशन को नई सुविधाएं दी गई हैं डेवलपर. इस दस्तावेज़ में, उन लोगों के बारे में जानकारी दी गई है जो दुनिया भर के डेवलपर के लिए उपयोगी नए API शामिल करें.

ऐप्लिकेशन डेवलपर के रूप में, आपको Android 4.2 सिस्टम इमेज और SDK प्लैटफ़ॉर्म SDK Manager को जल्द से जल्द ऐक्सेस करें. अगर आपको ऐसा न हो कि Android 4.2 पर चल रहा डिवाइस जिस पर ऐप्लिकेशन की जांच की जा सके, Android 4.2 सिस्टम का इस्तेमाल करें Android एम्युलेटर पर अपने ऐप्लिकेशन की जांच करने के लिए इमेज का इस्तेमाल करें. इसके बाद, नए एपीआई का इस्तेमाल शुरू करने के लिए, अपने ऐप्लिकेशन को Android 4.2 प्लैटफ़ॉर्म के हिसाब से बनाएं.

Android 4.2 चलाने वाले डिवाइसों के लिए अपने ऐप को बेहतर ढंग से ऑप्टिमाइज़ करने के लिए, आपको अपने targetSdkVersion को "17", इसे Android 4.2 सिस्टम इमेज पर इंस्टॉल करें, इसकी जांच करें, फिर इस बदलाव के साथ अपडेट पब्लिश करें.

आपने लोगों तक पहुंचाया मुफ़्त में यह Android 4.2 में एपीआई का इस्तेमाल कर सकता है. साथ ही, यह Android 4.2 वर्शन पर भी काम कर सकता है. अपने कोड की ऐसी शर्तें सेट करें जो लागू करने से पहले सिस्टम के एपीआई लेवल की जांच करती हैं ऐसे एपीआई जो आपके minSdkVersion पर काम नहीं करते. इस बारे में ज़्यादा जानने के लिए पुराने सिस्टम के साथ काम करने की सुविधा बनाए रखने के लिए, बैकवर्ड के साथ काम करने वाले टूल बनाना यूज़र इंटरफ़ेस (यूआई).

एपीआई लेवल के काम करने के तरीके के बारे में ज़्यादा जानने के लिए, एपीआई क्या है” पर जाएं लेवल?

व्यवहार में होने वाले अहम बदलाव

अगर आपने Android के लिए पहले कोई ऐप्लिकेशन पब्लिश किया है, तो इन बातों का ध्यान रखें ऐसे बदलाव जो आपके ऐप्लिकेशन के काम करने के तरीके पर असर डाल सकते हैं:

  • कॉन्टेंट देने वालों को अब डिफ़ॉल्ट रूप से एक्सपोर्ट नहीं किया जाता. इसका मतलब है कि डिफ़ॉल्ट वैल्यू android:exported एट्रिब्यूट के लिए, इसे अब “false" कर दिया गया है. अगर यह ज़रूरी है कि दूसरे ऐप्लिकेशन आपके कॉन्टेंट देने वाले का ऐक्सेस नहीं है, तो आपको अब android:exported="true". को साफ़ तौर पर सेट करना होगा.

    यह बदलाव सिर्फ़ तब लागू होता है, जब android:targetSdkVersion या android:minSdkVersion को 17 या उससे ज़्यादा पर सेट किया जाता है. ऐसा न करने पर, डिफ़ॉल्ट वैल्यू अब भी “true" ही रहती है Android 4.2 और उसके बाद वाले वर्शन पर भी काम करता है.

  • Android के पिछले वर्शन की तुलना में, उपयोगकर्ता की जगह की जानकारी के नतीजे कम सटीक हो सकते हैं अगर आपका ऐप्लिकेशन ACCESS_COARSE_LOCATION की अनुमति का अनुरोध करता है, ACCESS_FINE_LOCATION अनुमति का अनुरोध नहीं करता है.

    जब आपका ऐप्लिकेशन अनुमानित जगह की जानकारी देता है, लेकिन सिस्टम सही जगह नहीं करता. सिस्टम, उपयोगकर्ता की जगह की अनुमानित जानकारी नहीं देगा ज़्यादा सही रहेगा.

  • Settings.System की ओर से तय की गई कुछ डिवाइस सेटिंग अब हैं रीड-ओनली. अगर आपका ऐप्लिकेशन, Settings.System में तय की गई उन सेटिंग में बदलाव करने की कोशिश करता है जिन्हें Settings.Global पर ले जाया गया है, तो Android 4.2 और उसके बाद वाले वर्शन पर चलने पर, लिखने की कार्रवाई चुपचाप विफल हो जाएगी.

    भले ही android:targetSdkVersion और android:minSdkVersion के लिए आपकी वैल्यू 17 से कम हो, फिर भी आपका ऐप्लिकेशन उन सेटिंग में बदलाव नहीं कर पाएगा जो Android 4.2 और इसके बाद वाले वर्शन पर चलने पर Settings.Global में ले जाया गया.

  • अगर आपका ऐप्लिकेशन WebView का इस्तेमाल करता है, तो Android 4.2 सुरक्षा है, ताकि आप और अधिक सुरक्षित रूप से JavaScript को अपने Android कोड. अगर आपने targetSdkVersion 17 या उससे ज़्यादा पर सेट करने के लिए, अब आपको किसी भी तरीके में @JavascriptInterface एनोटेशन जोड़ना होगा को आपके JavaScript में उपलब्ध कराना है (यह तरीका सार्वजनिक भी होना चाहिए). यदि आप एनोटेशन, इस तरीके को आपके WebView के किसी वेब पेज से ऐक्सेस नहीं किया जा सकता Android 4.2 या उसके बाद वाले वर्शन पर चल रहे हों. अगर आप targetSdkVersion अगर आपको 16 या उससे कम का इस्तेमाल करना है, तो एनोटेशन की ज़रूरत नहीं है. हालांकि, हमारा सुझाव है कि आप अपने टारगेट वर्शन को अपडेट करें और अतिरिक्त सुरक्षा के लिए एनोटेशन जोड़ें.

    बाइंडिंग Android कोड के लिए JavaScript कोड.

Daydream

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

आप DreamService की सब-क्लास लागू करके, Daydream के लिए एक सपना बना सकते हैं. DreamService एपीआई Activity के जैसा डिज़ाइन किया गया है. अपने बाद में किसी भी समय, setContentView() को लेआउट रिसॉर्स आईडी या View पास करें कोई विंडो, जैसे कि onAttachedToWindow() से कॉलबैक.

DreamService क्लास अन्य ज़रूरी लाइफ़साइकल कॉलबैक उपलब्ध कराती है बेस Service APIs के ऊपर मौजूद तरीकों, जैसे कि onDreamingStarted(), onDreamingStopped(), और onDetachedFromWindow(). आप अपनेDreamService ऐप्लिकेशन—इसे सिस्टम अपने-आप लॉन्च कर देता है.

अगर आपका सपना इंटरैक्टिव है, तो आप सपने से गतिविधि शुरू कर सकते हैं. इसमें उपयोगकर्ता को अपने ऐप्लिकेशन के पूरे यूज़र इंटरफ़ेस (यूआई) पर जाएं. आप finish() का इस्तेमाल करके ड्रीम को खत्म कर सकते हैं, ताकि उपयोगकर्ता नई गतिविधि.

सिस्टम पर अपना Daydream उपलब्ध कराने के लिए, <service> एलिमेंट के साथ अपने DreamService के बारे में बताएं को अपलोड करने की ज़रूरत नहीं है. इसके बाद, आपको "android.service.dreams.DreamService" कार्रवाई के साथ एक इंटेंट फ़िल्टर शामिल करना होगा. उदाहरण के लिए:

<service android:name=".MyDream" android:exported="true"
    android:icon="@drawable/dream_icon" android:label="@string/dream_label" >
    <intent-filter>
        <action android:name="android.service.dreams.DreamService" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</service>

DreamService में काम के कुछ अन्य तरीके भी हैं ध्यान रखें:

  • setInteractive(boolean) यह कंट्रोल करता है कि सपनों को उपयोगकर्ता के इनपुट के तुरंत बाद इनपुट इवेंट मिलते हैं या वे तुरंत बाहर निकल जाते हैं. अगर ड्रीम हो इंटरैक्टिव है, तो उपयोगकर्ता सपने से बाहर निकलने के लिए वापस जाएं या होम बटन का इस्तेमाल कर सकता है या आप कॉल कर सकते हैं ड्रीम को रोकने के लिए finish().
  • अगर आपको पूरा इमर्सिव डिसप्ले चाहिए, तो स्टेटस बार को छिपाने के लिए setFullscreen() पर कॉल करें.
  • Daydream शुरू होने से पहले, डिवाइस की स्क्रीन की रोशनी कम हो जाती है, ताकि उपयोगकर्ता को यह बताया जा सके कि डिवाइस इस्तेमाल न होने पर टाइम आउट हो गया है आने वाला है. setScreenBright(true) को कॉल करने पर, आपको डिसप्ले की रोशनी को सामान्य लेवल पर सेट करने की सुविधा मिलती है.

ज़्यादा जानकारी के लिए, DreamService दस्तावेज़ देखें.

दूसरे डिसप्ले

Android अब आपके ऐप्लिकेशन को कनेक्ट की गई अतिरिक्त स्क्रीन पर यूनीक कॉन्टेंट दिखाने की अनुमति देता है उपयोगकर्ता के डिवाइस को तार वाले कनेक्शन या वाई-फ़ाई से कनेक्ट करें. दूसरे डिसप्ले के लिए यूनीक कॉन्टेंट बनाने के लिए, Presentation को बढ़ाएं क्लास और onCreate() कॉलबैक लागू करें. इतने समय में onCreate(), सेकंडरी डिसप्ले के लिए अपना यूज़र इंटरफ़ेस (यूआई) बताएं setContentView() पर कॉल करके. Dialog क्लास के एक्सटेंशन के तौर पर, Presentation क्लास वह इलाका उपलब्ध कराती है जहां आपका ऐप्लिकेशन किसी खास यूज़र इंटरफ़ेस (यूआई) को दिखा सकता है सेकंडरी डिसप्ले.

सेकंडरी डिसप्ले का पता लगाने के लिए, जहां Presentation को डिसप्ले किया जा सकता है, DisplayManager या MediaRouter का इस्तेमाल करें एपीआई. हालांकि, DisplayManager एपीआई की मदद से एक साथ कनेक्ट किए जा सकने वाले कई डिसप्ले के लिए, आपको आम तौर पर MediaRouter का इस्तेमाल करना चाहिए. इसके बजाय, इससे सिस्टम के डिफ़ॉल्ट डिसप्ले को तुरंत ऐक्सेस किया जा सकता है प्रज़ेंटेशन.

अपने प्रज़ेंटेशन का डिफ़ॉल्ट डिसप्ले पाने के लिए, MediaRouter.getSelectedRoute() को कॉल करें और इसे पास करें ROUTE_TYPE_LIVE_VIDEO. यह एक MediaRouter.RouteInfo ऑब्जेक्ट दिखाता है, जो सिस्टम के हाल ही में चुने गए रास्ते की जानकारी देता है का इस्तेमाल किया जा सकता है. अगर MediaRouter.RouteInfo खाली नहीं है, तो कॉल करें कनेक्ट किए गए डिसप्ले को दिखाने वाला Display पाने के लिए getPresentationDisplay().

इसके बाद, Display ऑब्जेक्ट को पास करके, अपना प्रज़ेंटेशन दिखाया जा सकता है को आपकी Presentation क्लास के लिए कंस्ट्रक्टर की ओर ले जाएगा. आपके प्रज़ेंटेशन में अब सेकंडरी डिसप्ले पर दिखते हैं.

किसी नए डिसप्ले के कनेक्ट होने पर रनटाइम के दौरान इसका पता लगाने के लिए, MediaRouter.SimpleCallback का एक इंस्टेंस बनाएं. इसमें onRoutePresentationDisplayChanged() कॉलबैक तरीका लागू किया जाता है. नए डिसप्ले के कनेक्ट होने पर सिस्टम इसे कॉल करेगा प्रज़ेंटेशन डिसप्ले कनेक्ट हो गया है. इसके बाद, ROUTE_TYPE_LIVE_VIDEO रास्ते के साथ-साथ MediaRouter.addCallback() को पास करके, MediaRouter.SimpleCallback को रजिस्टर करें. जब आपको onRoutePresentationDisplayChanged(), ऊपर बताए गए तरीके से MediaRouter.getSelectedRoute() पर कॉल करें.

इसके लिए अपने Presentation में यूज़र इंटरफ़ेस (यूआई) को और ऑप्टिमाइज़ करने के लिए दूसरी स्क्रीन, तो आप आवेदन कर सकते हैं एक अलग थीम बनाने के लिए, <style> में android:presentationTheme एट्रिब्यूट की वैल्यू बताएं आपके ऐप्लिकेशन या गतिविधि पर लागू होता है.

ध्यान रखें कि उपयोगकर्ता के डिवाइस से कनेक्ट की गई स्क्रीन की स्क्रीन का साइज़ बड़ा होता है और स्क्रीन की सघनता अलग-अलग हो सकती है. स्क्रीन की विशेषताएं अलग-अलग हो सकती हैं. इसलिए, आपको ऐसे बड़े डिसप्ले के लिए खास तौर पर ऑप्टिमाइज़ किए गए संसाधन उपलब्ध कराना. अगर आपको अपने Presentation से अन्य संसाधनों का अनुरोध करने के लिए, getContext().getResources() पर कॉल करें और डिसप्ले से जुड़ा Resources ऑब्जेक्ट पाएं. इससे यह पता चलता है आपके ऐप्लिकेशन के सही संसाधन चुनें, जो सेकंडरी डिसप्ले का स्क्रीन साइज़ और सघनता.

ज़्यादा जानकारी और कुछ कोड सैंपल के लिए, Presentation देखें क्लास दस्तावेज़.

लॉकस्क्रीन विजेट

Android अब उपयोगकर्ताओं को लॉक स्क्रीन में ऐप विजेट जोड़ने देता है. आपके ऐप्लिकेशन विजेट को लॉक स्क्रीन पर, अपनी उस एक्सएमएल फ़ाइल में android:widgetCategory एट्रिब्यूट जोड़ें जो AppWidgetProviderInfo को तय करती है. इस एट्रिब्यूट में दो वैल्यू इस्तेमाल की जा सकती हैं: home_screen और keyguard. डिफ़ॉल्ट रूप से, इस एट्रिब्यूट को home_screen पर सेट किया जाता है, ताकि लोग आपकी ऐसेट जोड़ सकें ऐप विजेट को होम स्क्रीन पर जोड़ें. अगर आप चाहते हैं कि लॉक पेज पर भी आपका ऐप्लिकेशन का विजेट उपलब्ध रहे स्क्रीन पर, keyguard वैल्यू जोड़ें:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:widgetCategory="keyguard|home_screen">
</appwidget-provider>

आपको अपने ऐप्लिकेशन के विजेट के लिए, शुरुआती लेआउट तय करना होगा. ऐसा तब करना चाहिए, जब लॉक स्क्रीन पर android:initialKeyguardLayout एट्रिब्यूट. यह android:initialLayout की तरह ही काम करता है, जिसमें यह ऐसा लेआउट जो आपके ऐप्लिकेशन का विजेट शुरू होने और लेआउट.

लॉक स्क्रीन के लिए ऐप्लिकेशन विजेट बनाने के बारे में ज़्यादा जानकारी के लिए, जिसमें लॉक स्क्रीन के लिए विजेट बनाना भी शामिल है लॉक स्क्रीन पर ऐप्लिकेशन विजेट का साइज़ सेट करने के लिए, ऐप्लिकेशन विजेट गाइड देखें.

एक से ज़्यादा उपयोगकर्ता

Android, अब शेयर किए जा सकने वाले डिवाइसों (जैसे, टैबलेट) पर एक से ज़्यादा उपयोगकर्ताओं को स्पेस देने की सुविधा देता है. हर उपयोगकर्ता ने डिवाइस में खातों, ऐप्लिकेशन, सिस्टम सेटिंग, फ़ाइलों वगैरह का अपना अलग सेट होता है उपयोगकर्ता से जुड़ा डेटा.

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

ऐसे माहौल में डेटा सेव करना जहां कई उपयोगकर्ता काम करते हैं

जब भी आपका ऐप्लिकेशन उपयोगकर्ता की प्राथमिकताओं को सेव करता है, डेटाबेस बनाता है या उपयोगकर्ता के ऐप्लिकेशन में कोई फ़ाइल लिखता है करते हैं, तो उस डेटा को सिर्फ़ उपयोगकर्ता के तौर पर इस्तेमाल किया जा सकता है.

यह पक्का करने के लिए कि आपका ऐप्लिकेशन मल्टी-यूज़र एनवायरमेंट में सही तरीके से काम करे, अपने इंटरनल ऐप्लिकेशन डायरेक्ट्री या बाहरी स्टोरेज की जगह की जानकारी के लिए हार्ड कोड किए गए पाथ का इस्तेमाल करें और इसके बजाय हमेशा सही एपीआई:

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

मल्टी-यूज़र एनवायरमेंट में उपयोगकर्ताओं की पहचान करना

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

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

नई वैश्विक सेटिंग

Settings.Global के अलावा, कई उपयोगकर्ताओं के लिए सिस्टम की सेटिंग अपडेट कर दी गई हैं. सेटिंग का यह कलेक्शन, Settings.Secure की सेटिंग से मिलता-जुलता है, क्योंकि ये सिर्फ़ पढ़ने के लिए होती हैं. हालांकि, ये सभी सेटिंग पर लागू होती हैं उपयोगकर्ता के सभी स्पेस.

कई मौजूदा सेटिंग को Settings.System या Settings.Secure से यहां ट्रांसफ़र कर दिया गया है. अगर आपका ऐप्लिकेशन फ़िलहाल, Settings.System में पहले तय की गई सेटिंग में बदलाव किए जा रहे हैं (जैसे कि AIRPLANE_MODE_ON), तो आपको यह उम्मीद करनी चाहिए कि ऐसा करने से Android 4.2 या उसके बाद के वर्शन वाले डिवाइस पर, वे सेटिंग काम नहीं करेंगी Settings.Global में ले जाया गया. आप उन सेटिंग को पढ़ना जारी रख सकते हैं जिनमें Settings.Global, लेकिन क्योंकि अब सेटिंग को सुरक्षित नहीं माना जा रहा है अगर कोई ऐप बदला नहीं जाता है, तो ऐसा करने की कोशिश चुपचाप विफल हो जाएगी और सिस्टम Android 4.2 या उसके बाद के वर्शन पर आपका ऐप्लिकेशन चलाते समय सिस्टम लॉग.

आरटीएल लेआउट सपोर्ट

Android में अब कई एपीआई की सुविधा है. इससे आपको यूज़र इंटरफ़ेस को बेहतर तरीके से बनाने में मदद मिलती है दाएं-से-बाएं (RTL) यूज़र इंटरफ़ेस (यूआई) और रीडिंग का इस्तेमाल करने वाली भाषाओं का समर्थन करने के लिए लेआउट ओरिएंटेशन को बदलना जैसे अरबी और हिब्रू.

अपने ऐप्लिकेशन में आरटीएल लेआउट इस्तेमाल करने के लिए, अपनी मेनिफ़ेस्ट फ़ाइल में android:supportsRtl एट्रिब्यूट को <application> एलिमेंट पर सेट करें और इसे “true" पर सेट करें. इस सुविधा को चालू करने के बाद, सिस्टम कई आरटीएल एपीआई को इन कामों के लिए चालू कर देगा अपने ऐप्लिकेशन को RTL लेआउट के साथ दिखाएं. उदाहरण के लिए, कार्रवाई बार आइकन और शीर्षक दिखाएगा दाईं ओर मौजूद है और बाईं ओर ऐक्शन बटन मौजूद हैं. साथ ही, आपके बनाए गए लेआउट की मदद से, फ़्रेमवर्क से दी गई View क्लास भी उलट दी जाएंगी.

अगर आपको आरटीएल लेआउट के साथ अपने ऐप्लिकेशन के दिखने का तरीका और बेहतर बनाना है, तो ऑप्टिमाइज़ेशन के दो बुनियादी लेवल होते हैं:

  1. बाएं और दाएं कोने वाले लेआउट की प्रॉपर्टी को स्टार्ट और एंड ओरिएंटेड लेआउट में बदलें प्रॉपर्टी.

    उदाहरण के लिए, android:layout_marginStart इस्तेमाल करें android:layout_marginLeft के स्थान पर और android:layout_marginRight के स्थान पर android:layout_marginEnd.

    RelativeLayout क्लास संबंधित लेआउट भी देती है बाईं/दाईं जगह बदलने के लिए एट्रिब्यूट, जैसे कि android:layout_alignParentStart से इसके बजाय, android:layout_alignParentLeft और android:layout_toStartOf को बदलें android:layout_toLeftOf.

  2. या RTL लेआउट के लिए पूरा ऑप्टिमाइज़ेशन देने के लिए, आप पूरी तरह से अलग लेआउट फ़ाइलें जो ldrtl रिसॉर्स क्वालीफ़ायर का इस्तेमाल करती हैं (ldrtl का मतलब है लेआउट-डाइरेक्टेशन-राइट-टू-लेफ़्ट}). उदाहरण के लिए, आप अपनी डिफ़ॉल्ट लेआउट फ़ाइलें res/layout/ और res/layout-ldrtl/ में आपके आरटीएल ऑप्टिमाइज़ किए गए लेआउट.

    ldrtl क्वालीफ़ायर, ड्रॉ करने लायक संसाधनों के लिए बहुत अच्छा है, ताकि आप ऐसे ग्राफ़िक्स जो पढ़ने की दिशा के मुताबिक होते हैं.

RTL लेआउट के साथ काम करने के लिए, पूरे फ़्रेमवर्क में कई अन्य एपीआई उपलब्ध हैं. जैसे, View क्लास का इस्तेमाल करें, ताकि आप कस्टम प्रॉपर्टी के लिए सही व्यवहार लागू कर सकें व्यू और Configuration में दिख सकते हैं.

ध्यान दें: अगर SQlite का इस्तेमाल किया जा रहा है और आपके पास ऐसी टेबल या कॉलम के नाम हैं जो “सिर्फ़ नंबर के लिए" होना सावधान: String.format(String, Object...) का इस्तेमाल करने पर गड़बड़ी हो सकती है, जहां संख्याएं अगर आपका डिवाइस अरबी भाषा में सेट है, तो आपके डिवाइस को अरबी भाषा में बदला जा सकता है. String.format(Locale,String,Object...) का इस्तेमाल करके पक्का करें कि ASCII के तौर पर सुरक्षित रखा गया. इसके बजाय, String.format("%d", int) का इस्तेमाल करें इसके लिए String.valueOf(int): कर सकते हैं.

नेस्ट किए गए फ़्रैगमेंट

अब फ़्रैगमेंट में फ़्रैगमेंट जोड़े जा सकते हैं. यह कई तरह की स्थितियों में काम आता है, जैसे कि जिसके लिए, आपको डाइनैमिक और फिर से इस्तेमाल किए जा सकने वाले यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट को उस यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट में रखना है जो खुद और फिर से इस्तेमाल किया जा सकता है. उदाहरण के लिए, अगर आप ViewPager का इस्तेमाल ऐसे फ़्रैगमेंट बनाते हैं जो बाईं और दाईं ओर स्वाइप करते हैं और स्क्रीन के ज़्यादातर हिस्से का इस्तेमाल करते हैं. अब हर फ़्रैगमेंट पेज में फ़्रैगमेंट डालें.

किसी फ़्रैगमेंट को नेस्ट करने के लिए, getChildFragmentManager() को सिर्फ़ इस पर कॉल करें Fragment जिसमें आपको कोई फ़्रैगमेंट जोड़ना है. इससे एक FragmentManager मिलता है, जिसका इस्तेमाल उसी तरह किया जा सकता है जैसा कि आम तौर पर, टॉप लेवल गतिविधि के आधार पर किया जाता है फ़्रैगमेंट ट्रांज़ैक्शन बनाने के लिए. उदाहरण के लिए, यहां कुछ कोड दिए गए हैं जो कोड के अंदर से फ़्रैगमेंट जोड़ता है मौजूदा Fragment क्लास:

Kotlin

val videoFragment = VideoPlayerFragment()
childFragmentManager.beginTransaction().apply {
    add(R.id.video_fragment, videoFragment)
    commit()
}

Java

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

नेस्ट किए गए फ़्रैगमेंट में से, आप कॉल करके पैरंट फ़्रैगमेंट का रेफ़रंस पा सकते हैं getParentFragment().

Android Support Library अब नेस्ट किए गए फ़्रैगमेंट के साथ भी काम करता है, ताकि आप नेस्ट किए गए फ़्रैगमेंट को लागू कर सकें Android 1.6 और इसके बाद के वर्शन पर फ़्रैगमेंट डिज़ाइन.

ध्यान दें: किसी लेआउट को फ़्रैगमेंट में इनफ़्लेट नहीं किया जा सकता <fragment> शामिल है. नेस्ट किए गए फ़्रैगमेंट सिर्फ़ तब काम करते हैं, जब फ़्रैगमेंट को डाइनैमिक तौर पर इस्तेमाल किया जा सकता है.

रेंडरस्क्रिप्ट

इन सुविधाओं की मदद से, रेंडर स्क्रिप्ट कंप्यूटेशन (हिसाब लगाना) की सुविधा को बेहतर बना दिया गया है:

स्क्रिप्ट इंट्रिक्स

आप रेंडर स्क्रिप्ट में पहले से मौजूद स्क्रिप्ट इंट्रंसिक्स का इस्तेमाल कर सकते हैं, जो लागू करने के लिए इनमें कुछ सामान्य कार्रवाइयां शामिल हैं:

मूल स्क्रिप्ट का इस्तेमाल करने के लिए, हर instrinsic के स्टैटिक create() तरीके को कॉल करें स्क्रिप्ट का इंस्टेंस बनाने के लिए. इसके बाद, उपलब्ध set() पर कॉल करें हर स्क्रिप्ट में ज़रूरी इनपुट और विकल्प सेट करने के तरीके शामिल होते हैं. आखिर में, forEach() पर कॉल करें का तरीका बताया गया है.

स्क्रिप्ट ग्रुप

ScriptGroup की मदद से, मिलते-जुलते 'रेंडरस्क्रिप्ट' का इस्तेमाल एक साथ किया जा सकता है और उन्हें एक ही कॉल से एक्ज़ीक्यूट किया जा सकता है.

सभी स्क्रिप्ट को ग्रुप में जोड़ने के लिए, ScriptGroup.Builder का इस्तेमाल करें addKernel() पर कॉल करके. एक बार सभी स्क्रिप्ट जोड़ें, तो addConnection() पर कॉल करके स्क्रिप्ट तैयार करें. कनेक्शन जोड़ने के बाद, create() पर कॉल करें स्क्रिप्ट ग्रुप बनाने के लिए. स्क्रिप्ट ग्रुप को चलाने से पहले, इनपुट डालें Allocation और शुरुआती स्क्रिप्ट setInput(Script.KernelID, Allocation) तरीका और आउटपुट दें Allocation जहां नतीजा इसी को लिखा जाएगा और आखिरी स्क्रिप्ट setOutput() के साथ चलाएं. आख़िर में, कॉल करें स्क्रिप्ट ग्रुप चलाने के लिए execute().

फ़िल्टरस्क्रिप्ट

फ़िल्टरस्क्रिप्ट, मौजूदा Renderscript API पर मौजूद कंस्ट्रेंट के बारे में बताता है, जिसकी मदद से नतीजे दिए गए कोड को चलाया जाता है पर इस्तेमाल किया जा सकता है. फ़िल्टरस्क्रिप्ट फ़ाइलें बनाने के लिए, .fs बनाएं .rs फ़ाइलों के बजाय अन्य फ़ाइलें सेव करें और #pragma rs_fp_relaxed को 'रेंडरस्क्रिप्ट' रनटाइम के दौरान, आपकी स्क्रिप्ट के लिए आईईईई 754-2008 फ़्लोटिंग पॉइंट के सख्त होने की ज़रूरत नहीं होती. यह सटीक होने की वजह से, डेनॉर्म के लिए फ़्लश-टू-ज़ीरो और राउंड-टू-ज़ीरो तक हो सकता है. इसके अलावा, आपकी फ़िल्टर स्क्रिप्ट स्क्रिप्ट में 32-बिट बिल्ट-इन टाइप का इस्तेमाल नहीं किया जाना चाहिए और __attribute__((kernel)) एट्रिब्यूट की मदद से, फ़िल्टर स्क्रिप्ट लिखने के लिए पॉइंटर इस्तेमाल नहीं किए जा सकते. root() फ़ंक्शन का डिफ़ॉल्ट सिग्नेचर तय करता है.

ध्यान दें: हालांकि, फ़िल्टरस्क्रिप्ट की सुविधा प्लैटफ़ॉर्म में उपलब्ध है, लेकिन डेवलपर SDK टूल के रिलीज़ 21.0.1 वर्शन में सहायता उपलब्ध होगी.

Android 4.2 में सभी API बदलावों के विस्तृत दृश्य के लिए, एपीआई में अंतर की रिपोर्ट.