অ্যাপ্লিকেশন মৌলিক

অ্যান্ড্রয়েড অ্যাপগুলি কোটলিন, জাভা প্রোগ্রামিং ভাষা এবং C++ ভাষা ব্যবহার করে লেখা যেতে পারে। অ্যান্ড্রয়েড SDK টুলগুলি আপনার কোডকে কোনো ডেটা এবং রিসোর্স ফাইলের সাথে একটি APK বা একটি Android অ্যাপ বান্ডেলে কম্পাইল করে।

একটি Android প্যাকেজ , যা একটি .apk প্রত্যয় সহ একটি সংরক্ষণাগার ফাইল, রানটাইমে প্রয়োজনীয় একটি Android অ্যাপের বিষয়বস্তু ধারণ করে এবং এটি সেই ফাইল যা Android-চালিত ডিভাইসগুলি অ্যাপ ইনস্টল করতে ব্যবহার করে৷

একটি অ্যান্ড্রয়েড অ্যাপ বান্ডেল, যা একটি .aab প্রত্যয় সহ একটি সংরক্ষণাগার ফাইল, এতে একটি অ্যান্ড্রয়েড অ্যাপ প্রকল্পের বিষয়বস্তু রয়েছে, যার মধ্যে কিছু অতিরিক্ত মেটাডেটা রয়েছে যা রানটাইমে প্রয়োজন হয় না। একটি AAB একটি প্রকাশনা বিন্যাস এবং Android ডিভাইসে ইনস্টল করা যাবে না। এটি APK প্রজন্মকে পিছিয়ে দেয় এবং পরবর্তী পর্যায়ে সাইন ইন করে।

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

প্রতিটি অ্যান্ড্রয়েড অ্যাপ তার নিজস্ব নিরাপত্তা স্যান্ডবক্সে থাকে, নিম্নলিখিত Android নিরাপত্তা বৈশিষ্ট্য দ্বারা সুরক্ষিত:

  • অ্যান্ড্রয়েড অপারেটিং সিস্টেম হল একটি মাল্টি-ইউজার লিনাক্স সিস্টেম যেখানে প্রতিটি অ্যাপ আলাদা ব্যবহারকারী।
  • ডিফল্টরূপে, সিস্টেম প্রতিটি অ্যাপকে একটি অনন্য লিনাক্স ব্যবহারকারী আইডি বরাদ্দ করে, যা শুধুমাত্র সিস্টেম দ্বারা ব্যবহৃত হয় এবং অ্যাপের কাছে অজানা। সিস্টেমটি একটি অ্যাপের সমস্ত ফাইলের জন্য অনুমতি সেট করে যাতে শুধুমাত্র সেই অ্যাপের জন্য নির্ধারিত ব্যবহারকারী আইডি সেগুলি অ্যাক্সেস করতে পারে।
  • প্রতিটি প্রক্রিয়ার নিজস্ব ভার্চুয়াল মেশিন (VM), তাই একটি অ্যাপের কোড অন্যান্য অ্যাপ থেকে বিচ্ছিন্নভাবে চলে।
  • ডিফল্টরূপে, প্রতিটি অ্যাপ তার নিজস্ব লিনাক্স প্রক্রিয়ায় চলে। অ্যান্ড্রয়েড সিস্টেমটি প্রক্রিয়াটি শুরু করে যখন অ্যাপের যেকোন উপাদানকে কার্যকর করার প্রয়োজন হয় এবং তারপর প্রক্রিয়াটি বন্ধ করে দেয় যখন এটির আর প্রয়োজন হয় না বা যখন সিস্টেমটিকে অন্যান্য অ্যাপের জন্য মেমরি পুনরুদ্ধার করতে হবে।

অ্যান্ড্রয়েড সিস্টেম ন্যূনতম বিশেষাধিকারের নীতি প্রয়োগ করে। অর্থাৎ, প্রতিটি অ্যাপের, ডিফল্টরূপে, শুধুমাত্র সেই উপাদানগুলিতে অ্যাক্সেস থাকে যা এটির কাজ করার জন্য প্রয়োজন এবং এর বেশি নেই৷ এটি একটি খুব নিরাপদ পরিবেশ তৈরি করে যেখানে একটি অ্যাপ সিস্টেমের অংশগুলি অ্যাক্সেস করতে পারে না যার জন্য এটিকে অনুমতি দেওয়া হয়নি৷

যাইহোক, একটি অ্যাপের জন্য অন্যান্য অ্যাপের সাথে ডেটা শেয়ার করার এবং একটি অ্যাপের জন্য সিস্টেম পরিষেবাগুলি অ্যাক্সেস করার উপায় রয়েছে:

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

উদাহরণস্বরূপ, অ্যান্ড্রয়েড সিস্টেম একটি সামগ্রী প্রদানকারী প্রদান করে যা ব্যবহারকারীর যোগাযোগের তথ্য পরিচালনা করে। উপযুক্ত অনুমতি সহ যেকোনো অ্যাপ কোনো নির্দিষ্ট ব্যক্তির সম্পর্কে তথ্য পড়তে এবং লিখতে কন্টেন্ট প্রদানকারীকে জিজ্ঞাসা করতে পারে, যেমন ContactsContract.Data ব্যবহার করে।

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

সিস্টেমের কাছে, একটি বিষয়বস্তু প্রদানকারী হল একটি অ্যাপে একটি এন্ট্রি পয়েন্ট যার নাম ডেটা আইটেম প্রকাশ করার জন্য, যা একটি URI স্কিম দ্বারা চিহ্নিত করা হয়। এইভাবে, একটি অ্যাপ সিদ্ধান্ত নিতে পারে যে এটি কীভাবে এটিতে থাকা ডেটাটিকে একটি URI নেমস্পেসে ম্যাপ করতে চায়, সেই URIগুলিকে অন্য সত্তার কাছে হস্তান্তর করে যা তাদের ডেটা অ্যাক্সেস করতে ব্যবহার করতে পারে। কিছু বিশেষ জিনিস রয়েছে যা সিস্টেমটিকে একটি অ্যাপ পরিচালনা করতে দেয়:

  • একটি ইউআরআই বরাদ্দ করার জন্য অ্যাপটি চলমান থাকার প্রয়োজন হয় না, তাই ইউআরআইগুলি তাদের নিজস্ব অ্যাপ প্রস্থান করার পরেও টিকে থাকতে পারে। সিস্টেমটিকে শুধুমাত্র নিশ্চিত করতে হবে যে একটি মালিকানাধীন অ্যাপ এখনও চলছে যখন এটি সংশ্লিষ্ট URI থেকে অ্যাপের ডেটা পুনরুদ্ধার করে।
  • এই ইউআরআইগুলি একটি গুরুত্বপূর্ণ সূক্ষ্ম-শস্যযুক্ত সুরক্ষা মডেলও সরবরাহ করে। উদাহরণস্বরূপ, একটি অ্যাপ ক্লিপবোর্ডে থাকা একটি ছবির জন্য URI রাখতে পারে, কিন্তু তার সামগ্রী প্রদানকারীকে লক আপ করে রাখতে পারে যাতে অন্য অ্যাপগুলি অবাধে এটি অ্যাক্সেস করতে না পারে। যখন একটি দ্বিতীয় অ্যাপ ক্লিপবোর্ডে সেই URI অ্যাক্সেস করার চেষ্টা করে, তখন সিস্টেমটি সেই অ্যাপটিকে একটি অস্থায়ী URI অনুমতি মঞ্জুরি ব্যবহার করে ডেটা অ্যাক্সেস করতে দিতে পারে যাতে এটি শুধুমাত্র সেই URI-এর পিছনের ডেটা অ্যাক্সেস করতে পারে, এবং দ্বিতীয় অ্যাপে অন্য কিছুই না।

বিষয়বস্তু প্রদানকারী আপনার অ্যাপের ব্যক্তিগত এবং শেয়ার করা হয়নি এমন ডেটা পড়ার এবং লেখার জন্যও উপযোগী।

একটি বিষয়বস্তু প্রদানকারীকে ContentProvider এর একটি সাবক্লাস হিসেবে প্রয়োগ করা হয় এবং অবশ্যই একটি মানক সেট API-এর প্রয়োগ করতে হবে যা অন্যান্য অ্যাপকে লেনদেন করতে সক্ষম করে। আরও তথ্যের জন্য, বিষয়বস্তু প্রদানকারী বিকাশকারী নির্দেশিকা দেখুন।

অ্যান্ড্রয়েড সিস্টেম ডিজাইনের একটি অনন্য দিক হল যে কোনও অ্যাপ অন্য অ্যাপের উপাদান শুরু করতে পারে। উদাহরণস্বরূপ, আপনি যদি চান যে ব্যবহারকারী ডিভাইস ক্যামেরা দিয়ে একটি ফটো ক্যাপচার করুক, তাহলে সম্ভবত অন্য একটি অ্যাপ আছে যা এটি করে—এবং আপনার অ্যাপটি নিজে একটি ফটো ক্যাপচার করার জন্য একটি কার্যকলাপ বিকাশের পরিবর্তে এটি ব্যবহার করতে পারে। আপনাকে ক্যামেরা অ্যাপ থেকে কোডটি অন্তর্ভুক্ত করতে বা লিঙ্ক করতে হবে না। পরিবর্তে, আপনি ক্যামেরা অ্যাপে কার্যকলাপ শুরু করতে পারেন যা একটি ফটো ক্যাপচার করে। সম্পূর্ণ হয়ে গেলে, ফটোটি আপনার অ্যাপে ফেরত দেওয়া হয় যাতে আপনি এটি ব্যবহার করতে পারেন। ব্যবহারকারীর কাছে মনে হচ্ছে ক্যামেরা আসলে আপনার অ্যাপের একটি অংশ।

যখন সিস্টেমটি একটি উপাদান শুরু করে, এটি সেই অ্যাপটির জন্য প্রক্রিয়াটি শুরু করে, যদি এটি ইতিমধ্যেই চলমান না থাকে এবং উপাদানটির জন্য প্রয়োজনীয় ক্লাসগুলিকে তাৎক্ষণিক করে। উদাহরণ স্বরূপ, যদি আপনার অ্যাপটি ক্যামেরা অ্যাপে অ্যাক্টিভিটি শুরু করে যা একটি ফটো ক্যাপচার করে, তাহলে সেই অ্যাক্টিভিটি সেই প্রক্রিয়ায় চলে যা ক্যামেরা অ্যাপের অন্তর্গত, আপনার অ্যাপের প্রক্রিয়ায় নয়। অতএব, বেশিরভাগ অন্যান্য সিস্টেমের অ্যাপের বিপরীতে, অ্যান্ড্রয়েড অ্যাপগুলির একটি একক এন্ট্রি পয়েন্ট নেই: কোনও main() ফাংশন নেই।

যেহেতু সিস্টেমটি প্রতিটি অ্যাপকে একটি পৃথক প্রক্রিয়ায় ফাইলের অনুমতি দিয়ে চালায় যা অন্য অ্যাপগুলিতে অ্যাক্সেস সীমাবদ্ধ করে, আপনার অ্যাপ সরাসরি অন্য অ্যাপ থেকে একটি উপাদান সক্রিয় করতে পারে না। তবে অ্যান্ড্রয়েড সিস্টেম পারে। অন্য অ্যাপে একটি উপাদান সক্রিয় করতে, আপনি সিস্টেমে একটি বার্তা প্রদান করেন যা একটি নির্দিষ্ট উপাদান শুরু করার জন্য আপনার অভিপ্রায় নির্দিষ্ট করে। সিস্টেম তারপর আপনার জন্য উপাদান সক্রিয়.

উপাদান সক্রিয় করুন

একটি অসিঙ্ক্রোনাস বার্তা একটি অভিপ্রায় নামে পরিচিত চারটি উপাদান প্রকারের মধ্যে তিনটি সক্রিয় করে: কার্যকলাপ, পরিষেবা এবং সম্প্রচার রিসিভার৷ উদ্দেশ্য রানটাইমে একে অপরের সাথে পৃথক উপাদান আবদ্ধ। আপনি তাদের সেই বার্তাবাহক হিসাবে ভাবতে পারেন যারা অন্যান্য উপাদান থেকে একটি পদক্ষেপের অনুরোধ করে, উপাদানটি আপনার অ্যাপের বা অন্যের অন্তর্গত হোক না কেন।

একটি Intent বস্তুর সাথে একটি উদ্দেশ্য তৈরি করা হয়, যা একটি নির্দিষ্ট উপাদান (একটি স্পষ্ট অভিপ্রায়) বা একটি নির্দিষ্ট ধরনের উপাদান (একটি অন্তর্নিহিত অভিপ্রায়) সক্রিয় করার জন্য একটি বার্তাকে সংজ্ঞায়িত করে।

ক্রিয়াকলাপ এবং পরিষেবাগুলির জন্য, একটি অভিপ্রায় সঞ্চালনের ক্রিয়াকে সংজ্ঞায়িত করে, যেমন কিছু দেখা বা প্রেরণ করা , এবং কাজ করার জন্য ডেটার URI নির্দিষ্ট করতে পারে, অন্যান্য জিনিসগুলির মধ্যে যা কম্পোনেন্টটি শুরু করা হতে পারে তা জানতে হবে।

উদাহরণস্বরূপ, একটি উদ্দেশ্য একটি চিত্র দেখানোর জন্য বা একটি ওয়েব পৃষ্ঠা খোলার জন্য একটি কার্যকলাপের জন্য একটি অনুরোধ জানাতে পারে। কিছু ক্ষেত্রে, আপনি একটি ফলাফল পাওয়ার জন্য একটি কার্যকলাপ শুরু করতে পারেন, এই ক্ষেত্রে কার্যকলাপটি একটি Intent ফলাফল প্রদান করে। আপনি ব্যবহারকারীকে একটি ব্যক্তিগত পরিচিতি বাছাই করতে এবং এটি আপনার কাছে ফেরত দেওয়ার জন্য একটি অভিপ্রায় জারি করতে পারেন। ফেরতের অভিপ্রায়ে নির্বাচিত পরিচিতির দিকে নির্দেশ করে একটি URI অন্তর্ভুক্ত।

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

ক্রিয়াকলাপ, পরিষেবা এবং সম্প্রচার রিসিভারের বিপরীতে, বিষয়বস্তু প্রদানকারী সক্রিয় করা হয় যখন একটি ContentResolver অনুরোধ দ্বারা লক্ষ্য করা হয়। বিষয়বস্তু সমাধানকারী সামগ্রী প্রদানকারীর সাথে সমস্ত সরাসরি লেনদেন পরিচালনা করে এবং প্রদানকারীর সাথে লেনদেন সম্পাদনকারী উপাদানটি ContentResolver অবজেক্টে পদ্ধতিগুলি কল করে৷ এটি বিষয়বস্তু প্রদানকারী এবং তথ্য অনুরোধকারী উপাদানের মধ্যে নিরাপত্তার কারণে বিমূর্ততার একটি স্তর ছেড়ে দেয়।

প্রতিটি ধরনের উপাদান সক্রিয় করার জন্য পৃথক পদ্ধতি আছে:

  • আপনি একটি ক্রিয়াকলাপ শুরু করতে পারেন বা startActivity() এর Intent পাস করে এটিকে নতুন কিছু দিতে পারেন বা, যখন আপনি চান যে কার্যকলাপটি একটি ফলাফল ফিরিয়ে আনুক, startActivityForResult()
  • অ্যান্ড্রয়েড 5.0 (API লেভেল 21) এবং উচ্চতর, আপনি কর্মের সময় নির্ধারণ করতে JobScheduler ক্লাস ব্যবহার করতে পারেন। পূর্ববর্তী অ্যান্ড্রয়েড সংস্করণগুলির জন্য, আপনি একটি পরিষেবা শুরু করতে পারেন বা একটি চলমান পরিষেবাতে নতুন নির্দেশ দিতে পারেন একটি Intent টু startService() । আপনি bindService() এ একটি Intent পাস করে পরিষেবার সাথে আবদ্ধ হতে পারেন।
  • আপনি sendBroadcast() বা sendOrderedBroadcast() এর মত পদ্ধতিতে একটি Intent পাস করে একটি সম্প্রচার শুরু করতে পারেন।
  • আপনি একটি ContentResolverquery() কল করে একটি বিষয়বস্তু প্রদানকারীর কাছে একটি প্রশ্ন করতে পারেন।

ইন্টেন্ট ব্যবহার সম্পর্কে আরও তথ্যের জন্য, ইন্টেন্টস এবং ইনটেন্ট ফিল্টার ডকুমেন্ট দেখুন। নিম্নলিখিত নথিগুলি নির্দিষ্ট উপাদানগুলি সক্রিয় করার বিষয়ে আরও তথ্য প্রদান করে: ক্রিয়াকলাপগুলির পরিচিতি , পরিষেবাগুলির ওভারভিউ , BroadcastReceiver , এবং সামগ্রী প্রদানকারী

ম্যানিফেস্ট ফাইল

অ্যান্ড্রয়েড সিস্টেম একটি অ্যাপ কম্পোনেন্ট চালু করার আগে, সিস্টেমটিকে অবশ্যই জানতে হবে যে অ্যাপটির ম্যানিফেস্ট ফাইল , AndroidManifest.xml পড়ে কম্পোনেন্টটি বিদ্যমান। আপনার অ্যাপটি এই ফাইলে তার সমস্ত উপাদান ঘোষণা করে, যা অ্যাপ প্রকল্প ডিরেক্টরির মূলে রয়েছে।

ম্যানিফেস্ট অ্যাপের উপাদানগুলি ঘোষণা করার পাশাপাশি অনেকগুলি কাজ করে, যেমন নিম্নলিখিতগুলি:

  • অ্যাপটির জন্য প্রয়োজনীয় যেকোন ব্যবহারকারীর অনুমতিগুলি সনাক্ত করে, যেমন ইন্টারনেট অ্যাক্সেস বা ব্যবহারকারীর পরিচিতিতে পড়ার অ্যাক্সেস।
  • অ্যাপটি কোন API ব্যবহার করে তার উপর ভিত্তি করে অ্যাপের জন্য প্রয়োজনীয় ন্যূনতম API স্তর ঘোষণা করে।
  • অ্যাপের ব্যবহৃত বা প্রয়োজনীয় হার্ডওয়্যার এবং সফ্টওয়্যার বৈশিষ্ট্যগুলি ঘোষণা করে, যেমন ক্যামেরা, ব্লুটুথ পরিষেবা বা মাল্টিটাচ স্ক্রিন৷
  • এপিআই লাইব্রেরি ঘোষণা করে যে অ্যাপটিকে (অ্যান্ড্রয়েড ফ্রেমওয়ার্ক এপিআই ব্যতীত) সাথে লিঙ্ক করতে হবে, যেমন Google মানচিত্র লাইব্রেরি

উপাদান ঘোষণা

ম্যানিফেস্টের প্রাথমিক কাজ হল অ্যাপের উপাদান সম্পর্কে সিস্টেমকে অবহিত করা। উদাহরণস্বরূপ, একটি ম্যানিফেস্ট ফাইল নিম্নরূপ একটি কার্যকলাপ ঘোষণা করতে পারে:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:icon="@drawable/app_icon.png" ... >
        <activity android:name="com.example.project.ExampleActivity"
                  android:label="@string/example_label" ... >
        </activity>
        ...
    </application>
</manifest>

<application> এলিমেন্টে, android:icon অ্যাট্রিবিউট এমন একটি আইকনের রিসোর্সকে নির্দেশ করে যা অ্যাপটিকে শনাক্ত করে।

<activity> এলিমেন্টে, android:name অ্যাট্রিবিউট Activity সাবক্লাসের সম্পূর্ণ যোগ্য শ্রেণীর নাম নির্দিষ্ট করে এবং android:label অ্যাট্রিবিউটটি কার্যকলাপের জন্য ব্যবহারকারী-দৃশ্যমান লেবেল হিসেবে ব্যবহার করার জন্য একটি স্ট্রিং নির্দিষ্ট করে।

নিম্নলিখিত উপাদানগুলি ব্যবহার করে আপনাকে অবশ্যই সমস্ত অ্যাপ উপাদান ঘোষণা করতে হবে:

  • কার্যকলাপের জন্য <activity> উপাদান
  • পরিষেবার জন্য <service> উপাদান
  • সম্প্রচার রিসিভারের জন্য <receiver> উপাদান
  • বিষয়বস্তু প্রদানকারীদের জন্য <provider> উপাদান

ক্রিয়াকলাপ, পরিষেবা এবং বিষয়বস্তু প্রদানকারী যেগুলি আপনি আপনার উত্সে অন্তর্ভুক্ত করেন কিন্তু ম্যানিফেস্টে ঘোষণা করেন না সেগুলি সিস্টেমের কাছে দৃশ্যমান নয় এবং ফলস্বরূপ, কখনই চলতে পারে না৷ যাইহোক, ব্রডকাস্ট রিসিভারগুলিকে ম্যানিফেস্টে ঘোষণা করা যেতে পারে বা কোডে গতিশীলভাবে BroadcastReceiver অবজেক্ট হিসাবে তৈরি করা যেতে পারে এবং registerReceiver() কল করে সিস্টেমে নিবন্ধিত করা যেতে পারে।

আপনার অ্যাপের জন্য ম্যানিফেস্ট ফাইল কীভাবে গঠন করবেন সে সম্পর্কে আরও জানতে, অ্যাপ ম্যানিফেস্ট ওভারভিউ দেখুন।

উপাদান ক্ষমতা ঘোষণা

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

সতর্কতা: যদি আপনি একটি Service শুরু করার উদ্দেশ্যে ব্যবহার করেন, তাহলে নিশ্চিত করুন যে আপনার অ্যাপটি একটি সুস্পষ্ট অভিপ্রায় ব্যবহার করে সুরক্ষিত। একটি পরিষেবা শুরু করার জন্য একটি অন্তর্নিহিত অভিপ্রায় ব্যবহার করা একটি নিরাপত্তা বিপত্তি, কারণ আপনি নিশ্চিত হতে পারবেন না যে কোন পরিষেবাটি অভিপ্রায়ে সাড়া দেয় এবং ব্যবহারকারী দেখতে পারে না কোন পরিষেবাটি শুরু হয়৷ অ্যান্ড্রয়েড 5.0 (API স্তর 21) দিয়ে শুরু করে, আপনি যদি একটি অন্তর্নিহিত অভিপ্রায়ে bindService() কল করেন তবে সিস্টেমটি একটি ব্যতিক্রম ছুঁড়ে দেয়। আপনার পরিষেবার জন্য অভিপ্রায় ফিল্টার ঘোষণা করবেন না।

ডিভাইসের অন্যান্য অ্যাপের ম্যানিফেস্ট ফাইলে প্রদত্ত ইনটেন্ট ফিল্টারগুলির সাথে প্রাপ্ত অভিপ্রায়ের সাথে তুলনা করে সিস্টেমটি এমন উপাদানগুলিকে সনাক্ত করে যা একটি অভিপ্রায়ে প্রতিক্রিয়া জানাতে পারে৷

আপনি যখন আপনার অ্যাপের ম্যানিফেস্টে কোনো কার্যকলাপ ঘোষণা করেন, তখন আপনি ঐচ্ছিকভাবে উদ্দেশ্য ফিল্টার অন্তর্ভুক্ত করতে পারেন যা কার্যকলাপের ক্ষমতা ঘোষণা করে যাতে এটি অন্যান্য অ্যাপের অভিপ্রায়ে প্রতিক্রিয়া জানাতে পারে। আপনি একটি <intent-filter> উপাদান যোগ করে কম্পোনেন্টের ডিক্লেয়ারেশন এলিমেন্টের চাইল্ড হিসেবে এটি করেন।

উদাহরণস্বরূপ, যদি আপনি একটি নতুন ইমেল রচনা করার জন্য একটি কার্যকলাপ সহ একটি ইমেল অ্যাপ তৈরি করেন, তাহলে আপনি একটি নতুন ইমেল পাঠানোর উদ্দেশ্যে "পাঠান" এর প্রতিক্রিয়া জানাতে একটি অভিপ্রায় ফিল্টার ঘোষণা করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<manifest ... >
    ...
    <application ... >
        <activity android:name="com.example.project.ComposeEmailActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <data android:type="*/*" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

যদি অন্য একটি অ্যাপ ACTION_SEND অ্যাকশনের মাধ্যমে একটি অভিপ্রায় তৈরি করে এবং এটি startActivity() এ পাস করে, তাহলে সিস্টেমটি আপনার কার্যকলাপ শুরু করতে পারে যাতে ব্যবহারকারী খসড়া তৈরি করে একটি ইমেল পাঠাতে পারে।

অভিপ্রায় ফিল্টার তৈরি সম্পর্কে আরও জানতে, ইন্টেন্ট এবং ইনটেন্ট ফিল্টার ডকুমেন্ট দেখুন।

অ্যাপের প্রয়োজনীয়তা ঘোষণা করুন

অ্যান্ড্রয়েড দ্বারা চালিত বিভিন্ন ডিভাইস রয়েছে এবং সেগুলির সবগুলি একই বৈশিষ্ট্য এবং ক্ষমতা প্রদান করে না৷ আপনার অ্যাপের প্রয়োজনীয় বৈশিষ্ট্যগুলির অভাব রয়েছে এমন ডিভাইসগুলিতে আপনার অ্যাপ ইনস্টল হওয়া থেকে আটকাতে, আপনার ম্যানিফেস্ট ফাইলে ডিভাইস এবং সফ্টওয়্যার প্রয়োজনীয়তা ঘোষণা করে আপনার অ্যাপ যে ধরনের ডিভাইসগুলি সমর্থন করে তার জন্য আপনি স্পষ্টভাবে একটি প্রোফাইল সংজ্ঞায়িত করা গুরুত্বপূর্ণ।

এই ঘোষণার বেশিরভাগই তথ্যমূলক। সিস্টেম সেগুলি পড়ে না, কিন্তু Google Play-এর মতো বাহ্যিক পরিষেবাগুলি ব্যবহারকারীরা যখন তাদের ডিভাইস থেকে অ্যাপগুলি অনুসন্ধান করে তখন তাদের ফিল্টারিং প্রদান করতে সেগুলি পড়ে৷

উদাহরণ স্বরূপ, ধরুন আপনার অ্যাপের একটি ক্যামেরা প্রয়োজন এবং Android 8.0 (API লেভেল 26) এ প্রবর্তিত 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>

এই উদাহরণগুলিতে দেখানো ঘোষণাগুলির সাথে, যে ডিভাইসগুলিতে ক্যামেরা নেই বা 8.0 এর কম Android সংস্করণ রয়েছে সেগুলি Google Play থেকে আপনার অ্যাপ ইনস্টল করতে পারবে না৷ যাইহোক, আপনি এটিও ঘোষণা করতে পারেন যে আপনার অ্যাপটি ক্যামেরা ব্যবহার করে, তবে এটির প্রয়োজন নেই। এটি করার জন্য, আপনি required বৈশিষ্ট্যটি false সেট করুন, রানটাইমে ডিভাইসটিতে একটি ক্যামেরা আছে কিনা তা পরীক্ষা করুন এবং প্রয়োজন অনুসারে ক্যামেরা বৈশিষ্ট্যগুলি অক্ষম করুন৷

আপনি কীভাবে বিভিন্ন ডিভাইসের সাথে আপনার অ্যাপের সামঞ্জস্যতা পরিচালনা করতে পারেন সে সম্পর্কে আরও তথ্য ডিভাইস সামঞ্জস্যের ওভারভিউতে সরবরাহ করা হয়েছে।

অ্যাপ সম্পদ

একটি অ্যান্ড্রয়েড অ্যাপ শুধু কোডের থেকেও বেশি কিছু নিয়ে গঠিত। এটির জন্য সোর্স কোড থেকে আলাদা রিসোর্স প্রয়োজন, যেমন ছবি, অডিও ফাইল এবং অ্যাপের ভিজ্যুয়াল প্রেজেন্টেশন সম্পর্কিত যেকোনো কিছু। উদাহরণস্বরূপ, আপনি এক্সএমএল ফাইলগুলির সাথে অ্যানিমেশন, মেনু, শৈলী, রঙ এবং কার্যকলাপ ব্যবহারকারী ইন্টারফেসের বিন্যাস সংজ্ঞায়িত করতে পারেন।

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

আপনার অ্যান্ড্রয়েড প্রোজেক্টে অন্তর্ভুক্ত প্রতিটি সংস্থানের জন্য, SDK বিল্ড টুলগুলি একটি অনন্য পূর্ণসংখ্যা আইডি সংজ্ঞায়িত করে, যা আপনি আপনার অ্যাপ কোড থেকে বা XML-এ সংজ্ঞায়িত অন্যান্য সংস্থান থেকে সংস্থান উল্লেখ করতে ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি আপনার অ্যাপে logo.png নামে একটি ইমেজ ফাইল থাকে ( res/drawable/ ডিরেক্টরিতে সংরক্ষিত), SDK টুল R.drawable.logo নামে একটি রিসোর্স আইডি তৈরি করে। এই আইডিটি একটি অ্যাপ-নির্দিষ্ট পূর্ণসংখ্যাতে ম্যাপ করে, যা আপনি ছবিটিকে উল্লেখ করতে এবং এটি আপনার ব্যবহারকারী ইন্টারফেসে সন্নিবেশ করতে ব্যবহার করতে পারেন।

আপনার সোর্স কোড থেকে আলাদা রিসোর্স প্রদানের সবচেয়ে গুরুত্বপূর্ণ দিকগুলোর মধ্যে একটি হল বিভিন্ন ডিভাইস কনফিগারেশনের জন্য বিকল্প রিসোর্স প্রদান করার ক্ষমতা।

উদাহরণস্বরূপ, XML-এ UI স্ট্রিংগুলি সংজ্ঞায়িত করে, আপনি স্ট্রিংগুলিকে অন্য ভাষায় অনুবাদ করতে পারেন এবং সেই স্ট্রিংগুলিকে আলাদা ফাইলগুলিতে সংরক্ষণ করতে পারেন৷ তারপরে অ্যান্ড্রয়েড আপনার UI-তে উপযুক্ত ভাষা স্ট্রিং প্রয়োগ করে একটি ভাষার যোগ্যতার উপর ভিত্তি করে যা আপনি সংস্থান ডিরেক্টরির নামের সাথে যুক্ত করেন, যেমন res/values-fr/ ফ্রেঞ্চ স্ট্রিং মানগুলির জন্য এবং ব্যবহারকারীর ভাষা সেটিং।

Android আপনার বিকল্প সংস্থানগুলির জন্য অনেকগুলি যোগ্যতাকে সমর্থন করে৷ কোয়ালিফায়ার হল একটি সংক্ষিপ্ত স্ট্রিং যা আপনি আপনার রিসোর্স ডিরেক্টরির নামে অন্তর্ভুক্ত করেন যাতে ডিভাইস কনফিগারেশনের জন্য সেই রিসোর্সগুলি ব্যবহার করা হয়।

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

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

অতিরিক্ত সম্পদ

ভিডিও এবং কোড টিউটোরিয়াল ব্যবহার করে অ্যান্ড্রয়েড ডেভেলপমেন্ট শিখতে, Kotlin Udacity কোর্সের সাথে ডেভেলপিং অ্যান্ড্রয়েড অ্যাপস দেখুন।

সম্পর্কে পড়া চালিয়ে যান:

ইন্টেন্টস এবং ইনটেন্ট ফিল্টার
অ্যাপ্লিকেশানের উপাদানগুলি যেমন অ্যাক্টিভিটি এবং পরিষেবাগুলি সক্রিয় করতে Intent APIগুলি কীভাবে ব্যবহার করবেন এবং অন্যান্য অ্যাপগুলির দ্বারা ব্যবহারের জন্য আপনার অ্যাপের উপাদানগুলিকে কীভাবে উপলব্ধ করা যায় তা জানুন৷
কার্যক্রম পরিচিতি
কীভাবে Activity ক্লাসের একটি উদাহরণ তৈরি করতে হয় তা শিখুন, যা একটি ব্যবহারকারী ইন্টারফেসের সাথে আপনার অ্যাপ্লিকেশনে একটি স্বতন্ত্র স্ক্রিন প্রদান করে।
অ্যাপ রিসোর্স ওভারভিউ
আপনি কীভাবে নির্দিষ্ট ডিভাইস কনফিগারেশনের জন্য বিকল্প সংস্থান সরবরাহ করতে পারেন তা সহ, অ্যাপ্লিকেশান কোড থেকে অ্যাপ্লিকেশান সংস্থানগুলিকে আলাদা করার জন্য Android অ্যাপ্লিকেশানগুলিকে কীভাবে গঠন করা হয় তা জানুন।

এছাড়াও আগ্রহের বিষয়:

ডিভাইস সামঞ্জস্য ওভারভিউ
Android কীভাবে বিভিন্ন ধরনের ডিভাইসে কাজ করে এবং কীভাবে আপনি প্রতিটি ডিভাইসের জন্য আপনার অ্যাপটি অপ্টিমাইজ করতে পারেন বা বিভিন্ন ডিভাইসে আপনার অ্যাপের উপলব্ধতা সীমাবদ্ধ করতে পারেন তা জানুন।
অ্যান্ড্রয়েডে অনুমতি
Android কীভাবে একটি অনুমতি সিস্টেমের সাথে নির্দিষ্ট APIগুলিতে অ্যাপ অ্যাক্সেস সীমাবদ্ধ করে তা জানুন যাতে সেই APIগুলি ব্যবহার করার জন্য আপনার অ্যাপের ব্যবহারকারীর সম্মতি প্রয়োজন।