API স্তর: 17
Android 4.2 ( JELLY_BEAN_MR1 ) হল জেলি বিন রিলিজের একটি আপডেট যা ব্যবহারকারী এবং অ্যাপ বিকাশকারীদের জন্য নতুন বৈশিষ্ট্যগুলি অফার করে৷ এই নথিটি বিকাশকারীদের জন্য সবচেয়ে উল্লেখযোগ্য এবং দরকারী নতুন APIগুলির একটি ভূমিকা প্রদান করে৷
একজন অ্যাপ ডেভেলপার হিসেবে, আপনার যত তাড়াতাড়ি সম্ভব SDK ম্যানেজার থেকে Android 4.2 সিস্টেম ইমেজ এবং SDK প্ল্যাটফর্ম ডাউনলোড করা উচিত। আপনার অ্যাপটি পরীক্ষা করার জন্য Android 4.2 চালিত কোনো ডিভাইস না থাকলে, Android এমুলেটরে আপনার অ্যাপটি পরীক্ষা করতে Android 4.2 সিস্টেম ইমেজ ব্যবহার করুন। তারপরে সর্বশেষ APIs ব্যবহার শুরু করতে Android 4.2 প্ল্যাটফর্মের বিপরীতে আপনার অ্যাপগুলি তৈরি করুন৷
Android 4.2 চালিত ডিভাইসগুলির জন্য আপনার অ্যাপটিকে আরও ভালভাবে অপ্টিমাইজ করতে, আপনার targetSdkVersion "17" এ সেট করা উচিত, এটি একটি Android 4.2 সিস্টেম ছবিতে ইনস্টল করুন, এটি পরীক্ষা করুন, তারপর এই পরিবর্তনের সাথে একটি আপডেট প্রকাশ করুন৷
আপনি Android 4.2-এ APIs ব্যবহার করতে পারেন এবং আপনার কোডে শর্ত যোগ করে পুরানো সংস্করণগুলিকে সমর্থন করতে পারেন যা আপনার minSdkVersion দ্বারা সমর্থিত নয় এমন APIগুলি চালানোর আগে সিস্টেম API স্তরের জন্য পরীক্ষা করে। পশ্চাদগামী-সামঞ্জস্যতা বজায় রাখার বিষয়ে আরও জানতে, পশ্চাদপদ-সামঞ্জস্যপূর্ণ UI তৈরি করা পড়ুন।
API স্তরগুলি কীভাবে কাজ করে সে সম্পর্কে আরও তথ্য এপিআই স্তর কী?
গুরুত্বপূর্ণ আচরণ পরিবর্তন
আপনি যদি আগে অ্যান্ড্রয়েডের জন্য একটি অ্যাপ প্রকাশ করে থাকেন, তাহলে নিম্নলিখিত পরিবর্তনগুলি সম্পর্কে সচেতন হন যা আপনার অ্যাপের আচরণকে প্রভাবিত করতে পারে:
- বিষয়বস্তু প্রদানকারীরা আর ডিফল্টরূপে রপ্তানি হয় না। অর্থাৎ,
android:exportedঅ্যাট্রিবিউটের ডিফল্ট মান এখন“false"৷ যদি এটি গুরুত্বপূর্ণ হয় যে অন্যান্য অ্যাপগুলি আপনার সামগ্রী প্রদানকারীকে অ্যাক্সেস করতে সক্ষম হবে, তাহলে আপনাকে এখন স্পষ্টভাবেandroid:exported="true"সেট করতে হবে৷আপনি
android:targetSdkVersionবাandroid:minSdkVersion17 বা উচ্চতর সেট করলেই এই পরিবর্তন কার্যকর হবে৷ অন্যথায়, 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 নিরাপত্তার একটি অতিরিক্ত স্তর যোগ করে যাতে আপনি আরও নিরাপদে আপনার Android কোডে JavaScript আবদ্ধ করতে পারেন। আপনি যদি আপনারtargetSdkVersion17 বা তার বেশি সেট করেন, তাহলে আপনাকে এখন যে কোনো পদ্ধতিতে@JavascriptInterfaceটীকা যোগ করতে হবে যা আপনি আপনার JavaScript-এ উপলব্ধ করতে চান (পদ্ধতিটি অবশ্যই সর্বজনীন হতে হবে)। আপনি টীকা প্রদান না করলে, Android 4.2 বা উচ্চতর সংস্করণে চলাকালীন আপনারWebViewএর একটি ওয়েব পৃষ্ঠার মাধ্যমে পদ্ধতিটি অ্যাক্সেসযোগ্য নয়৷ আপনি যদিtargetSdkVersion16 বা তার নিচে সেট করেন, তাহলে টীকাটির প্রয়োজন নেই, তবে আমরা সুপারিশ করছি যে আপনি আপনার টার্গেট সংস্করণ আপডেট করুন এবং অতিরিক্ত নিরাপত্তার জন্য টীকা যোগ করুন।অ্যান্ড্রয়েড কোডে জাভাস্ক্রিপ্ট কোড বাঁধাই সম্পর্কে আরও পড়ুন।
দিবাস্বপ্ন
Daydream Android ডিভাইসের জন্য একটি নতুন ইন্টারেক্টিভ স্ক্রিনসেভার মোড। এটি স্বয়ংক্রিয়ভাবে সক্রিয় হয় যখন ডিভাইসটি একটি ডকে ঢোকানো হয় বা যখন একটি চার্জারে প্লাগ ইন করার সময় ডিভাইসটি নিষ্ক্রিয় অবস্থায় থাকে (স্ক্রিনটি বন্ধ করার পরিবর্তে)। দিবাস্বপ্ন একবারে একটি স্বপ্ন প্রদর্শন করে, যা একটি সম্পূর্ণরূপে দৃশ্যমান, প্যাসিভ ডিসপ্লে হতে পারে যা স্পর্শ করলে বাতিল হয়ে যায়, অথবা ইনপুট ইভেন্টের সম্পূর্ণ স্যুটের জন্য ইন্টারেক্টিভ এবং প্রতিক্রিয়াশীল হতে পারে। আপনার স্বপ্নগুলি আপনার অ্যাপের প্রক্রিয়ায় চলে এবং ভিউ, লেআউট এবং অ্যানিমেশন সহ Android UI টুলকিটে সম্পূর্ণ অ্যাক্সেস রয়েছে, তাই তারা লাইভ ওয়ালপেপার বা অ্যাপ উইজেটগুলির চেয়ে আরও নমনীয় এবং শক্তিশালী।
DreamService এর একটি সাবক্লাস বাস্তবায়ন করে আপনি Daydream-এর জন্য একটি স্বপ্ন তৈরি করতে পারেন। DreamService API গুলিকে Activity মতো করে ডিজাইন করা হয়েছে৷ আপনার স্বপ্নের জন্য UI নির্দিষ্ট করতে, একটি লেআউট রিসোর্স আইডি পাস করুন বা আপনার কাছে একটি উইন্ডো থাকার পরে যেকোনো সময়ে setContentView() তে View , যেমন 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 ডকুমেন্টেশন দেখুন।
সেকেন্ডারি ডিসপ্লে
অ্যান্ড্রয়েড এখন আপনার অ্যাপটিকে অতিরিক্ত স্ক্রিনে অনন্য সামগ্রী প্রদর্শন করার অনুমতি দেয় যা ব্যবহারকারীর ডিভাইসের সাথে একটি তারযুক্ত সংযোগ বা Wi-Fi এর মাধ্যমে সংযুক্ত থাকে৷ একটি মাধ্যমিক প্রদর্শনের জন্য অনন্য সামগ্রী তৈরি করতে, Presentation ক্লাস প্রসারিত করুন এবং 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() কল করুন।
তারপর আপনি আপনার Presentation ক্লাসের জন্য একটি কন্সট্রাক্টরের কাছে Display অবজেক্টটি পাস করে আপনার উপস্থাপনা প্রদর্শন করতে পারেন। আপনার উপস্থাপনা এখন সেকেন্ডারি ডিসপ্লেতে প্রদর্শিত হবে।
একটি নতুন ডিসপ্লে সংযুক্ত করা হলে রানটাইমে সনাক্ত করতে, MediaRouter.SimpleCallback এর একটি উদাহরণ তৈরি করুন যাতে আপনি onRoutePresentationDisplayChanged() কলব্যাক পদ্ধতিটি প্রয়োগ করেন, যা একটি নতুন উপস্থাপনা প্রদর্শন সংযুক্ত হলে সিস্টেম কল করবে। তারপর ROUTE_TYPE_LIVE_VIDEO রুট টাইপ সহ MediaRouter.addCallback() এ পাস করে MediaRouter.SimpleCallback নিবন্ধন করুন। আপনি যখন onRoutePresentationDisplayChanged() এ একটি কল পান, তখন উপরে উল্লিখিত হিসাবে কেবল MediaRouter.getSelectedRoute() কল করুন।
সেকেন্ডারি স্ক্রিনের জন্য আপনার Presentation UI আরও অপ্টিমাইজ করতে, আপনি আপনার অ্যাপ্লিকেশন বা কার্যকলাপে যে <style> প্রয়োগ করেছেন তাতে android:presentationTheme অ্যাট্রিবিউট উল্লেখ করে একটি ভিন্ন থিম প্রয়োগ করতে পারেন।
মনে রাখবেন যে ব্যবহারকারীর ডিভাইসের সাথে সংযুক্ত স্ক্রীনগুলির প্রায়শই একটি বড় স্ক্রীনের আকার থাকে এবং সম্ভবত একটি ভিন্ন স্ক্রীন ঘনত্ব থাকে৷ যেহেতু স্ক্রিনের বৈশিষ্ট্যগুলি ভিন্ন হতে পারে, তাই আপনার এমন সংস্থানগুলি সরবরাহ করা উচিত যা বিশেষভাবে এই জাতীয় বড় প্রদর্শনের জন্য অপ্টিমাইজ করা হয়েছে। আপনি যদি আপনার Presentation থেকে অতিরিক্ত সংস্থানগুলির জন্য অনুরোধ করতে চান, তাহলে প্রদর্শনের সাথে সম্পর্কিত Resources অবজেক্ট পেতে getContext() .getResources() এ কল করুন। এটি আপনার অ্যাপ থেকে উপযুক্ত সংস্থানগুলি সরবরাহ করে যা সেকেন্ডারি ডিসপ্লের স্ক্রীনের আকার এবং ঘনত্বের জন্য সবচেয়ে উপযুক্ত।
আরও তথ্য এবং কিছু কোড নমুনার জন্য, Presentation ক্লাস ডকুমেন্টেশন দেখুন।
লকস্ক্রিন উইজেট
অ্যান্ড্রয়েড এখন ব্যবহারকারীদের লক স্ক্রিনে অ্যাপ উইজেট যোগ করার অনুমতি দেয়। আপনার অ্যাপ উইজেটটিকে লক স্ক্রিনে ব্যবহারের জন্য উপলব্ধ করতে, আপনার 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 এর মতো একইভাবে কাজ করে, এতে এটি একটি লেআউট প্রদান করে যা আপনার অ্যাপ উইজেট আরম্ভ না হওয়া পর্যন্ত এবং লেআউট আপডেট করতে সক্ষম হওয়া পর্যন্ত অবিলম্বে উপস্থিত হতে পারে।
লক স্ক্রিনের জন্য অ্যাপ উইজেট তৈরি করার বিষয়ে আরও তথ্যের জন্য, লক স্ক্রিনে থাকাকালীন আপনার অ্যাপ উইজেটকে সঠিকভাবে আকার দেওয়া সহ, অ্যাপ উইজেট নির্দেশিকা দেখুন।
একাধিক ব্যবহারকারী
অ্যান্ড্রয়েড এখন ট্যাবলেটের মতো শেয়ারযোগ্য ডিভাইসে একাধিক ব্যবহারকারীর স্থানের অনুমতি দেয়। একটি ডিভাইসে প্রতিটি ব্যবহারকারীর নিজস্ব অ্যাকাউন্ট, অ্যাপস, সিস্টেম সেটিংস, ফাইল এবং অন্য কোনো ব্যবহারকারী-সম্পর্কিত ডেটা থাকে।
একজন অ্যাপ ডেভেলপার হিসেবে, আপনার অ্যাপকে একটি ডিভাইসে একাধিক ব্যবহারকারীর সাথে সঠিকভাবে কাজ করার জন্য আপনাকে আলাদা কিছু করতে হবে না। একটি ডিভাইসে কতজন ব্যবহারকারী থাকতে পারে তা নির্বিশেষে, আপনার অ্যাপ একটি প্রদত্ত ব্যবহারকারীর জন্য যে ডেটা সংরক্ষণ করে তা অন্য ব্যবহারকারীদের জন্য আপনার অ্যাপ সংরক্ষণ করে এমন ডেটা থেকে আলাদা রাখা হয়। সিস্টেমটি ট্র্যাক রাখে কোন ব্যবহারকারীর ডেটা ব্যবহারকারীর প্রক্রিয়ার অন্তর্গত যেখানে আপনার অ্যাপ চলছে এবং আপনার অ্যাপটিকে শুধুমাত্র সেই ব্যবহারকারীর ডেটাতে অ্যাক্সেস প্রদান করে এবং অন্য ব্যবহারকারীদের ডেটা অ্যাক্সেসের অনুমতি দেয় না।
বহু-ব্যবহারকারী পরিবেশে ডেটা সংরক্ষণ করা
যখনই আপনার অ্যাপ ব্যবহারকারীর পছন্দগুলি সংরক্ষণ করে, একটি ডাটাবেস তৈরি করে, বা ব্যবহারকারীর অভ্যন্তরীণ বা বাহ্যিক সঞ্চয়স্থানে একটি ফাইল লেখে, সেই ডেটা শুধুমাত্র সেই ব্যবহারকারী হিসাবে চালানোর সময় অ্যাক্সেসযোগ্য।
আপনার অ্যাপটি একটি বহু-ব্যবহারকারী পরিবেশে সঠিকভাবে আচরণ করছে তা নিশ্চিত করার জন্য, হার্ড-কোডেড পাথ ব্যবহার করে আপনার অভ্যন্তরীণ অ্যাপ ডিরেক্টরি বা বাহ্যিক স্টোরেজ অবস্থানের উল্লেখ করবেন না এবং পরিবর্তে সর্বদা উপযুক্ত API ব্যবহার করুন:
- অভ্যন্তরীণ স্টোরেজ অ্যাক্সেসের জন্য,
getFilesDir(),getCacheDir(), বাopenFileOutput()ব্যবহার করুন। - বাহ্যিক স্টোরেজ অ্যাক্সেসের জন্য,
getExternalFilesDir()বাgetExternalStoragePublicDirectory()ব্যবহার করুন।
প্রদত্ত ব্যবহারকারীর জন্য ডেটা সংরক্ষণ করতে আপনি এই APIগুলির মধ্যে কোনটি ব্যবহার করেন না কেন, একটি ভিন্ন ব্যবহারকারী হিসাবে চলাকালীন ডেটা অ্যাক্সেসযোগ্য হবে না। আপনার অ্যাপের দৃষ্টিকোণ থেকে, প্রতিটি ব্যবহারকারী একটি সম্পূর্ণ আলাদা ডিভাইসে চলছে।
বহু-ব্যবহারকারী পরিবেশে ব্যবহারকারীদের সনাক্তকরণ
যদি আপনার অ্যাপ অনন্য ব্যবহারকারীদের সনাক্ত করতে চায় যেমন বিশ্লেষণ সংগ্রহ করতে বা অন্যান্য অ্যাকাউন্ট অ্যাসোসিয়েশন তৈরি করতে, তাহলে আপনাকে অনন্য ইনস্টলেশন শনাক্ত করার জন্য প্রস্তাবিত অনুশীলনগুলি অনুসরণ করা উচিত। আপনার অ্যাপটি প্রথমবার শুরু হলে একটি নতুন 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 বা উচ্চতর।
RTL লেআউট সমর্থন
অ্যান্ড্রয়েড এখন বেশ কয়েকটি এপিআই অফার করে যা আপনাকে এমন ব্যবহারকারী ইন্টারফেস তৈরি করতে দেয় যা লেআউট অভিযোজনকে সুন্দরভাবে রূপান্তরিত করে ডান-থেকে-বাম (RTL) UI এবং পড়ার দিকনির্দেশ, যেমন আরবি এবং হিব্রু ব্যবহার করে।
আপনার অ্যাপে RTL লেআউট সমর্থন করা শুরু করতে, আপনার ম্যানিফেস্ট ফাইলের <application> উপাদানটিতে android:supportsRtl অ্যাট্রিবিউট সেট করুন এবং এটিকে “true" সেট করুন। একবার আপনি এটি সক্ষম করলে, সিস্টেমটি বিভিন্ন RTL API গুলিকে RTL এর সাথে আপনার অ্যাপ প্রদর্শন করতে সক্ষম করবে। উদাহরণস্বরূপ, অ্যাকশন বারটি ডানদিকে আইকন এবং শিরোনাম এবং বাম দিকে অ্যাকশন বোতামগুলি দেখাবে এবং ফ্রেমওয়ার্ক-প্রদত্ত View ক্লাসগুলির সাথে আপনি যে লেআউট তৈরি করেছেন তাও বিপরীত হবে৷
RTL লেআউটের সাথে প্রদর্শিত হলে আপনার অ্যাপের চেহারা আরও অপ্টিমাইজ করার প্রয়োজন হলে, অপ্টিমাইজেশনের দুটি মৌলিক স্তর রয়েছে:
- বাম- এবং ডান-ভিত্তিক লেআউট বৈশিষ্ট্যগুলিকে স্টার্ট-ওরিয়েন্টেড লেআউট বৈশিষ্ট্যগুলিতে রূপান্তর করুন।
উদাহরণস্বরূপ,
android:layout_marginStartএর জায়গায়android:layout_marginLeftlayout_marginStart এবংandroid:layout_marginEndandroid:layout_marginRightlayout_marginEnd ব্যবহার করুন।RelativeLayoutক্লাসটি বাম/ডান অবস্থান প্রতিস্থাপনের জন্য সংশ্লিষ্ট লেআউট বৈশিষ্ট্যগুলিও প্রদান করে, যেমনandroid:layout_alignParentStartপ্রতিস্থাপন করার জন্যandroid:layout_alignParentLeftএবংandroid:layout_toStartOfএর পরিবর্তেandroid:layout_toLeftOf। - অথবা RTL লেআউটের জন্য সম্পূর্ণ অপ্টিমাইজেশন প্রদান করতে, আপনি
ldrtlরিসোর্স কোয়ালিফায়ার ব্যবহার করে সম্পূর্ণ আলাদা লেআউট ফাইল প্রদান করতে পারেন (ldrtlমানে লেআউট-নির্দেশ-ডান-থেকে-বামে})। উদাহরণস্বরূপ, আপনি আপনার ডিফল্ট লেআউট ফাইলres/layout/এ সংরক্ষণ করতে পারেন এবং আপনার RTL অপ্টিমাইজ করা লেআউটres/layout-ldrtl/এ সংরক্ষণ করতে পারেন।ldrtlকোয়ালিফায়ারটি অঙ্কনযোগ্য সংস্থানগুলির জন্য দুর্দান্ত, যাতে আপনি গ্রাফিক্স সরবরাহ করতে পারেন যা পড়ার দিকনির্দেশের সাথে সামঞ্জস্যপূর্ণ।
RTL লেআউট সমর্থন করার জন্য ফ্রেমওয়ার্ক জুড়ে বিভিন্ন অন্যান্য API পাওয়া যায়, যেমন View ক্লাসে যাতে আপনি কাস্টম ভিউ এবং বর্তমান লেআউট দিক অনুসন্ধানের জন্য Configuration জন্য সঠিক আচরণ বাস্তবায়ন করতে পারেন।
দ্রষ্টব্য: আপনি যদি SQlite ব্যবহার করেন এবং আপনার টেবিল বা কলামের নাম থাকে যা "শুধুমাত্র সংখ্যা" হয়, সতর্ক থাকুন: String.format(String, Object...) ব্যবহার করে ভুল হতে পারে যেখানে সংখ্যাগুলি তাদের আরবি সমতুল্যে রূপান্তরিত হয়েছে যদি আপনার String.format("%d", int) আরবি লোকেলে সেট String.format(Locale,String,Object...) হয়েছে সংখ্যা বিন্যাসের জন্য String.valueOf(int) ।
নেস্টেড ফ্র্যাগমেন্টস
আপনি এখন টুকরো টুকরো টুকরো ভিতরে এম্বেড করতে পারেন। এটি বিভিন্ন পরিস্থিতিতে উপযোগী যেখানে আপনি গতিশীল এবং পুনরায় ব্যবহারযোগ্য UI উপাদানগুলিকে একটি UI উপাদানে রাখতে চান যা নিজেই গতিশীল এবং পুনরায় ব্যবহারযোগ্য। উদাহরণস্বরূপ, যদি আপনি ViewPager ব্যবহার করে এমন টুকরো তৈরি করেন যা বাম এবং ডানদিকে সোয়াইপ করে এবং স্ক্রীনের বেশিরভাগ জায়গা ব্যবহার করে, আপনি এখন প্রতিটি খণ্ড পৃষ্ঠায় টুকরা সন্নিবেশ করতে পারেন।
একটি ফ্র্যাগমেন্ট নেস্ট করতে, যে Fragment আপনি একটি ফ্র্যাগমেন্ট যোগ করতে চান সেখানে getChildFragmentManager() কে কল করুন। এটি একটি FragmentManager ফেরত দেয় যা আপনি ফ্র্যাগমেন্ট লেনদেন তৈরি করতে শীর্ষ-স্তরের কার্যকলাপ থেকে সাধারণত ব্যবহার করতে পারেন। উদাহরণস্বরূপ, এখানে কিছু কোড রয়েছে যা বিদ্যমান Fragment ক্লাসের মধ্যে থেকে একটি খণ্ড যুক্ত করে:
কোটলিন
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 1.6 এবং উচ্চতর সংস্করণে নেস্টেড ফ্র্যাগমেন্ট ডিজাইনগুলি প্রয়োগ করতে পারেন৷
দ্রষ্টব্য: আপনি একটি লেআউটকে একটি খণ্ডে স্ফীত করতে পারবেন না যখন সেই বিন্যাসে একটি <fragment> অন্তর্ভুক্ত থাকে। নেস্টেড টুকরা শুধুমাত্র তখনই সমর্থিত হয় যখন একটি খণ্ডে গতিশীলভাবে যোগ করা হয়।
রেন্ডারস্ক্রিপ্ট
রেন্ডারস্ক্রিপ্ট গণনার কার্যকারিতা নিম্নলিখিত বৈশিষ্ট্যগুলির সাথে উন্নত করা হয়েছে:
- স্ক্রিপ্ট অন্তর্নিহিত
আপনি রেন্ডারস্ক্রিপ্টের অন্তর্নির্মিত স্ক্রিপ্টের অন্তর্নিহিত ব্যবহার করতে পারেন যা আপনার জন্য সাধারণ ক্রিয়াকলাপগুলি প্রয়োগ করে যেমন:
-
Blends -
Blur -
Color matrix -
3x3 convolve -
5x5 convolve -
Per-channel lookup table -
Converting an Android YUV buffer to RGB
একটি স্ক্রিপ্ট অভ্যন্তরীণ ব্যবহার করতে, স্ক্রিপ্টের একটি দৃষ্টান্ত তৈরি করতে প্রতিটি ইনস্ট্রিনসিকের স্ট্যাটিক
create()পদ্ধতিতে কল করুন। তারপরে আপনি প্রয়োজনীয় ইনপুট এবং বিকল্প সেট করতে প্রতিটি স্ক্রিপ্টের অন্তর্নিহিত উপলব্ধset()পদ্ধতিগুলিকে কল করুন। অবশেষে, স্ক্রিপ্ট চালানোর জন্যforEach()পদ্ধতিতে কল করুন।-
- স্ক্রিপ্ট গ্রুপ
ScriptGroupআপনাকে সম্পর্কিত রেন্ডারস্ক্রিপ্ট স্ক্রিপ্টগুলিকে একত্রে চেইন করতে এবং একটি কলের মাধ্যমে সেগুলি চালানোর অনুমতি দেয়।addKernel()কল করে গ্রুপে সমস্ত স্ক্রিপ্ট যোগ করতে একটিScriptGroup.Builderব্যবহার করুন। একবার আপনি সমস্ত স্ক্রিপ্ট যোগ করলে,addConnection()কল করে স্ক্রিপ্টগুলির মধ্যে সংযোগ তৈরি করুন। আপনি সংযোগগুলি যোগ করা শেষ হলে, স্ক্রিপ্ট গ্রুপ তৈরি করতেcreate()কল করুন। স্ক্রিপ্ট গ্রুপ চালানোর আগে,setInput(Script.KernelID, Allocation)পদ্ধতির সাথে চালানোর জন্য ইনপুটAllocationএবং প্রাথমিক স্ক্রিপ্টটি নির্দিষ্ট করুন এবং আউটপুটAllocationপ্রদান করুন যেখানে ফলাফলটি লেখা হবে এবংsetOutput()দিয়ে চালানোর জন্য চূড়ান্ত স্ক্রিপ্ট। অবশেষে, স্ক্রিপ্ট গ্রুপ চালানোর জন্যexecute()কল করুন।- ফিল্টারস্ক্রিপ্ট
ফিল্টারস্ক্রিপ্ট বিদ্যমান রেন্ডারস্ক্রিপ্ট এপিআইগুলির সীমাবদ্ধতাগুলিকে সংজ্ঞায়িত করে যা ফলাফল কোডকে বিভিন্ন প্রসেসরে (CPUs, GPUs, এবং DSPs) চালানোর অনুমতি দেয়। ফিল্টারস্ক্রিপ্ট ফাইল তৈরি করতে,
.rsফাইলের পরিবর্তে.fsফাইল তৈরি করুন, এবং রেন্ডারস্ক্রিপ্ট রানটাইম বলার জন্য#pragma rs_fp_relaxedনির্দিষ্ট করুন আপনার স্ক্রিপ্টগুলির কঠোর IEEE 754-2008 ফ্লোটিং পয়েন্ট নির্ভুলতার প্রয়োজন নেই। এই নির্ভুলতা ডিনর্মের জন্য ফ্লাশ-থেকে-শূন্য এবং বৃত্তাকার-শূন্যের দিকে অনুমতি দেয়। উপরন্তু, আপনার ফিল্টারস্ক্রিপ্ট স্ক্রিপ্টগুলি অবশ্যই 32-বিট বিল্ট-ইন প্রকারগুলি ব্যবহার করবে না এবং__attribute__((kernel))অ্যাট্রিবিউট ব্যবহার করে একটি কাস্টম রুট ফাংশন নির্দিষ্ট করতে হবে কারণ ফিল্টারস্ক্রিপ্ট পয়েন্টার সমর্থন করে না, যাroot()ফাংশনের ডিফল্ট স্বাক্ষর। সংজ্ঞায়িত করে।
দ্রষ্টব্য: যদিও ফিল্টারস্ক্রিপ্ট সমর্থন প্ল্যাটফর্মে রয়েছে, বিকাশকারী সমর্থন SDK টুলস রিলিজ 21.0.1-এ উপলব্ধ হবে।
অ্যান্ড্রয়েড 4.2-এ সমস্ত API পরিবর্তনের বিশদ দর্শনের জন্য, API পার্থক্য রিপোর্ট দেখুন।