Android 4.2 API

API লেভেল: 17

Android 4.2 (JELLY_BEAN_MR1) হল Jelly Bean রিলিজের একটি আপডেট যা ব্যবহারকারী ও অ্যাপ ডেভেলপারদের জন্য নতুন ফিচার অফার করে। এই ডকুমেন্ট ডেভেলপারদের জন্য সবচেয়ে উল্লেখযোগ্য ও উপযোগী নতুন API-এর সাথে পরিচয় করিয়ে দেয়।

অ্যাপ ডেভেলপার হিসেবে, আপনাকে Android 4.2 সিস্টেম ইমেজ ও SDK প্ল্যাটফর্ম SDK ম্যানেজার থেকে যত তাড়াতাড়ি সম্ভব ডাউনলোড করতে হবে। আপনার অ্যাপ পরীক্ষা করার জন্য Android 4.2 ভার্সন চলে এমন ডিভাইস না থাকলে, Android এমুলেটরে আপনার অ্যাপ পরীক্ষা করার জন্য Android 4.2 সিস্টেম ইমেজ ব্যবহার করুন। তারপর, লেটেস্ট API ব্যবহার করা শুরু করতে Android 4.2 প্ল্যাটফর্মের জন্য আপনার অ্যাপ তৈরি করুন।

Android 4.2 ভার্সনে চলে এমন ডিভাইসের জন্য আপনার অ্যাপ আরও ভালোভাবে অপ্টিমাইজ করতে, আপনাকে targetSdkVersion-কে "17" হিসেবে সেট করতে হবে, Android 4.2 সিস্টেম ইমেজে এটি ইনস্টল করতে হবে, পরীক্ষা করতে হবে, তারপর এই পরিবর্তন সহ একটি আপডেট প্রকাশ করতে হবে।

আপনার minSdkVersion-এ কাজ করে না এমন API এক্সিকিউট করার আগে সিস্টেম API লেভেল চেক করার জন্য আপনার কোডে কন্ডিশন যোগ করে আপনি Android 4.2-এ API ব্যবহার করতে পারেন এবং একই সাথে পুরনো ভার্সনেও কাজ করতে পারেন। ব্যাকওয়ার্ড-কম্প্যাটিবিলিটি বজায় রাখার ব্যাপারে আরও জানতে, ব্যাকওয়ার্ড-কম্প্যাটিবল UI তৈরি করা নিবন্ধটি পড়ুন।

API লেভেল কীভাবে কাজ করে সেই সম্পর্কে আরও তথ্য API লেভেল কী কী? লিঙ্কে উপলভ্য।

আচরণে গুরুত্বপূর্ণ পরিবর্তন

আপনি আগে Android-এর জন্য কোনও অ্যাপ প্রকাশ করে থাকলে, নিম্নলিখিত পরিবর্তনগুলি সম্পর্কে সচেতন থাকুন যেগুলি আপনার অ্যাপের আচরণকে প্রভাবিত করতে পারে:

  • কন্টেন্ট প্রোভাইডার আর ডিফল্ট হিসেবে এক্সপোর্ট করা হয় না। অর্থাৎ, android:exported অ্যাট্রিবিউটের ডিফল্ট ভ্যালু এখন “false"। অন্যান্য অ্যাপ যাতে আপনার কন্টেন্ট প্রোভাইডার অ্যাক্সেস করতে পারে, তা যদি গুরুত্বপূর্ণ হয়, তাহলে আপনাকে এখন স্পষ্টভাবে android:exported="true" সেট করতে হবে।

    আপনি android:targetSdkVersion অথবা android:minSdkVersion-এর মধ্যে যেকোনও একটি ১৭ বা তার বেশি সেট করলে তবেই এই পরিবর্তন কার্যকর হবে। অন্যথায়, Android 4.2 ও তার পরবর্তী যেকোনও ভার্সনে রান করার সময়ও ডিফল্ট ভ্যালু “true" হিসেবেই থেকে যায়।

  • Android-এর আগের ভার্সনের তুলনায়, আপনার অ্যাপ ACCESS_COARSE_LOCATION অনুমতি চাইলে কিন্তু ACCESS_FINE_LOCATION অনুমতি না চাইলে, ব্যবহারকারীর লোকেশন সংক্রান্ত ফলাফল কম সঠিক হতে পারে।

    আপনার অ্যাপ আনুমানিক লোকেশনের (এবং সুনির্দিষ্ট লোকেশন নয়) জন্য অনুমতি চাইলে, ব্যবহারকারীর গোপনীয়তা সংক্রান্ত প্রত্যাশা পূরণ করতে, সিস্টেম ব্যবহারকারীর লোকেশনের এমন অনুমান প্রদান করবে না যা সিটি ব্লকের চেয়ে বেশি সঠিক।

  • Settings.System-এর দ্বারা নির্ধারিত কিছু ডিভাইস সেটিংস এখন রিড-অনলি। আপনার অ্যাপ যদি Settings.System-এ সংজ্ঞায়িত সেটিংস পরিবর্তন করার চেষ্টা করে যা Settings.Global-এ চলে গেছে, Android 4.2 এবং তার পরের যেকোনও ভার্সনে রান করার সময় রাইট অপারেশন নীরবে ব্যর্থ হবে।

    android:targetSdkVersion এবং android:minSdkVersion-এর জন্য আপনার ভ্যালু ১৭-এর কম হলেও, Android 4.2 এবং তার পরবর্তী ভার্সনে চালানোর সময় আপনার অ্যাপ Settings.Global-এ সরানো সেটিংস পরিবর্তন করতে পারবে না।

  • আপনার অ্যাপ WebView ব্যবহার করলে, Android 4.2 অতিরিক্ত লেয়ারের নিরাপত্তা যোগ করে, যাতে আপনি আরও নিরাপদে আপনার Android কোডে JavaScript বাইন্ড করতে পারেন। আপনি যদি targetSdkVersion ১৭ বা তার বেশি হিসেবে সেট করেন, তাহলে আপনার জাভাস্ক্রিপ্টে উপলভ্য করতে চান এমন যেকোনও পদ্ধতিতে @JavascriptInterface অ্যানোটেশন যোগ করতে হবে (পদ্ধতিটি সর্বজনীনও হতে হবে)। আপনি অ্যানোটেশন প্রদান না করলে, Android 4.2 বা তার পরবর্তী ভার্সনে রান করার সময় আপনার WebView-এর কোনও ওয়েব পেজ থেকে পদ্ধতিটি অ্যাক্সেস করা যাবে না। আপনি যদি targetSdkVersion ১৬ বা তার কম সেট করেন, তাহলে অ্যানোটেশনের প্রয়োজন নেই, তবে আমরা সাজেস্ট করি যে আপনি টার্গেট ভার্সন আপডেট করুন এবং অতিরিক্ত নিরাপত্তার জন্য অ্যানোটেশন যোগ করুন।

    Android কোডের সাথে জাভাস্ক্রিপ্ট কোড বাইন্ড করা সম্পর্কে আরও পড়ুন।

ডেড্রিম

Daydream হল Android ডিভাইসের জন্য একটি নতুন ইন্ট্যার‍্যাক্টিভ স্ক্রিনসেভার মোড। ডিভাইসটি ডকে ঢোকানো হলে অথবা চার্জারে প্লাগ-ইন করা অবস্থায় সেটি অলস অবস্থায় থাকলে (স্ক্রিন বন্ধ করার পরিবর্তে), এটি অটোমেটিক চালু হয়ে যায়। Daydream একবারে একটি ড্রিম দেখায়, যা সম্পূর্ণ ভিজ্যুয়াল, প্যাসিভ ডিসপ্লে হতে পারে যা টাচ করলে বন্ধ হয়ে যায় অথবা ইন্টার‍্যাক্টিভ ও ইনপুট ইভেন্টের সম্পূর্ণ সুইটের প্রতি রেসপন্সিভ হতে পারে। আপনার ড্রিম আপনার অ্যাপের প্রসেসে চলে এবং ভিউ, লেআউট ও অ্যানিমেশন সহ Android UI টুলকিটে সম্পূর্ণ অ্যাক্সেস থাকে, তাই সেগুলি লাইভ ওয়ালপেপার বা অ্যাপ উইজেটের চেয়ে বেশি নমনীয় এবং শক্তিশালী।

DreamService-এর সাবক্লাস প্রয়োগ করে আপনি Daydream-এর জন্য ড্রিম তৈরি করতে পারবেন। DreamService API-কে Activity-এর মতো করে ডিজাইন করা হয়েছে। আপনার ড্রিমের জন্য UI নির্দিষ্ট করতে, উইন্ডো পাওয়ার পরে যেকোনও সময় লেআউট রিসোর্স আইডি বা View থেকে setContentView() পাস করুন, যেমন onAttachedToWindow() কলব্যাক থেকে।

DreamService ক্লাস, বেস Service API-এর উপরে অন্যান্য গুরুত্বপূর্ণ লাইফসাইকেল কলব্যাক মেথড প্রদান করে, যেমন onDreamingStarted(), onDreamingStopped() এবং onDetachedFromWindow()। আপনি নিজের অ্যাপ থেকে DreamService শুরু করতে পারবেন না—এটি সিস্টেমের মাধ্যমে অটোমেটিক চালু হয়।

আপনার ড্রিম ইন্টার‍্যাক্টিভ হলে, আপনি ড্রিম থেকে কোনও অ্যাক্টিভিটি শুরু করতে পারেন যাতে ব্যবহারকারীকে আরও বিবরণ বা কন্ট্রোলের জন্য আপনার অ্যাপের সম্পূর্ণ UI-তে পাঠানো যায়। আপনি finish() ব্যবহার করে ড্রিম শেষ করতে পারেন যাতে ব্যবহারকারী নতুন অ্যাক্টিভিটি দেখতে পান।

সিস্টেমে আপনার ডেড্রিম উপলভ্য করতে, আপনার ম্যানিফেস্ট ফাইলে <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 class এক্সটেন্ড করুন এবং onCreate() কলব্যাক প্রয়োগ করুন। onCreate()-এর মধ্যে, setContentView() কল করে সেকেন্ডারি ডিসপ্লের জন্য আপনার UI নির্দিষ্ট করুন। Dialog ক্লাসের এক্সটেনশন হিসেবে, Presentation ক্লাস সেই অঞ্চল প্রদান করে যেখানে আপনার অ্যাপ সেকেন্ডারি ডিসপ্লেতে একটি অনন্য UI দেখাতে পারে।

সেকেন্ডারি ডিসপ্লে শনাক্ত করতে, যেখানে আপনি নিজের Presentation ডিসপ্লে করতে পারবেন, DisplayManager অথবা MediaRouter API ব্যবহার করুন। DisplayManager API আপনাকে একসাথে কানেক্ট করা একাধিক ডিসপ্লে গণনা করার অনুমতি দিলেও, প্রেজেন্টেশনের জন্য সিস্টেমের ডিফল্ট ডিসপ্লে দ্রুত অ্যাক্সেস করতে সাধারণত 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-এ UI আরও অপ্টিমাইজ করতে, আপনি নিজের অ্যাপ্লিকেশন বা অ্যাক্টিভিটিতে প্রয়োগ করা <style>-এ android:presentationTheme অ্যাট্রিবিউট নির্দিষ্ট করে অন্য একটি থিম প্রয়োগ করতে পারেন।

মনে রাখবেন, ব্যবহারকারীর ডিভাইসের সাথে কানেক্ট করা স্ক্রিনের সাইজ প্রায়শই বড় হয় এবং সেটির স্ক্রিন ডেনসিটিও আলাদা হতে পারে। স্ক্রিনের বৈশিষ্ট্য আলাদা হতে পারে বলে, আপনাকে এমন রিসোর্স প্রদান করতে হবে যা বিশেষভাবে এই ধরনের বড় ডিসপ্লের জন্য অপ্টিমাইজ করা হয়েছে। আপনার Presentation থেকে অতিরিক্ত রিসোর্সের জন্য অনুরোধ করতে হলে, ডিসপ্লের সাথে সম্পর্কিত Resources অবজেক্ট পেতে getContext().getResources() কল করুন। এটি আপনার অ্যাপ থেকে উপযুক্ত রিসোর্স প্রদান করে যা সেকেন্ডারি ডিসপ্লের স্ক্রিন সাইজ ও ডেনসিটির জন্য সবচেয়ে উপযুক্ত।

আরও তথ্য ও কিছু কোড স্যাম্পেলের জন্য, Presentation ক্লাস ডকুমেন্টেশন দেখুন।

লকস্ক্রিন উইজেট

Android এখন ব্যবহারকারীদের লক স্ক্রিনে অ্যাপ উইজেট যোগ করার অনুমতি দেয়। আপনার অ্যাপ উইজেট লক স্ক্রিনে ব্যবহারের জন্য উপলভ্য করতে, আপনার XML ফাইলে 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 এখন ট্যাবলেট-এর মতো শেয়ার করা যায় এমন ডিভাইসে একাধিক ব্যবহারকারীর জন্য স্পেসের অনুমতি দেয়। ডিভাইসের প্রত্যেক ব্যবহারকারীর নিজস্ব অ্যাকাউন্ট, অ্যাপ, সিস্টেম সেটিংস, ফাইল এবং ব্যবহারকারীর সাথে সম্পর্কিত অন্যান্য ডেটা থাকে।

অ্যাপ ডেভেলপার হিসেবে, একটি ডিভাইসে একাধিক ব্যবহারকারীর সাথে আপনার অ্যাপ যাতে সঠিকভাবে কাজ করে, তার জন্য আপনাকে আলাদা করে কিছু করতে হবে না। একটি ডিভাইসে কতজন ব্যবহারকারী আছেন তা নির্বিশেষে, আপনার অ্যাপ কোনও নির্দিষ্ট ব্যবহারকারীর জন্য যে ডেটা সেভ করে তা অন্যান্য ব্যবহারকারীর জন্য আপনার অ্যাপের সেভ করা ডেটা থেকে আলাদা রাখা হয়। আপনার অ্যাপ যে ব্যবহারকারীর প্রসেসে রান করছে, সিস্টেম সেই ব্যবহারকারীর ডেটা ট্র্যাক করে এবং আপনার অ্যাপকে শুধুমাত্র সেই ব্যবহারকারীর ডেটা অ্যাক্সেস করার অনুমতি দেয় এবং অন্যান্য ব্যবহারকারীর ডেটা অ্যাক্সেস করার অনুমতি দেয় না।

একাধিক ব্যবহারকারীর এনভায়রনমেন্টে ডেটা সেভ করা

আপনার অ্যাপ যখনই ব্যবহারকারীর পছন্দ সেভ করে, ডেটাবেস তৈরি করে বা ব্যবহারকারীর ইন্টার্নাল বা এক্সটার্নাল স্টোরেজ স্পেসে ফাইল লেখে, সেই ডেটা শুধুমাত্র সেই ব্যবহারকারী হিসেবে রান করার সময় অ্যাক্সেস করা যায়।

মাল্টি-ইউজার এনভায়রনমেন্টে আপনার অ্যাপ সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করতে, হার্ড-কোডেড পাথ ব্যবহার করে আপনার ইন্টার্নাল অ্যাপ ডিরেক্টরি বা এক্সটার্নাল স্টোরেজ লোকেশন রেফার করবেন না এবং পরিবর্তে সবসময় উপযুক্ত API ব্যবহার করুন:

কোনও নির্দিষ্ট ব্যবহারকারীর জন্য ডেটা সেভ করতে আপনি এইসব API-এর মধ্যে যেটিই ব্যবহার করুন না কেন, অন্য ব্যবহারকারী হিসেবে রান করার সময় ডেটা অ্যাক্সেস করা যাবে না। আপনার অ্যাপের দৃষ্টিকোণ থেকে, প্রত্যেক ব্যবহারকারী সম্পূর্ণ আলাদা ডিভাইসে অ্যাপটি চালাচ্ছেন।

একাধিক ব্যবহারকারী আছেন এমন পরিবেশে ব্যবহারকারীদের শনাক্ত করা

আপনার অ্যাপ যদি অনন্য ব্যবহারকারীদের শনাক্ত করতে চায়, যেমন, অ্যানালিটিক্স সংগ্রহ করা বা অন্যান্য অ্যাকাউন্ট অ্যাসোসিয়েশন তৈরি করা, তাহলে আপনাকে অনন্য ইনস্টলেশন শনাক্ত করার জন্য সাজেস্ট করা পদ্ধতি অনুসরণ করতে হবে। আপনার অ্যাপ প্রথমবার চালু করার সময় নতুন UUID তৈরি করার মাধ্যমে, আপনি নিশ্চিতভাবে প্রত্যেক ব্যবহারকারীকে ট্র্যাক করার জন্য একটি অনন্য আইডি পাবেন, কোনও একটি ডিভাইসে কতজন ব্যবহারকারী আপনার অ্যাপ ইনস্টল করেছেন তা নির্বিশেষে। বিকল্প হিসেবে, আপনি নিজের সার্ভার থেকে পাওয়া লোকাল টোকেন সেভ করতে পারেন অথবা Google Cloud Messaging-এর দেওয়া রেজিস্ট্রেশন আইডি ব্যবহার করতে পারেন।

মনে রাখবেন, আপনার অ্যাপ হার্ডওয়্যার ডিভাইস শনাক্তকারী (যেমন, ওয়াই-ফাই 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 বা তার পরের যেকোনও ভার্সনে আপনার অ্যাপ চালানোর সময় সিস্টেম সিস্টেম লগে একটি সতর্কতা লিখবে।

RTL লেআউট সাপোর্ট

Android এখন বেশ কয়েকটি API অফার করে যা আপনাকে এমন ইউজার ইন্টারফেস তৈরি করতে দেয় যা লেআউট ওরিয়েন্টেশনকে সুন্দরভাবে রূপান্তর করে যাতে ডান-থেকে-বাম (RTL) UI এবং পড়ার দিকনির্দেশ ব্যবহার করে এমন ভাষাগুলিকে সমর্থন করে, যেমন আরবি এবং হিব্রু।

আপনার অ্যাপে RTL লেআউট সাপোর্ট করা শুরু করতে, আপনার ম্যানিফেস্ট ফাইলের <application> এলিমেন্টে android:supportsRtl অ্যাট্রিবিউট সেট করুন এবং এটি “true" হিসেবে সেট করুন। আপনি এটি চালু করলে, সিস্টেম বিভিন্ন RTL API চালু করবে যাতে আপনার অ্যাপ RTL লেআউটে দেখা যায়। যেমন, অ্যাকশন বার ডানদিকে আইকন ও নাম এবং বাঁদিকে অ্যাকশন বোতাম দেখাবে এবং ফ্রেমওয়ার্কের দেওয়া View ক্লাস দিয়ে তৈরি করা যেকোনও লেআউটও উল্টে যাবে।

RTL লেআউটের সাথে দেখানো হলে আপনার অ্যাপের চেহারা আরও অপ্টিমাইজ করার প্রয়োজন হলে, অপ্টিমাইজেশনের দুটি প্রাথমিক লেভেল আছে:

  1. বাঁদিক ও ডানদিক-ভিত্তিক লেআউট প্রপার্টিকে শুরু ও শেষ-ভিত্তিক লেআউট প্রপার্টিতে কনভার্ট করুন।

    যেমন, android:layout_marginLeft-এর জায়গায় android:layout_marginStart এবং android:layout_marginRight-এর জায়গায় android:layout_marginEnd ব্যবহার করুন।

    RelativeLayout ক্লাস, বাঁদিক/ডানদিকের পজিশন পরিবর্তন করার জন্য সংশ্লিষ্ট লেআউট অ্যাট্রিবিউটও প্রদান করে, যেমন android:layout_alignParentLeft-এর পরিবর্তে android:layout_alignParentStart এবং android:layout_toLeftOf-এর পরিবর্তে android:layout_toStartOf।

  2. অথবা RTL লেআউটের জন্য সম্পূর্ণ অপ্টিমাইজেশন প্রদান করতে, আপনি ldrtl রিসোর্স কোয়ালিফায়ার (ldrtl-এর অর্থ হল লেআউট-ডাইরেকশন-রাইট-টু-লেফ্ট) ব্যবহার করে সম্পূর্ণ আলাদা লেআউট ফাইল প্রদান করতে পারেন। যেমন, আপনি ডিফল্ট লেআউট ফাইল res/layout/-এ এবং RTL অপ্টিমাইজ করা লেআউট res/layout-ldrtl/-এ সেভ করতে পারেন।

    ldrtl কোয়ালিফায়ার ড্রয়েবল রিসোর্সের জন্য দারুণ, যাতে আপনি এমন গ্রাফিক্স প্রদান করতে পারেন যা পড়ার দিকের সাথে সামঞ্জস্য রেখে ওরিয়েন্ট করা হয়েছে।

RTL লেআউটকে সাপোর্ট করার জন্য ফ্রেমওয়ার্ক জুড়ে বিভিন্ন অন্যান্য API উপলভ্য, যেমন View ক্লাস যাতে আপনি কাস্টম ভিউয়ের জন্য সঠিক আচরণ প্রয়োগ করতে পারেন এবং Configuration-এ বর্তমান লেআউটের দিক কোয়েরি করতে পারেন।

মনে রাখবেন: আপনি যদি SQlite ব্যবহার করেন এবং আপনার টেবিল বা কলামের নাম "শুধুমাত্র সংখ্যা" হয়, তাহলে সতর্ক থাকুন: String.format(String, Object...) ব্যবহার করলে, আপনার ডিভাইসের লোকেল আরবিতে সেট করা থাকলে, সংখ্যাগুলি আরবিতে রূপান্তরিত হওয়ার কারণে সমস্যা হতে পারে। নম্বরগুলি ASCII হিসাবে সংরক্ষিত আছে কিনা তা নিশ্চিত করতে আপনাকে অবশ্যই String.format(Locale,String,Object...) ব্যবহার করতে হবে। এছাড়াও, নম্বর ফর্ম্যাট করার জন্য String.valueOf(int) ব্যবহার করার পরিবর্তে String.format("%d", int) ব্যবহার করুন।

নেস্ট করা ফ্র্যাগমেন্ট

আপনি এখন ফ্র্যাগমেন্টের মধ্যে ফ্র্যাগমেন্ট এম্বেড করতে পারবেন। এটি বিভিন্ন পরিস্থিতিতে কাজে লাগে, যেখানে আপনি এমন একটি UI কম্পোনেন্টে ডায়নামিক এবং আবার ব্যবহারযোগ্য UI কম্পোনেন্ট প্লেস করতে চান যা নিজেই ডায়নামিক এবং আবার ব্যবহারযোগ্য। যেমন, আপনি যদি ViewPager ব্যবহার করে এমন ফ্র্যাগমেন্ট তৈরি করেন যা বাঁদিকে ও ডানদিকে সোয়াইপ করে এবং স্ক্রিনের বেশিরভাগ জায়গা জুড়ে থাকে, তাহলে আপনি এখন প্রতিটি ফ্র্যাগমেন্ট পৃষ্ঠায় ফ্র্যাগমেন্ট যোগ করতে পারবেন।

ফ্র্যাগমেন্ট নেস্ট করতে, আপনি যে Fragment-এ ফ্র্যাগমেন্ট যোগ করতে চান সেটিতে শুধু getChildFragmentManager() কল করুন। এটি একটি FragmentManager রিটার্ন করে যা আপনি ফ্র্যাগমেন্ট ট্রানজ্যাকশন তৈরি করতে টপ-লেভেল অ্যাক্টিভিটি থেকে সাধারণত যেভাবে করেন সেভাবে ব্যবহার করতে পারেন। যেমন, এখানে এমন কিছু কোড দেওয়া হল যা আগে থেকে থাকা Fragment ক্লাস থেকে একটি ফ্র্যাগমেন্ট যোগ করে:

Kotlin

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

জাভা

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 কম্পিউটেশন ফাংশনালিটি নিম্নলিখিত ফিচার সহ উন্নত করা হয়েছে:

স্ক্রিপ্ট ইন্ট্রিনসিক

আপনি Renderscript-এর বিল্ট-ইন স্ক্রিপ্ট ইন্ট্রিনসিক ব্যবহার করতে পারেন যা আপনার জন্য সাধারণ অপারেশনগুলি বাস্তবায়ন করে, যেমন:

স্ক্রিপ্ট ইন্ট্রিনসিক ব্যবহার করতে, স্ক্রিপ্টের একটি ইনস্ট্যান্স তৈরি করতে প্রতিটি ইন্ট্রিনসিকের স্ট্যাটিক create() মেথড কল করুন। তারপর আপনি প্রতিটি স্ক্রিপ্টের অন্তর্নিহিত উপলভ্য set() মেথডকে কল করেন যাতে যেকোনও প্রয়োজনীয় ইনপুট এবং বিকল্প সেট করা যায়। সবশেষে, স্ক্রিপ্টটি কার্যকর করতে forEach() মেথডটি কল করুন।

স্ক্রিপ্ট গ্রুপ

ScriptGroup আপনাকে সম্পর্কিত Renderscript স্ক্রিপ্ট একসাথে চেইন করতে এবং একটি কলের মাধ্যমে সেগুলি এক্সিকিউট করতে দেয়।

addKernel() কল করে গ্রুপে সব স্ক্রিপ্ট যোগ করতে ScriptGroup.Builder ব্যবহার করুন। আপনি সব স্ক্রিপ্ট যোগ করার পরে, addConnection() কল করে স্ক্রিপ্টের মধ্যে কানেকশন তৈরি করুন। কানেকশন যোগ করা হয়ে গেলে, স্ক্রিপ্ট গ্রুপ তৈরি করতে create() কল করুন। স্ক্রিপ্ট গ্রুপ এক্সিকিউট করার আগে, ইনপুট Allocation ও setInput(Script.KernelID, Allocation) মেথডের সাথে চালানোর জন্য প্রাথমিক স্ক্রিপ্ট নির্দিষ্ট করুন এবং আউটপুট Allocation দিন যেখানে ফলাফল লেখা হবে এবং setOutput()-এর সাথে চালানোর জন্য ফাইনাল স্ক্রিপ্ট দিন। অবশেষে, স্ক্রিপ্ট গ্রুপ চালাতে execute() কল করুন।

Filterscript

ফিল্টারস্ক্রিপ্ট, আগে থেকে থাকা Renderscript API-এর উপর সীমাবদ্ধতা নির্ধারণ করে, যা ফলাফল হিসেবে পাওয়া কোডকে প্রসেসর (CPU, GPU ও DSP)-এর আরও বেশি বৈচিত্র্যের উপর রান করতে দেয়। Filterscript ফাইল তৈরি করতে, .rs ফাইলের পরিবর্তে .fs ফাইল তৈরি করুন এবং Renderscript রানটাইমকে জানানোর জন্য #pragma rs_fp_relaxed নির্দিষ্ট করুন যে আপনার স্ক্রিপ্টে IEEE 754-2008 ফ্লোটিং পয়েন্ট প্রিসিশন প্রয়োজন নেই। এই প্রিসিশন ডিনর্মের জন্য ফ্লাশ-টু-জিরো এবং রাউন্ড-টুওয়ার্ডস-জিরো করার অনুমতি দেয়। এছাড়াও, আপনার Filterscript স্ক্রিপ্টে ৩২-বিট বিল্ট-ইন টাইপ ব্যবহার করা যাবে না এবং __attribute__((kernel)) অ্যাট্রিবিউট ব্যবহার করে কাস্টম রুট ফাংশন নির্দিষ্ট করতে হবে, কারণ Filterscript পয়েন্টার সাপোর্ট করে না, যা root() ফাংশনের ডিফল্ট সিগনেচার নির্ধারণ করে।

মনে রাখবেন: প্ল্যাটফর্মে Filterscript-এর জন্য সহায়তা থাকলেও, SDK টুল রিলিজ ২১.০.১-এ ডেভেলপার সহায়তা উপলভ্য হবে।

Android 4.2-এ সব API পরিবর্তনের বিস্তারিত ভিউয়ের জন্য, API পার্থক্য রিপোর্ট দেখুন।