Android 4.2 के एपीआई

एपीआई लेवल: 17

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

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

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

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

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

व्यवहार से जुड़े अहम बदलाव

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

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

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

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

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

Daydream

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

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

DreamService क्लास, Service एपीआई के साथ-साथ, लाइफ़साइकल के दूसरे अहम कॉलबैक तरीकों को भी उपलब्ध कराती है. जैसे, 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() कॉलबैक तरीका लागू किया जाता है. नए डिसप्ले के कनेक्ट होने पर सिस्टम इसे कॉल करेगा प्रज़ेंटेशन डिसप्ले कनेक्ट हो गया है. इसके बाद, MediaRouter.SimpleCallback को MediaRouter.addCallback() के साथ-साथ ROUTE_TYPE_LIVE_VIDEO रूट टाइप के साथ पास करके रजिस्टर करें. जब आपको 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) में पहले से तय की गई सेटिंग में बदलाव कर रहा है, तो आपको यह उम्मीद करनी चाहिए कि अगर उन सेटिंग को Settings.Global में ले जाया गया है, तो ऐसा करने पर वे Android 4.2 या इसके बाद के वर्शन वाले डिवाइस पर काम नहीं करेंगी. Settings.Global में मौजूद सेटिंग को पढ़ा जा सकता है. हालांकि, अब ऐप्लिकेशन के लिए सेटिंग बदलना सुरक्षित नहीं माना जाता. इसलिए, ऐसा करने की कोशिश करने पर, सेटिंग में कोई बदलाव नहीं होगा. साथ ही, Android 4.2 या इसके बाद के वर्शन पर आपका ऐप्लिकेशन चलाने पर, सिस्टम लॉग में चेतावनी लिखी जाएगी.

दाएं से बाएं लिखने की सुविधा वाले लेआउट के लिए सहायता

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

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

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

  1. बाईं और दाईं ओर वाले लेआउट प्रॉपर्टी को, शुरू और आखिर वाले लेआउट प्रॉपर्टी में बदलें.

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

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

  2. इसके अलावा, आरटीएल लेआउट के लिए पूरी तरह से ऑप्टिमाइज़ेशन देने के लिए, 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> शामिल होने पर, उसे फ़्रैगमेंट में नहीं बढ़ाया जा सकता. नेस्ट किए गए फ़्रैगमेंट सिर्फ़ तब काम करते हैं, जब उन्हें किसी फ़्रैगमेंट में डाइनैमिक तौर पर जोड़ा जाता है.

Renderscript

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

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

Renderscript की पहले से मौजूद स्क्रिप्ट इन्सट्रिंस का इस्तेमाल किया जा सकता है. ये आपके लिए सामान्य कार्रवाइयां लागू करती हैं, जैसे कि:

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

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

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

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

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

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

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

Android 4.2 में एपीआई से जुड़े सभी बदलावों के बारे में ज़्यादा जानने के लिए, एपीआई में अंतर की रिपोर्ट देखें.