Kotlin, Java প্রোগ্রামিং ল্যাঙ্গুয়েজ ও C++ ল্যাঙ্গুয়েজ ব্যবহার করে Android অ্যাপ লেখা যেতে পারে। Android SDK টুল আপনার কোড এবং যেকোনও ডেটা ও রিসোর্স ফাইল কম্পাইল করে APK বা Android অ্যাপ বান্ডেল তৈরি করে।
Android প্যাকেজ হল .apk সাফিক্স সহ একটি আর্কাইভ ফাইল, যাতে রানটাইমে প্রয়োজনীয় Android অ্যাপের কন্টেন্ট থাকে এবং Android-চালিত ডিভাইসে অ্যাপ ইনস্টল করার জন্য এই ফাইল ব্যবহার করা হয়।
Android অ্যাপ বান্ডেল হল একটি আর্কাইভ ফাইল যার শেষে .aab থাকে। এতে Android অ্যাপ প্রোজেক্টের কন্টেন্ট থাকে,
যার মধ্যে কিছু অতিরিক্ত মেটাডেটা থাকে যা রানটাইমে প্রয়োজন হয় না। AAB হল একটি প্রকাশনার ফর্ম্যাট এবং এটি Android ডিভাইসে ইনস্টল করা যাবে না। এটি
APK তৈরি ও সাইন করার কাজ পরবর্তী কোনও সময়ের জন্য স্থগিত রাখে।
Google Play-এর মাধ্যমে আপনার অ্যাপ ডিস্ট্রিবিউট করার সময়, যেমন, Google Play-এর সার্ভার অপ্টিমাইজ করা APK তৈরি করে যাতে শুধু সেইসব রিসোর্স ও কোড থাকে যা অ্যাপ ইনস্টল করার অনুরোধ করা নির্দিষ্ট ডিভাইসের জন্য প্রয়োজন।
প্রতিটি Android অ্যাপ নিজস্ব নিরাপত্তা স্যান্ডবক্সে থাকে, যা নিম্নলিখিত Android নিরাপত্তা ফিচার দ্বারা সুরক্ষিত থাকে:
- Android অপারেটিং সিস্টেম হল একটি মাল্টি-ইউজার Linux সিস্টেম যেখানে প্রতিটি অ্যাপ হল আলাদা ব্যবহারকারী।
- ডিফল্ট হিসেবে, সিস্টেম প্রতিটি অ্যাপকে একটি অনন্য Linux ব্যবহারকারী আইডি অ্যাসাইন করে, যা শুধুমাত্র সিস্টেম ব্যবহার করে এবং অ্যাপের কাছে অজানা থাকে। সিস্টেম একটি অ্যাপের সব ফাইলের জন্য অনুমতি সেট করে যাতে শুধুমাত্র সেই অ্যাপে অ্যাসাইন করা ব্যবহারকারী আইডি সেগুলি অ্যাক্সেস করতে পারে।
- প্রতিটি প্রসেসের নিজস্ব ভার্চুয়াল মেশিন (VM) থাকে, তাই কোনও অ্যাপের কোড অন্যান্য অ্যাপ থেকে আলাদাভাবে রান করে।
- ডিফল্ট হিসেবে, প্রতিটি অ্যাপ নিজস্ব Linux প্রসেসে চলে। অ্যাপের কোনও কম্পোনেন্ট এক্সিকিউট করার প্রয়োজন হলে, Android সিস্টেম প্রসেস শুরু করে এবং যখন আর প্রয়োজন হয় না অথবা অন্য অ্যাপের জন্য সিস্টেমকে মেমরি রিকভার করতে হয়, তখন প্রসেস বন্ধ করে দেয়।
Android সিস্টেম ন্যূনতম প্রিভিলেজের নীতি প্রয়োগ করে। অর্থাৎ, প্রতিটি অ্যাপ, ডিফল্ট হিসেবে, শুধুমাত্র সেইসব কম্পোনেন্ট অ্যাক্সেস করতে পারে যেগুলি তার কাজ করার জন্য প্রয়োজন এবং তার বেশি কিছু নয়। এটি একটি অত্যন্ত সুরক্ষিত পরিবেশ তৈরি করে যেখানে কোনও অ্যাপ সিস্টেমের সেইসব অংশ অ্যাক্সেস করতে পারে না যেগুলির জন্য এটিকে অনুমতি দেওয়া হয়নি।
তবে, কোনও অ্যাপের পক্ষে অন্যান্য অ্যাপের সাথে ডেটা শেয়ার করার এবং কোনও অ্যাপের পক্ষে সিস্টেম পরিষেবা অ্যাক্সেস করার উপায় আছে:
- দুটি অ্যাপ যাতে একই Linux ব্যবহারকারীর আইডি শেয়ার করতে পারে তার ব্যবস্থা করা সম্ভব, এই ক্ষেত্রে তারা একে অপরের ফাইল অ্যাক্সেস করতে পারবে। সিস্টেম রিসোর্স সংরক্ষণ করতে, একই ব্যবহারকারীর আইডি সহ অ্যাপগুলিও একই Linux প্রসেসে চালানোর এবং একই VM শেয়ার করার ব্যবস্থা করতে পারে। এছাড়াও, অ্যাপগুলি একই সার্টিফিকেট দিয়ে সাইন করা থাকতে হবে।
- কোনও অ্যাপ ডিভাইসের লোকেশন, ক্যামেরা ও ব্লুটুথ কানেকশনের মতো ডিভাইস ডেটা অ্যাক্সেস করার অনুমতি চাইতে পারে। ব্যবহারকারীকে স্পষ্টভাবে এই অনুমতি দিতে হবে। অনুমতি সম্পর্কে আরও জানতে, Android-এ অনুমতি দেখুন।
এই ডকুমেন্টের বাকি অংশে নিম্নলিখিত ধারণাগুলি সম্পর্কে আলোচনা করা হয়েছে:
- আপনার অ্যাপকে সংজ্ঞায়িত করে এমন মূল ফ্রেমওয়ার্ক কম্পোনেন্ট।
- ম্যানিফেস্ট ফাইল যেখানে আপনি অ্যাপের জন্য প্রয়োজনীয় ডিভাইস ফিচার ও কম্পোনেন্ট ঘোষণা করেন।
- অ্যাপ কোড থেকে আলাদা রিসোর্স যা আপনার অ্যাপকে বিভিন্ন ডিভাইস কনফিগারেশনের জন্য তার আচরণকে সুন্দরভাবে অপ্টিমাইজ করতে দেয়।
অ্যাপ কম্পোনেন্ট
অ্যাপ কম্পোনেন্ট হল Android অ্যাপের প্রয়োজনীয় বিল্ডিং ব্লক। প্রতিটি কম্পোনেন্ট হল একটি এন্ট্রি পয়েন্ট যার মাধ্যমে সিস্টেম বা কোনও ব্যবহারকারী আপনার অ্যাপে প্রবেশ করতে পারেন। কিছু কম্পোনেন্ট অন্যদের উপর নির্ভর করে।
অ্যাপ কম্পোনেন্ট চার ধরনের হয়:
- অ্যাক্টিভিটি
- পরিষেবা
- সম্প্রচার রিসিভার
- কন্টেন্ট প্রোভাইডার
প্রতিটি প্রকার একটি স্বতন্ত্র উদ্দেশ্য পূরণ করে এবং একটি স্বতন্ত্র লাইফসাইকেল রয়েছে যা নির্ধারণ করে যে কীভাবে একটি কম্পোনেন্ট তৈরি এবং ধ্বংস হয়। নিম্নলিখিত বিভাগে চার ধরনের অ্যাপ কম্পোনেন্ট সম্পর্কে বর্ণনা করা হয়েছে।
- অ্যাক্টিভিটি
- ব্যবহারকারীর সাথে ইন্টার্যাক্ট করার এন্ট্রি পয়েন্ট হল অ্যাক্টিভিটি। এটি ইউজার ইন্টারফেস সহ একটি
স্ক্রিনকে দেখায়। যেমন,
একটি ইমেল অ্যাপে একটি অ্যাক্টিভিটি থাকতে পারে যা নতুন ইমেলের তালিকা দেখায়,
অন্য একটি অ্যাক্টিভিটি ইমেল কম্পোজ করার জন্য এবং অন্য একটি অ্যাক্টিভিটি ইমেল পড়ার জন্য। যদিও
ইমেল অ্যাপে ব্যবহারকারীর অভিজ্ঞতাকে আরও ভাল করে তুলতে অ্যাক্টিভিটিগুলি একসাথে কাজ করে, তবে প্রতিটি অ্যাক্টিভিটি
একে অপরের থেকে স্বাধীন।
ইমেল অ্যাপ অনুমতি দিলে অন্য কোনও অ্যাপ এইসব অ্যাক্টিভিটির যেকোনও একটি শুরু করতে পারে। যেমন, কোনও ক্যামেরা অ্যাপ, ব্যবহারকারীকে ছবি শেয়ার করার সুবিধা দিতে, নতুন ইমেল কম্পোজ করার জন্য ইমেল অ্যাপে অ্যাক্টিভিটি শুরু করতে পারে।
অ্যাক্টিভিটি সিস্টেম ও অ্যাপের মধ্যে নিম্নলিখিত গুরুত্বপূর্ণ ইন্টার্যাকশন সহজ করে তোলে:
- ব্যবহারকারী বর্তমানে কী নিয়ে চিন্তিত—স্ক্রিনে কী আছে—তার ট্র্যাক রাখা যাতে সিস্টেম সেই প্রসেসটি চালাতে থাকে যা অ্যাক্টিভিটি হোস্ট করছে।
- আগে ব্যবহার করা কোন প্রসেসে বন্ধ হয়ে যাওয়া অ্যাক্টিভিটি রয়েছে তা জানা, যাতে ব্যবহারকারী সেখানে ফিরে যেতে পারেন এবং সেইসব প্রসেসকে আরও বেশি অগ্রাধিকার দেওয়া যাতে সেগুলি উপলভ্য থাকে।
- অ্যাপের প্রসেস বন্ধ হয়ে গেলে তা ম্যানেজ করতে সাহায্য করা যাতে ব্যবহারকারী আগের অবস্থায় ফিরে গিয়ে অ্যাক্টিভিটি চালিয়ে যেতে পারেন।
- অ্যাপগুলিকে একে অপরের মধ্যে ব্যবহারকারীর ফ্লো বাস্তবায়নের একটি উপায় প্রদান করা এবং সিস্টেমের জন্য এই ফ্লো সমন্বয় করা। এর প্রাথমিক উদাহরণ হল শেয়ার করা।
আপনি
Activityক্লাসের সাবক্লাস হিসেবে একটি অ্যাক্টিভিটি প্রয়োগ করেন।Activityক্লাস সম্পর্কে আরও জানতে, অ্যাক্টিভিটির ভূমিকা দেখুন। - পরিষেবা
- পরিষেবা হল ব্যাকগ্রাউন্ডে অ্যাপ চালু রাখার জন্য সাধারণ-উদ্দেশ্য এন্ট্রি পয়েন্ট
সব ধরনের কারণে। এটি এমন একটি কম্পোনেন্ট যা ব্যাকগ্রাউন্ডে রান করে এবং দীর্ঘ সময় ধরে চলা অপারেশন
বা রিমোট প্রসেসের জন্য কাজ করে। কোনও পরিষেবা ইউজার ইন্টারফেস প্রদান করে না।
যেমন, ব্যবহারকারী অন্য কোনও অ্যাপে থাকাকালীন কোনও পরিষেবা ব্যাকগ্রাউন্ডে মিউজিক চালাতে পারে অথবা কোনও অ্যাক্টিভিটির সাথে ব্যবহারকারীর ইন্টার্যাকশন ব্লক না করেই নেটওয়ার্কের মাধ্যমে ডেটা আনতে পারে। অন্য কোনও কম্পোনেন্ট, যেমন কোনও অ্যাক্টিভিটি, পরিষেবাটি শুরু করতে পারে এবং এটিকে চলতে দিতে পারে বা এটির সাথে ইন্টার্যাক্ট করার জন্য এটির সাথে বাইন্ড করতে পারে।
দুই ধরনের পরিষেবা সিস্টেমকে বলে দেয় যে কীভাবে কোনও অ্যাপ ম্যানেজ করতে হবে: শুরু করা পরিষেবা এবং বাউন্ড পরিষেবা।
চালু করা পরিষেবা সিস্টেমকে বলে যে কাজ সম্পূর্ণ না হওয়া পর্যন্ত যেন সেগুলি চালু রাখা হয়। এটি ব্যাকগ্রাউন্ডে কিছু ডেটা সিঙ্ক করার জন্য বা ব্যবহারকারী অ্যাপ ছেড়ে চলে যাওয়ার পরেও মিউজিক চালানোর জন্য হতে পারে। ব্যাকগ্রাউন্ডে ডেটা সিঙ্ক করা বা মিউজিক চালানো বিভিন্ন ধরনের শুরু করা পরিষেবাকে উপস্থাপন করে, যা সিস্টেম আলাদাভাবে ম্যানেজ করে:
- মিউজিক প্লেব্যাক এমন একটি বিষয় যা ব্যবহারকারী সরাসরি বুঝতে পারেন এবং অ্যাপটি সিস্টেমকে জানায় যে এটি ফোরগ্রাউন্ডে থাকতে চায় এবং ব্যবহারকারীকে বিজ্ঞপ্তি দিয়ে জানায় যে এটি চলছে। এই ক্ষেত্রে, সিস্টেম সেই পরিষেবার প্রসেস চালু রাখার ব্যাপারে অগ্রাধিকার দেয়, কারণ এটি বন্ধ হয়ে গেলে ব্যবহারকারীর অভিজ্ঞতা খারাপ হয়।
- ব্যবহারকারী সাধারণত ব্যাকগ্রাউন্ড সার্ভিস সম্পর্কে সরাসরি সচেতন থাকেন না, তাই সিস্টেমের কাছে এর প্রসেস ম্যানেজ করার জন্য আরও বেশি স্বাধীনতা থাকে। এটি হয়ত বন্ধ হয়ে যাবে, কিছুক্ষণ পরে পরিষেবাটি রিস্টার্ট হবে, যদি ব্যবহারকারীর আরও জরুরি কাজের জন্য RAM-এর প্রয়োজন হয়।
বাউন্ড পরিষেবা রান করে কারণ অন্য কোনও অ্যাপ (বা সিস্টেম) জানিয়েছে যে এটি পরিষেবাটি ব্যবহার করতে চায়। একটি বাউন্ড পরিষেবা অন্য একটি প্রসেসে API প্রদান করে এবং সিস্টেম জানে যে এই প্রসেসগুলির মধ্যে একটি নির্ভরতা রয়েছে। তাই, প্রসেস A যদি প্রসেস B-এর কোনও পরিষেবার সাথে যুক্ত থাকে, তাহলে সিস্টেম বুঝতে পারে যে তাকে প্রসেস B এবং তার পরিষেবা প্রসেস A-এর জন্য চালু রাখতে হবে। এছাড়াও, প্রসেস A যদি এমন কিছু হয় যা ব্যবহারকারীর কাছে গুরুত্বপূর্ণ, তাহলে এটি জানে যে প্রসেস B-কেও এমন কিছু হিসেবে বিবেচনা করতে হবে যা ব্যবহারকারীর কাছে গুরুত্বপূর্ণ।
ফ্লেক্সিবিলিটির কারণে, পরিষেবাগুলি সব ধরনের উচ্চ-স্তরের সিস্টেম ধারণার জন্য উপযোগী বিল্ডিং ব্লক। লাইভ ওয়ালপেপার, বিজ্ঞপ্তি লিসেনার, স্ক্রিন সেভার, ইনপুট পদ্ধতি, অ্যাক্সেসিবিলিটি পরিষেবা এবং অন্যান্য অনেক মূল সিস্টেম ফিচার সবই পরিষেবা হিসেবে তৈরি করা হয় যা অ্যাপ্লিকেশনগুলি প্রয়োগ করে এবং সেগুলি চালানোর সময় সিস্টেমের সাথে যুক্ত হয়।
Service-এর সাবক্লাস হিসেবে একটি পরিষেবা প্রয়োগ করা হয়।Serviceক্লাস সম্পর্কে আরও তথ্যের জন্য, পরিষেবার ওভারভিউ দেখুন।মনে রাখবেন: আপনার অ্যাপ Android 5.0 (API লেভেল 21) বা তার পরবর্তী যেকোনও ভার্সনকে টার্গেট করলে, অ্যাকশন শিডিউল করতে
JobSchedulerক্লাস ব্যবহার করুন। JobScheduler-এর সুবিধা হল, এটি ব্যাটারি সাশ্রয় করে। এটি করার জন্য, এটি পাওয়ার খরচ কমানোর জন্য অপ্টিমালভাবে জব শিডিউল করে এবং Doze API-এর সাথে কাজ করে। এই ক্লাস ব্যবহার করার ব্যাপারে আরও তথ্যের জন্য,JobSchedulerরেফারেন্স ডকুমেন্টেশন দেখুন। - সম্প্রচার রিসিভার
- সম্প্রচার রিসিভার হল এমন একটি কম্পোনেন্ট যা সিস্টেমকে নিয়মিত ব্যবহারকারী ফ্লোয়ের বাইরে অ্যাপে ইভেন্ট ডেলিভার করতে দেয় যাতে অ্যাপ সিস্টেম-ব্যাপী সম্প্রচার ঘোষণায় উত্তর দিতে পারে। যেহেতু সম্প্রচার রিসিভার হল অ্যাপে আরেকটি সুনির্দিষ্ট এন্ট্রি, তাই সিস্টেম
এমনকি বর্তমানে চলছে না এমন অ্যাপেও সম্প্রচার ডেলিভার করতে পারে।
যেমন, কোনও অ্যাপ আসন্ন ইভেন্ট সম্পর্কে ব্যবহারকারীকে জানাতে বিজ্ঞপ্তি পোস্ট করার জন্য অ্যালার্ম শিডিউল করতে পারে। যেহেতু অ্যালার্মটি অ্যাপের
BroadcastReceiver-এ ডেলিভার করা হয়, তাই অ্যালার্ম বন্ধ না হওয়া পর্যন্ত অ্যাপটি চালু রাখার প্রয়োজন নেই।সিস্টেম থেকে অনেক ব্রডকাস্ট শুরু হয়, যেমন স্ক্রিন বন্ধ হয়ে যাওয়া, ব্যাটারিতে চার্জ কম থাকা বা ছবি ক্যাপচার করার মতো ব্রডকাস্ট। এছাড়াও, অ্যাপ ব্রডকাস্ট শুরু করতে পারে, যেমন অন্যান্য অ্যাপকে জানানো যে কিছু ডেটা ডিভাইসে ডাউনলোড করা হয়েছে এবং তাদের ব্যবহারের জন্য উপলভ্য আছে।
সম্প্রচার রিসিভার ইউজার ইন্টারফেস না দেখালেও, সম্প্রচার ইভেন্ট ঘটলে ব্যবহারকারীকে সতর্ক করতে এটি স্ট্যাটাস বার বিজ্ঞপ্তি তৈরি করতে পারে। তবে, সাধারণত ব্রডকাস্ট রিসিভার হল অন্যান্য কম্পোনেন্টের গেটওয়ে এবং এটি খুব কম কাজ করার জন্য তৈরি করা হয়েছে।
যেমন, কোনও সম্প্রচার রিসিভার
JobSchedulerব্যবহার করে কোনও ইভেন্টের উপর ভিত্তি করে কিছু কাজ করার জন্যJobServiceশিডিউল করতে পারে। সম্প্রচার রিসিভারের ক্ষেত্রে প্রায়ই অ্যাপ একে অপরের সাথে ইন্টার্যাক্ট করে, তাই এটি সেট-আপ করার সময় নিরাপত্তা সংক্রান্ত প্রভাব সম্পর্কে সচেতন থাকা গুরুত্বপূর্ণ।সম্প্রচার রিসিভার
BroadcastReceiver-এর সাবক্লাস হিসেবে প্রয়োগ করা হয় এবং প্রতিটি সম্প্রচারIntentঅবজেক্ট হিসেবে ডেলিভার করা হয়। আরও তথ্যের জন্য,BroadcastReceiverক্লাস দেখুন। - কন্টেন্ট প্রোভাইডার
- কন্টেন্ট প্রোভাইডার অ্যাপ ডেটার শেয়ার করা সেট ম্যানেজ করে যা আপনি ফাইল সিস্টেম, SQLite ডেটাবেস, ওয়েব বা অন্য কোনও স্থায়ী স্টোরেজ লোকেশনে সেভ করতে পারেন এবং আপনার অ্যাপ তা অ্যাক্সেস করতে পারে। কন্টেন্ট প্রোভাইডারের মাধ্যমে, অন্যান্য অ্যাপ ডেটা কোয়েরি বা পরিবর্তন করতে পারে, যদি কন্টেন্ট প্রোভাইডার এটির অনুমতি দেয়।
যেমন, Android সিস্টেম এমন একটি কন্টেন্ট প্রোভাইডার প্রদান করে যা ব্যবহারকারীর যোগাযোগের তথ্য ম্যানেজ করে। সঠিক অনুমতি সহ যেকোনও অ্যাপ কন্টেন্ট প্রোভাইডারকে কোয়েরি করতে পারে, যেমন
ContactsContract.Dataব্যবহার করে, কোনও নির্দিষ্ট ব্যক্তির সম্পর্কে তথ্য পড়া ও লেখা।কন্টেন্ট প্রোভাইডারকে ডেটাবেসের অ্যাবস্ট্রাকশন হিসেবে ভাবাটা স্বাভাবিক, কারণ এই সাধারণ কেসের জন্য এতে অনেক API ও সহায়তা বিল্ট-ইন থাকে। তবে, সিস্টেম-ডিজাইন দৃষ্টিকোণ থেকে তাদের একটি ভিন্ন মূল উদ্দেশ্য রয়েছে।
সিস্টেমের কাছে, কন্টেন্ট প্রোভাইডার হল একটি অ্যাপে এন্ট্রি পয়েন্ট যা URI স্কিম দ্বারা শনাক্ত করা নামযুক্ত ডেটা আইটেম প্রকাশ করে। তাই, কোনও অ্যাপ সিদ্ধান্ত নিতে পারে যে এটি কীভাবে URI নেমস্পেসে থাকা ডেটা ম্যাপ করতে চায়, সেই URI অন্যান্য এন্টিটিকে প্রদান করে যা পরিবর্তে ডেটা অ্যাক্সেস করতে ব্যবহার করা যেতে পারে। অ্যাপ ম্যানেজ করার সময় সিস্টেমকে এটি কয়েকটি নির্দিষ্ট কাজ করতে দেয়:
- URI অ্যাসাইন করার জন্য অ্যাপ চালু রাখার প্রয়োজন হয় না, তাই মালিকানা থাকা অ্যাপ বন্ধ হয়ে যাওয়ার পরেও URI থেকে যেতে পারে। সিস্টেমকে শুধু নিশ্চিত করতে হবে যে, সংশ্লিষ্ট URI থেকে অ্যাপের ডেটা ফিরিয়ে আনার সময় মালিকানা থাকা অ্যাপটি এখনও চলছে।
- এইসব URI একটি গুরুত্বপূর্ণ ফাইন-গ্রেনড নিরাপত্তা মডেলও প্রদান করে। যেমন, কোনও অ্যাপ ক্লিপবোর্ডে থাকা ছবির URI প্লেস করতে পারে, কিন্তু এর কন্টেন্ট প্রোভাইডার লক করে রাখে যাতে অন্যান্য অ্যাপ এটি ফ্রিতে অ্যাক্সেস করতে না পারে। দ্বিতীয় কোনও অ্যাপ ক্লিপবোর্ডে সেই URI অ্যাক্সেস করার চেষ্টা করলে, সিস্টেম সেই অ্যাপকে অস্থায়ী URI অনুমতি মঞ্জুর করার মাধ্যমে ডেটা অ্যাক্সেস করতে দিতে পারে যাতে এটি শুধুমাত্র সেই URI-এর পিছনে থাকা ডেটা অ্যাক্সেস করে এবং দ্বিতীয় অ্যাপে অন্য কিছু নয়।
আপনার অ্যাপের জন্য ব্যক্তিগত এবং শেয়ার করা হয় না এমন ডেটা পড়া ও লেখার জন্য কন্টেন্ট প্রোভাইডার উপযোগী।
একটি কন্টেন্ট প্রোভাইডার
ContentProvider-এর সাবক্লাস হিসেবে প্রয়োগ করা হয় এবং অবশ্যই API-এর একটি স্ট্যান্ডার্ড সেট প্রয়োগ করতে হবে যা অন্যান্য অ্যাপকে ট্রানজ্যাকশন করতে সক্ষম করে। আরও তথ্যের জন্য, কন্টেন্ট প্রোভাইডার ডেভেলপার নির্দেশিকা দেখুন।
Android সিস্টেম ডিজাইনের একটি অনন্য দিক হল যে কোনও অ্যাপ অন্য অ্যাপের কম্পোনেন্ট শুরু করতে পারে। যেমন, আপনি যদি চান যে ব্যবহারকারী ডিভাইসের ক্যামেরা দিয়ে ফটো তুলুক, তাহলে সম্ভবত অন্য কোনও অ্যাপ আছে যা এই কাজ করে—এবং আপনার অ্যাপ ফটো তোলার জন্য নিজে থেকে কোনও অ্যাক্টিভিটি ডেভেলপ করার পরিবর্তে এটি ব্যবহার করতে পারে। আপনাকে ক্যামেরা অ্যাপ থেকে কোড অন্তর্ভুক্ত বা লিঙ্ক করতে হবে না। পরিবর্তে, আপনি ক্যামেরা অ্যাপে অ্যাক্টিভিটি শুরু করতে পারেন যা একটি ফটো ক্যাপচার করে। সম্পূর্ণ হয়ে গেলে, ফটোটি আপনার অ্যাপে ফিরিয়ে দেওয়া হয় যাতে আপনি এটি ব্যবহার করতে পারেন। ব্যবহারকারীর কাছে, মনে হয় যেন ক্যামেরাটি আসলে আপনার অ্যাপের অংশ।
সিস্টেম কোনও কম্পোনেন্ট শুরু করলে, সেটি সেই অ্যাপের জন্য প্রসেস শুরু করে, যদি সেটি
আগে থেকে না চলে এবং কম্পোনেন্টের জন্য প্রয়োজনীয় ক্লাস ইনস্ট্যান্টিয়েট করে। যেমন, আপনার অ্যাপ যদি ক্যামেরা অ্যাপে অ্যাক্টিভিটি শুরু করে যা ফটো ক্যাপচার করে, তাহলে সেই অ্যাক্টিভিটি ক্যামেরা অ্যাপের প্রসেসে চলে, আপনার অ্যাপের প্রসেসে নয়।
তাই, অন্যান্য বেশিরভাগ সিস্টেমের অ্যাপের মতো, Android অ্যাপের কোনও একটি এন্ট্রি পয়েন্ট
থাকে না: কোনও main() ফাংশন থাকে না।
যেহেতু সিস্টেম প্রতিটি অ্যাপকে ফাইল অ্যাক্সেস করার পারমিশন সহ আলাদা প্রসেসে রান করে, যা অন্যান্য অ্যাপে অ্যাক্সেস সীমাবদ্ধ করে, তাই আপনার অ্যাপ সরাসরি অন্য অ্যাপ থেকে কোনও কম্পোনেন্ট অ্যাক্টিভেট করতে পারে না। তবে, Android সিস্টেম তা করতে পারে। অন্য অ্যাপে কোনও কম্পোনেন্ট অ্যাক্টিভেট করতে, আপনি সিস্টেমে একটি মেসেজ পাঠান যা নির্দিষ্ট কম্পোনেন্ট শুরু করার জন্য আপনার ইনটেন্ট নির্দিষ্ট করে। সিস্টেম তখন আপনার জন্য কম্পোনেন্টটি অ্যাক্টিভেট করে।
কম্পোনেন্ট অ্যাক্টিভেট করুন
ইনটেন্ট নামে পরিচিত একটি অ্যাসিঙ্ক্রোনাস মেসেজ চারটি কম্পোনেন্টের মধ্যে তিনটি কম্পোনেন্টকে অ্যাক্টিভেট করে: অ্যাক্টিভিটি, পরিষেবা এবং ব্রডকাস্ট রিসিভার। ইনটেন্ট রানটাইমে একে অপরের সাথে স্বতন্ত্র কম্পোনেন্টকে বাইন্ড করে। আপনি এগুলিকে মেসেঞ্জার হিসেবে ভাবতে পারেন যা অন্যান্য কম্পোনেন্ট থেকে অ্যাকশনের অনুরোধ করে, কম্পোনেন্টটি আপনার অ্যাপের বা অন্য কোনও অ্যাপের হতে পারে।
Intent অবজেক্টের মাধ্যমে ইনটেন্ট তৈরি করা হয়, যা কোনও নির্দিষ্ট কম্পোনেন্ট (এক্সপ্লিসিট ইনটেন্ট) অথবা নির্দিষ্ট ধরনের কম্পোনেন্ট (ইমপ্লিসিট ইনটেন্ট) অ্যাক্টিভেট করার জন্য মেসেজ নির্ধারণ করে।
অ্যাক্টিভিটি ও পরিষেবার জন্য, ইনটেন্ট কোনও অ্যাকশনকে সংজ্ঞায়িত করে, যেমন কিছু দেখা বা পাঠানো এবং যে ডেটার উপর অ্যাকশন নেওয়া হবে তার URI নির্দিষ্ট করতে পারে, অন্যান্য বিষয়ের মধ্যে যে কম্পোনেন্ট শুরু করা হচ্ছে তার জানার প্রয়োজন হতে পারে।
যেমন, কোনও ইনটেন্ট, ছবি দেখানোর জন্য বা ওয়েব পেজ খোলার জন্য
কোনও অ্যাক্টিভিটির অনুরোধ জানাতে পারে। কিছু ক্ষেত্রে, আপনি ফলাফল পেতে কোনও অ্যাক্টিভিটি শুরু করতে পারেন, যেক্ষেত্রে অ্যাক্টিভিটি Intent-এ ফলাফলও ফেরত দেয়। এছাড়াও, আপনি ব্যবহারকারীকে ব্যক্তিগত পরিচিতি বেছে নিতে এবং সেটি আপনাকে ফেরত দিতে
বলার জন্য একটি ইনটেন্ট ইস্যু করতে পারেন। রিটার্ন ইনটেন্টে একটি URI থাকে যা বেছে নেওয়া পরিচিতিকে পয়েন্ট করে।
সম্প্রচার রিসিভারের ক্ষেত্রে, ইনটেন্ট সম্প্রচার ঘোষণা নির্ধারণ করে। যেমন, ডিভাইসের ব্যাটারি কম আছে তা বোঝাতে ব্রডকাস্টে শুধুমাত্র একটি পরিচিত অ্যাকশন স্ট্রিং থাকে যা ব্যাটারি কম আছে তা বোঝায়।
অ্যাক্টিভিটি, পরিষেবা ও ব্রডকাস্ট রিসিভারের মতো নয়, কন্টেন্ট প্রোভাইডার
ContentResolver থেকে আসা অনুরোধের মাধ্যমে টার্গেট করা হলে অ্যাক্টিভেট হয়। কন্টেন্ট রিজলভার, কন্টেন্ট প্রোভাইডারের সাথে সব সরাসরি ট্রানজ্যাকশন ম্যানেজ করে এবং
প্রোভাইডারের সাথে ট্রানজ্যাকশন করা কম্পোনেন্ট,
ContentResolver অবজেক্টে মেথড কল করে। এটি কন্টেন্ট প্রোভাইডার এবং তথ্য অনুরোধকারী কম্পোনেন্টের মধ্যে নিরাপত্তার কারণে অ্যাবস্ট্রাকশনের একটি স্তর ছেড়ে দেয়।
প্রতিটি ধরনের কম্পোনেন্ট অ্যাক্টিভেট করার জন্য আলাদা পদ্ধতি আছে:
- আপনি কোনও অ্যাক্টিভিটি শুরু করতে পারেন অথবা এটিকে নতুন কিছু করার জন্য দিতে পারেন
IntentথেকেstartActivity()-এ পাস করে অথবা, আপনি যখন অ্যাক্টিভিটি থেকে কোনও ফলাফল পেতে চান,startActivityForResult()। - Android 5.0 (API লেভেল ২১) এবং তার পরবর্তী যেকোনও ভার্সনে, আপনি
অ্যাকশন শিডিউল করতে
JobSchedulerক্লাস ব্যবহার করতে পারবেন। Android-এর আগের ভার্সনের জন্য, আপনিstartService()-এIntentপাস করে কোনও পরিষেবা শুরু করতে অথবা চলমান কোনও পরিষেবাকে নতুন নির্দেশ দিতে পারবেন। আপনিbindService()-এIntentপাস করে পরিষেবার সাথে বাইন্ড করতে পারবেন। - আপনি
Intent-কেsendBroadcast()বাsendOrderedBroadcast()-এর মতো পদ্ধতিতে পাস করে ব্রডকাস্ট শুরু করতে পারেন। - আপনি
ContentResolver-এquery()কল করে কন্টেন্ট প্রোভাইডারকে কোয়েরি করতে পারেন।
ইনটেন্ট ব্যবহার করার ব্যাপারে আরও তথ্যের জন্য, ইনটেন্ট এবং
ইনটেন্ট ফিল্টার ডকুমেন্ট দেখুন।
নির্দিষ্ট কম্পোনেন্ট অ্যাক্টিভেট করার ব্যাপারে আরও তথ্য নিম্নলিখিত ডকুমেন্ট থেকে পাওয়া যাবে:
অ্যাক্টিভিটির ভূমিকা,
পরিষেবার ওভারভিউ,
BroadcastReceiver এবং
কন্টেন্ট প্রোভাইডার।
ম্যানিফেস্ট ফাইল
Android সিস্টেম কোনও অ্যাপ কম্পোনেন্ট শুরু করার আগে, সিস্টেমকে অবশ্যই জানতে হবে যে কম্পোনেন্টটি অ্যাপের ম্যানিফেস্ট ফাইল, AndroidManifest.xml পড়ে আছে।
আপনার অ্যাপ এই ফাইলে তার সমস্ত কম্পোনেন্ট ঘোষণা করে, যা অ্যাপ প্রজেক্ট ডিরেক্টরির রুটে থাকে।
ম্যানিফেস্ট অ্যাপের কম্পোনেন্ট ঘোষণা করার পাশাপাশি আরও অনেক কিছু করে, যেমন:
- অ্যাপের জন্য প্রয়োজনীয় ব্যবহারকারীর অনুমতি শনাক্ত করে, যেমন ইন্টারনেট অ্যাক্সেস বা ব্যবহারকারীর পরিচিতি পড়ার অ্যাক্সেস।
- অ্যাপটি কোন API ব্যবহার করে তার উপর ভিত্তি করে অ্যাপটির জন্য প্রয়োজনীয় ন্যূনতম API লেভেল ঘোষণা করে।
- অ্যাপের মাধ্যমে ব্যবহৃত বা প্রয়োজনীয় হার্ডওয়্যার ও সফ্টওয়্যার ফিচার ঘোষণা করে, যেমন ক্যামেরা, ব্লুটুথ পরিষেবা বা মাল্টিটাচ স্ক্রিন।
- অ্যাপের সাথে লিঙ্ক করতে হবে এমন API লাইব্রেরি ঘোষণা করে (Android ফ্রেমওয়ার্ক API ছাড়া), যেমন Google Maps লাইব্রেরি।
কম্পোনেন্ট ঘোষণা করুন
ম্যানিফেস্টের প্রাথমিক কাজ হল অ্যাপের কম্পোনেন্ট সম্পর্কে সিস্টেমকে জানানো। যেমন, ম্যানিফেস্ট ফাইল এইভাবে কোনও অ্যাক্টিভিটি ঘোষণা করতে পারে:
<?xml version="1.0" encodin>g<="utf-8&>quot;<? manifest ... application android:icon="@dr>awable/ap<p_icon.png" ... activity android:name="com.example.project.ExampleActivity" an>droid:lab<el=">@string/example_l<abel" .>.<. > /activity ... /application /manifest
<application>
এলিমেন্টে, android:icon অ্যাট্রিবিউটটি এমন একটি আইকনের রিসোর্সকে নির্দেশ করে যা
অ্যাপটিকে শনাক্ত করে।
<activity> এলিমেন্টে,
android:name অ্যাট্রিবিউট Activity সাবক্লাসের
সম্পূর্ণ কোয়ালিফায়েড ক্লাসের নাম নির্দিষ্ট করে এবং
android:label অ্যাট্রিবিউট অ্যাক্টিভিটির জন্য ব্যবহারকারী-দৃশ্যমান লেবেল হিসেবে ব্যবহার করার জন্য
একটি স্ট্রিং নির্দিষ্ট করে।
আপনাকে নিম্নলিখিত এলিমেন্ট ব্যবহার করে সব অ্যাপ কম্পোনেন্ট ঘোষণা করতে হবে:
<activity>টি এলিমেন্ট অ্যাক্টিভিটির জন্য- পরিষেবার জন্য
<service>টি এলিমেন্ট - ব্রডকাস্ট রিসিভারের জন্য
<receiver>টি এলিমেন্ট - কন্টেন্ট প্রোভাইডারের জন্য
<provider>টি এলিমেন্ট
আপনি সোর্সে অন্তর্ভুক্ত করেছেন কিন্তু ম্যানিফেস্টে ঘোষণা করেননি এমন অ্যাক্টিভিটি, পরিষেবা ও কন্টেন্ট প্রোভাইডার
সিস্টেম দেখতে পায় না এবং ফলস্বরূপ, কখনও রান করতে পারে না। তবে,
সম্প্রচার
রিসিভার ম্যানিফেস্টে ঘোষণা করা যেতে পারে অথবা কোডে ডাইনামিক্যালি
BroadcastReceiver
অবজেক্ট হিসেবে তৈরি করা যেতে পারে এবং
registerReceiver() কল করে সিস্টেমের সাথে রেজিস্টার করা যেতে পারে।
আপনার অ্যাপের জন্য ম্যানিফেস্ট ফাইল কীভাবে স্ট্রাকচার করবেন সেই সম্পর্কে আরও জানতে, অ্যাপ ম্যানিফেস্ট ওভারভিউ দেখুন।
কম্পোনেন্টের ক্ষমতা ঘোষণা করুন
কম্পোনেন্ট অ্যাক্টিভেট করুন বিভাগে যেমন আলোচনা করা হয়েছে, আপনি অ্যাক্টিভিটি, পরিষেবা ও ব্রডকাস্ট রিসিভার শুরু করতে
Intent ব্যবহার করতে পারেন।
আপনি এটি
ইনটেন্টে কম্পোনেন্ট ক্লাস নাম ব্যবহার করে, টার্গেট কম্পোনেন্টের নাম স্পষ্টভাবে উল্লেখ করে করেন।
এছাড়াও, আপনি ইমপ্লিসিট ইনটেন্ট ব্যবহার করতে পারেন, যা
কোন ধরনের অ্যাকশন পারফর্ম করতে হবে এবং ঐচ্ছিকভাবে, কোন ডেটার উপর
অ্যাকশন পারফর্ম করতে হবে তা বর্ণনা করে। ইমপ্লিসিট ইনটেন্ট সিস্টেমকে ডিভাইসে এমন একটি কম্পোনেন্ট খুঁজে পেতে দেয়
যা অ্যাকশনটি সম্পাদন করতে এবং
এটি শুরু করতে পারে। যদি একাধিক কম্পোনেন্ট থাকে যা ইনটেন্ট দ্বারা বর্ণিত অ্যাকশনটি সম্পাদন করতে পারে, ব্যবহারকারী কোনটি ব্যবহার করবেন তা বেছে নেন।
সতর্কতা: আপনি যদি
Service শুরু করার জন্য ইনটেন্ট ব্যবহার করেন, তাহলে আপনার অ্যাপটি সুরক্ষিত কিনা তা নিশ্চিত করুন। এর জন্য
এক্সপ্লিসিট
ইনটেন্ট ব্যবহার করুন। কোনও পরিষেবা শুরু করার জন্য ইমপ্লিসিট ইনটেন্ট ব্যবহার করা
নিরাপত্তার ক্ষেত্রে বিপজ্জনক, কারণ কোন পরিষেবা ইনটেন্টে সাড়া দেয় তা আপনি নিশ্চিত হতে পারবেন না
এবং কোন পরিষেবা শুরু হয় তা ব্যবহারকারী দেখতে পারবেন না। Android 5.0 (API লেভেল ২১) থেকে শুরু করে, আপনি ইমপ্লিসিট ইনটেন্ট সহ bindService()
কল করলে সিস্টেম
ব্যতিক্রম দেখায়। আপনার পরিষেবার জন্য ইনটেন্ট ফিল্টার ঘোষণা করবেন না।
সিস্টেমটি এমন কম্পোনেন্ট শনাক্ত করে যা ডিভাইসে অন্যান্য অ্যাপের ম্যানিফেস্ট ফাইলে প্রদত্ত ইনটেন্ট ফিল্টার-এর সাথে প্রাপ্ত ইনটেন্টের তুলনা করে ইনটেন্টের উত্তর দিতে পারে।
আপনার অ্যাপের ম্যানিফেস্টে কোনও অ্যাক্টিভিটি ঘোষণা করার সময়, আপনি ঐচ্ছিকভাবে ইনটেন্ট ফিল্টার অন্তর্ভুক্ত করতে পারেন যা অ্যাক্টিভিটির ক্ষমতা ঘোষণা করে যাতে এটি অন্যান্য অ্যাপ থেকে ইনটেন্টে সাড়া দিতে পারে। কম্পোনেন্টের ডিক্লারেশন এলিমেন্টের চাইল্ড হিসেবে
<intent-filter> এলিমেন্ট যোগ করে আপনি এটি করতে পারেন।
যেমন, আপনি যদি নতুন ইমেল কম্পোজ করার অ্যাক্টিভিটি সহ কোনও ইমেল অ্যাপ তৈরি করেন, তাহলে নতুন ইমেল পাঠানোর জন্য "পাঠান" ইনটেন্টের উত্তর দিতে আপনি একটি ইনটেন্ট ফিল্টার ঘোষণা করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
<manifest ... > ... < application .>.. < activity android:name="com.example.project.ComposeEmailActivity"&<gt; intent-filter&g<t; action android:name="android.intent.action.S<END" /> data androi<d:type="*/*" /> category android:name=&quo<t;android.intent.categor<y.DEFAULT"< /> > < /intent-filter> /activity> /application /manifest>
অন্য কোনও অ্যাপ ACTION_SEND অ্যাকশন সহ ইনটেন্ট তৈরি করে startActivity()-এ পাস করলে,
সিস্টেম আপনার অ্যাক্টিভিটি শুরু করতে পারে যাতে ব্যবহারকারী ইমেল ড্রাফ্ট করে পাঠাতে
পারেন।
ইনটেন্ট ফিল্টার তৈরি করার ব্যাপারে আরও জানতে, ইনটেন্ট ও ইনটেন্ট ফিল্টার ডকুমেন্ট দেখুন।
অ্যাপের প্রয়োজনীয়তা ঘোষণা করুন
Android দ্বারা পরিচালিত বিভিন্ন ধরনের ডিভাইস আছে এবং সেগুলির সবকটিতে একই ফিচার ও ক্ষমতা উপলভ্য নেই। আপনার অ্যাপের জন্য প্রয়োজনীয় ফিচার নেই এমন ডিভাইসে অ্যাপ ইনস্টল হওয়া আটকাতে, আপনার অ্যাপের জন্য উপযুক্ত ডিভাইসের প্রোফাইল স্পষ্টভাবে উল্লেখ করা প্রয়োজন। এর জন্য ম্যানিফেস্ট ফাইলে ডিভাইস ও সফ্টওয়্যার সংক্রান্ত প্রয়োজনীয়তা ঘোষণা করতে হবে।
এইসব ঘোষণার বেশিরভাগই শুধুমাত্র তথ্যমূলক। সিস্টেম এগুলি পড়ে না, তবে Google Play-এর মতো এক্সটার্নাল পরিষেবা এগুলি পড়ে যাতে ব্যবহারকারীরা তাদের ডিভাইস থেকে অ্যাপ সার্চ করার সময় ফিল্টারিং প্রদান করা যায়।
যেমন, ধরুন আপনার অ্যাপের জন্য ক্যামেরা প্রয়োজন এবং এটি Android 8.0 (API লেভেল ২৬)-এ চালু করা API ব্যবহার করে।
আপনাকে এইসব প্রয়োজনীয়তা ঘোষণা করতে হবে।
minSdkVersion ও targetSdkVersion-এর ভ্যালু আপনার অ্যাপ মডিউলের
build.gradle ফাইলে সেট করা হয়:
android { ... defaultConfig { ... minSdkVersion 26 targetSdkVersion 29 } }
মনে রাখবেন: ম্যানিফেস্ট ফাইলে সরাসরি minSdkVersion এবং
targetSdkVersion সেট করবেন না, কারণ
বিল্ড প্রসেসের সময় Gradle এগুলি ওভাররাইট করে দেয়। আরও তথ্যের জন্য,
API লেভেল সংক্রান্ত প্রয়োজনীয়তা নির্দিষ্ট করুন।
আপনার অ্যাপের ম্যানিফেস্ট ফাইলে ক্যামেরা ফিচার ঘোষণা করেন:
<manifest ... > < uses-feature android:name="android.hardware.camera.any" android:required="<;true" /> ... /manifest>
এইসব উদাহরণে দেখানো ঘোষণা অনুযায়ী, যেসব ডিভাইসে ক্যামেরা নেই অথবা
Android ভার্সন 8.0-এর নিচে,
সেগুলি Google Play থেকে আপনার অ্যাপ ইনস্টল করতে পারবে না।
তবে, আপনি এটিও ঘোষণা করতে পারেন যে আপনার অ্যাপ ক্যামেরা ব্যবহার করে, কিন্তু এটি
প্রয়োজন হয় না। এটি করতে, আপনি required অ্যাট্রিবিউটকে false-এ সেট করেন, রানটাইমে চেক করেন যে ডিভাইসে ক্যামেরা আছে কিনা এবং প্রয়োজন অনুযায়ী যেকোনও ক্যামেরা ফিচার বন্ধ করেন।
বিভিন্ন ডিভাইসের সাথে আপনার অ্যাপের কম্প্যাটিবিলিটি কীভাবে ম্যানেজ করবেন সেই সম্পর্কে আরও তথ্য ডিভাইস কম্প্যাটিবিলিটি ওভারভিউ-এ দেওয়া আছে।
অ্যাপ রিসোর্স
Android অ্যাপে শুধু কোডই থাকে না, আরও অনেক কিছু থাকে। এটির জন্য এমন রিসোর্স প্রয়োজন যা উৎস কোড থেকে আলাদা, যেমন ছবি, অডিও ফাইল এবং অ্যাপের ভিজ্যুয়াল প্রেজেন্টেশন সম্পর্কিত যেকোনও কিছু। উদাহরণস্বরূপ, আপনি XML ফাইলের মাধ্যমে অ্যানিমেশন, মেনু, স্টাইল, রঙ এবং অ্যাক্টিভিটি ইউজার ইন্টারফেসের লেআউট নির্ধারণ করতে পারেন।
অ্যাপ রিসোর্স ব্যবহার করলে কোড পরিবর্তন না করেই আপনার অ্যাপের বিভিন্ন বৈশিষ্ট্য আপডেট করা সহজ হয়। বিকল্প রিসোর্সের সেট প্রদান করলে, আপনি বিভিন্ন ডিভাইস কনফিগারেশনের জন্য আপনার অ্যাপ অপ্টিমাইজ করতে পারবেন, যেমন বিভিন্ন ভাষা এবং স্ক্রিনের সাইজ।
আপনার Android প্রোজেক্টে অন্তর্ভুক্ত করা প্রতিটি রিসোর্সের জন্য, SDK বিল্ড টুল একটি অনন্য
ইন্টিজার আইডি নির্ধারণ করে, যা আপনি নিজের অ্যাপ কোড বা XML-এ নির্ধারিত অন্যান্য রিসোর্স থেকে
রিসোর্স রেফারেন্স করতে ব্যবহার করতে পারেন। যেমন, আপনার অ্যাপে যদি logo.png (res/drawable/ ডিরেক্টরিতে সেভ করা) নামের কোনও ছবির ফাইল থাকে, তাহলে SDK টুল R.drawable.logo নামের একটি রিসোর্স আইডি তৈরি করে। এই আইডি অ্যাপ-নির্দিষ্ট পূর্ণসংখ্যায় ম্যাপ করে, যা
আপনি ছবির রেফারেন্স হিসেবে ব্যবহার করতে এবং আপনার ইউজার ইন্টারফেসে যোগ করতে পারবেন।
আপনার সোর্স কোড থেকে আলাদা রিসোর্স প্রদান করার অন্যতম গুরুত্বপূর্ণ দিক হল বিভিন্ন ডিভাইস কনফিগারেশনের জন্য বিকল্প রিসোর্স প্রদান করার ক্ষমতা।
যেমন, XML-এ UI স্ট্রিং সংজ্ঞায়িত করার মাধ্যমে, আপনি স্ট্রিংগুলি অন্য ভাষায় অনুবাদ করতে
এবং সেই স্ট্রিংগুলি আলাদা ফাইলে সেভ করতে পারবেন। তারপর, Android আপনার UI-তে উপযুক্ত ভাষা স্ট্রিং প্রয়োগ করে। এটি করা হয় ভাষা কোয়ালিফায়ার-এর উপর ভিত্তি করে, যা আপনি রিসোর্স ডিরেক্টরির নামের সাথে যোগ করেন, যেমন ফ্রেঞ্চ স্ট্রিং ভ্যালুর জন্য res/values-fr/ এবং ব্যবহারকারীর ভাষা সেটিংস।
Android আপনার বিকল্প রিসোর্সের জন্য অনেক কোয়ালিফায়ারকে সাপোর্ট করে। কোয়ালিফায়ার হল একটি ছোট স্ট্রিং যা আপনি নিজের রিসোর্স ডিরেক্টরির নামে অন্তর্ভুক্ত করেন যাতে সেইসব রিসোর্স যেসব ডিভাইস কনফিগারেশনের জন্য ব্যবহার করা হয় তা নির্ধারণ করা যায়।
যেমন, ডিভাইসের স্ক্রিন ওরিয়েন্টেশন ও সাইজের উপর নির্ভর করে আপনার অ্যাক্টিভিটির জন্য বিভিন্ন লেআউট তৈরি করতে পারবেন। ডিভাইসের স্ক্রিন পোর্ট্রেট (লম্বা) ওরিয়েন্টেশনে থাকলে, আপনি হয়ত বোতামগুলি উল্লম্বভাবে সাজানো আছে এমন লেআউট চাইবেন, কিন্তু স্ক্রিন ল্যান্ডস্কেপ (চওড়া) ওরিয়েন্টেশনে থাকলে, আপনি হয়ত বোতামগুলি অনুভূমিকভাবে সাজানো আছে এমন লেআউট চাইবেন। ওরিয়েন্টেশনের উপর নির্ভর করে লেআউট পরিবর্তন করতে, আপনি দুটি লেআউট নির্ধারণ করতে পারেন এবং প্রতিটি লেআউটের ডিরেক্টরি নামে উপযুক্ত কোয়ালিফায়ার প্রয়োগ করতে পারেন। তারপর, সিস্টেম অটোমেটিক ডিভাইসের বর্তমান ওরিয়েন্টেশন অনুযায়ী উপযুক্ত লেআউট প্রয়োগ করে।
আপনার অ্যাপ্লিকেশনে আপনি যেসব বিভিন্ন ধরনের রিসোর্স অন্তর্ভুক্ত করতে পারেন এবং বিভিন্ন ডিভাইস কনফিগারেশনের জন্য কীভাবে বিকল্প রিসোর্স তৈরি করবেন সেই সম্পর্কে আরও তথ্যের জন্য, অ্যাপ রিসোর্সের ওভারভিউ পড়ুন। পেশাদার পদ্ধতি এবং শক্তিশালী, প্রোডাকশন-কোয়ালিটি অ্যাপ ডিজাইন করার বিষয়ে আরও জানতে, অ্যাপ আর্কিটেকচার সংক্রান্ত নির্দেশিকা দেখুন।
অতিরিক্ত রিসোর্স
ভিডিও এবং কোড টিউটোরিয়াল ব্যবহার করে Android ডেভেলপমেন্ট সম্পর্কে জানতে, Kotlin-এর সাহায্যে Android অ্যাপ ডেভেলপ করা Udacity কোর্স দেখুন।
এই বিষয়ে পড়া চালিয়ে যান:
- ইনটেন্ট ও ইনটেন্ট ফিল্টার
- অ্যাক্টিভিটি ও পরিষেবার মতো অ্যাপ কম্পোনেন্ট অ্যাক্টিভেট করতে কীভাবে
IntentAPI ব্যবহার করতে হয় এবং অন্যান্য অ্যাপের ব্যবহারের জন্য কীভাবে আপনার অ্যাপ কম্পোনেন্ট উপলভ্য করতে হয় তা জানুন। - অ্যাক্টিভিটির ভূমিকা
- কীভাবে
Activityক্লাসের ইনস্ট্যান্স তৈরি করতে হয় তা জানুন, যা আপনার অ্যাপ্লিকেশনে ইউজার ইন্টারফেস সহ একটি স্বতন্ত্র স্ক্রিন প্রদান করে। - অ্যাপ রিসোর্স ওভারভিউ
- অ্যাপ কোড থেকে অ্যাপ রিসোর্স আলাদা করার জন্য Android অ্যাপ কীভাবে স্ট্রাকচার করা হয় তা জানুন, এর মধ্যে নির্দিষ্ট ডিভাইস কনফিগারেশনের জন্য আপনি কীভাবে বিকল্প রিসোর্স প্রদান করতে পারেন তাও অন্তর্ভুক্ত।
এছাড়াও, এগুলিও আপনার ভালো লাগতে পারে:
- ডিভাইস কম্প্যাটিবিলিটি ওভারভিউ
- বিভিন্ন ধরনের ডিভাইসে Android কীভাবে কাজ করে এবং আপনি কীভাবে প্রতিটি ডিভাইসের জন্য আপনার অ্যাপ অপ্টিমাইজ করতে পারেন বা বিভিন্ন ডিভাইসে আপনার অ্যাপের উপলভ্যতা সীমাবদ্ধ করতে পারেন তা জানুন।
- Android-এ অনুমতি
- Android কীভাবে অনুমতি সিস্টেমের মাধ্যমে নির্দিষ্ট API-তে অ্যাপের অ্যাক্সেস সীমাবদ্ধ করে তা জানুন। এই সিস্টেমের জন্য আপনার অ্যাপকে সেই API ব্যবহার করার জন্য ব্যবহারকারীর সম্মতি প্রয়োজন।