অভিপ্রায় এবং অভিপ্রায় ফিল্টার

একটি Intent হল একটি মেসেজিং অবজেক্ট যা আপনি অন্য অ্যাপ কম্পোনেন্ট থেকে অ্যাকশনের অনুরোধ করতে ব্যবহার করতে পারেন। যদিও উদ্দেশ্যগুলি বিভিন্ন উপায়ে উপাদানগুলির মধ্যে যোগাযোগের সুবিধা দেয়, তবে তিনটি মৌলিক ব্যবহারের ক্ষেত্রে রয়েছে:

  • একটি কার্যকলাপ শুরু

    একটি Activity একটি অ্যাপের একটি একক স্ক্রীনকে উপস্থাপন করে। আপনি startActivity() এ একটি Intent পাস করে একটি Activity একটি নতুন উদাহরণ শুরু করতে পারেন। Intent শুরু করার কার্যকলাপ বর্ণনা করে এবং প্রয়োজনীয় ডেটা বহন করে।

    আপনি যদি কার্যকলাপটি শেষ হয়ে গেলে ফলাফল পেতে চান তবে startActivityForResult() কল করুন। আপনার অ্যাক্টিভিটি আপনার অ্যাক্টিভিটির onActivityResult() কলব্যাকে একটি পৃথক Intent অবজেক্ট হিসেবে ফলাফলটি পায়। আরও তথ্যের জন্য, ক্রিয়াকলাপ নির্দেশিকা দেখুন।

  • একটি পরিষেবা শুরু করা হচ্ছে

    একটি Service এমন একটি উপাদান যা ব্যবহারকারীর ইন্টারফেস ছাড়াই পটভূমিতে ক্রিয়াকলাপ সম্পাদন করে। Android 5.0 (API লেভেল 21) এবং তার পরে, আপনি JobScheduler সাথে একটি পরিষেবা শুরু করতে পারেন। JobScheduler সম্পর্কে আরও তথ্যের জন্য, এর API-reference documentation দেখুন।

    Android 5.0 (API স্তর 21) এর আগের সংস্করণগুলির জন্য, আপনি Service ক্লাসের পদ্ধতিগুলি ব্যবহার করে একটি পরিষেবা শুরু করতে পারেন৷ আপনি startService() এর উদ্দেশ্যে একটি Intent পাস করে একটি এককালীন অপারেশন (যেমন একটি ফাইল ডাউনলোড করার জন্য) একটি পরিষেবা শুরু করতে পারেন৷ Intent পরিষেবাটি শুরু করার জন্য বর্ণনা করে এবং প্রয়োজনীয় ডেটা বহন করে।

    যদি পরিষেবাটি একটি ক্লায়েন্ট-সার্ভার ইন্টারফেস দিয়ে ডিজাইন করা হয়, তাহলে আপনি bindService() এ একটি Intent পাস করে অন্য উপাদান থেকে পরিষেবাতে আবদ্ধ হতে পারেন। আরও তথ্যের জন্য, পরিষেবা নির্দেশিকা দেখুন।

  • একটি সম্প্রচার প্রদান

    একটি সম্প্রচার হল একটি বার্তা যা যেকোনো অ্যাপ গ্রহণ করতে পারে। সিস্টেমটি সিস্টেম ইভেন্টগুলির জন্য বিভিন্ন সম্প্রচার সরবরাহ করে, যেমন যখন সিস্টেম বুট হয় বা ডিভাইস চার্জ করা শুরু হয়। আপনি sendBroadcast() বা sendOrderedBroadcast() এ একটি Intent পাস করে অন্য অ্যাপে একটি সম্প্রচার বিতরণ করতে পারেন।

এই পৃষ্ঠার বাকি অংশটি ব্যাখ্যা করে কিভাবে উদ্দেশ্যগুলি কাজ করে এবং কীভাবে সেগুলি ব্যবহার করতে হয়৷ সম্পর্কিত তথ্যের জন্য, অন্যান্য অ্যাপের সাথে ইন্টারঅ্যাক্ট করা এবং কন্টেন্ট শেয়ার করা দেখুন।

অভিপ্রায় প্রকার

দুই ধরনের উদ্দেশ্য আছে:

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

চিত্র 1 দেখায় কিভাবে একটি কার্যকলাপ শুরু করার সময় একটি উদ্দেশ্য ব্যবহার করা হয়। যখন Intent অবজেক্ট একটি নির্দিষ্ট কার্যকলাপের উপাদানকে স্পষ্টভাবে নাম দেয়, তখন সিস্টেম অবিলম্বে সেই উপাদানটি শুরু করে।

চিত্র 1. কিভাবে একটি অন্তর্নিহিত অভিপ্রায় সিস্টেমের মাধ্যমে অন্য একটি কার্যকলাপ শুরু করার জন্য বিতরণ করা হয়: [1] কার্যকলাপ A একটি ক্রিয়া বর্ণনা সহ একটি Intent তৈরি করে এবং এটি startActivity() এ পাস করে। [২] অ্যান্ড্রয়েড সিস্টেম অভিপ্রায়ের সাথে মেলে এমন একটি অভিপ্রায় ফিল্টারের জন্য সমস্ত অ্যাপ অনুসন্ধান করে। যখন একটি মিল পাওয়া যায়, [৩] সিস্টেমটি তার onCreate() পদ্ধতি চালু করে এবং এটিকে Intent পাস করে ম্যাচিং অ্যাক্টিভিটি ( অ্যাক্টিভিটি B ) শুরু করে।

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

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

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

একটি অভিপ্রায় নির্মাণ

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

একটি Intent থাকা প্রাথমিক তথ্য নিম্নরূপ:

উপাদানের নাম
শুরু করার জন্য উপাদানটির নাম।

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

দ্রষ্টব্য: একটি Service শুরু করার সময়, সর্বদা উপাদানটির নাম উল্লেখ করুন । অন্যথায়, কোন পরিষেবাটি অভিপ্রায়ে সাড়া দেবে তা আপনি নিশ্চিত হতে পারবেন না এবং ব্যবহারকারী দেখতে পারবেন না কোন পরিষেবাটি শুরু হয়৷

Intent এই ক্ষেত্রটি হল একটি ComponentName অবজেক্ট, যা আপনি অ্যাপের প্যাকেজের নাম সহ লক্ষ্য উপাদানের একটি সম্পূর্ণ যোগ্য শ্রেণীর নাম ব্যবহার করে নির্দিষ্ট করতে পারেন, উদাহরণস্বরূপ, com.example.ExampleActivity । আপনি কম্পোনেন্ট নাম সেট করতে পারেন setComponent() , setClass() , setClassName() , অথবা Intent কন্সট্রাক্টর দিয়ে।

অ্যাকশন
একটি স্ট্রিং যা সঞ্চালনের জন্য জেনেরিক অ্যাকশন নির্দিষ্ট করে (যেমন ভিউ বা পিক )।

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

আপনি আপনার অ্যাপের মধ্যে (অথবা আপনার অ্যাপের উপাদানগুলিকে ব্যবহার করার জন্য অন্যান্য অ্যাপের দ্বারা ব্যবহারের জন্য) উদ্দেশ্য দ্বারা ব্যবহারের জন্য আপনার নিজের ক্রিয়াগুলি নির্দিষ্ট করতে পারেন, তবে আপনি সাধারণত Intent শ্রেণী বা অন্যান্য ফ্রেমওয়ার্ক ক্লাস দ্বারা সংজ্ঞায়িত অ্যাকশন কনস্ট্যান্টগুলি নির্দিষ্ট করেন৷ একটি কার্যকলাপ শুরু করার জন্য এখানে কিছু সাধারণ ক্রিয়া রয়েছে:

ACTION_VIEW
startActivity() এর সাথে এই ক্রিয়াটি ব্যবহার করুন যখন আপনার কাছে কিছু তথ্য থাকে যা একটি কার্যকলাপ ব্যবহারকারীকে দেখাতে পারে, যেমন একটি গ্যালারি অ্যাপে দেখার জন্য একটি ফটো বা একটি মানচিত্র অ্যাপে দেখার ঠিকানা৷
ACTION_SEND
শেয়ার করার অভিপ্রায় হিসাবেও পরিচিত, আপনার এটি ব্যবহার করা উচিত startActivity() মাধ্যমে যখন আপনার কাছে কিছু ডেটা থাকে যা ব্যবহারকারী অন্য অ্যাপের মাধ্যমে শেয়ার করতে পারে, যেমন একটি ইমেল অ্যাপ বা সামাজিক শেয়ারিং অ্যাপ।

জেনেরিক অ্যাকশন সংজ্ঞায়িত করে এমন আরও ধ্রুবকের জন্য Intent ক্লাস রেফারেন্স দেখুন। অন্যান্য ক্রিয়াগুলি অ্যান্ড্রয়েড ফ্রেমওয়ার্কের অন্য কোথাও সংজ্ঞায়িত করা হয়েছে, যেমন ক্রিয়াগুলির জন্য Settings যা সিস্টেমের সেটিংস অ্যাপে নির্দিষ্ট স্ক্রিনগুলি খোলে৷

আপনি setAction() বা একটি Intent কনস্ট্রাক্টরের সাথে একটি অভিপ্রায়ের জন্য ক্রিয়াটি নির্দিষ্ট করতে পারেন।

আপনি যদি আপনার নিজের ক্রিয়াগুলিকে সংজ্ঞায়িত করেন তবে আপনার অ্যাপের প্যাকেজ নামটিকে একটি উপসর্গ হিসাবে অন্তর্ভুক্ত করতে ভুলবেন না, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

const val ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL"

জাভা

static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
ডেটা
URI (একটি Uri অবজেক্ট) যে ডেটার উপর কাজ করতে হবে এবং/অথবা সেই ডেটার MIME প্রকারের উল্লেখ করে। সরবরাহকৃত ডেটার ধরন সাধারণত অভিপ্রায়ের ক্রিয়া দ্বারা নির্ধারিত হয়। উদাহরণস্বরূপ, যদি ক্রিয়াটি ACTION_EDIT হয়, তাহলে ডেটাতে সম্পাদনা করার জন্য নথির URI থাকা উচিত৷

একটি অভিপ্রায় তৈরি করার সময়, এটির URI ছাড়াও ডেটার ধরন (এর MIME প্রকার) উল্লেখ করা প্রায়শই গুরুত্বপূর্ণ। উদাহরণস্বরূপ, একটি কার্যকলাপ যা চিত্রগুলি প্রদর্শন করতে সক্ষম হয় সম্ভবত একটি অডিও ফাইল চালাতে সক্ষম হবে না, যদিও URI বিন্যাসগুলি একই রকম হতে পারে। আপনার ডেটার MIME প্রকার উল্লেখ করা Android সিস্টেমকে আপনার অভিপ্রায় পাওয়ার জন্য সেরা উপাদান খুঁজে পেতে সহায়তা করে৷ যাইহোক, কখনও কখনও MIME প্রকার URI থেকে অনুমান করা যেতে পারে-বিশেষ করে যখন ডেটা একটি content: URI। একটি content: URI নির্দেশ করে যে ডেটা ডিভাইসে অবস্থিত এবং একটি ContentProvider দ্বারা নিয়ন্ত্রিত, যা ডেটা MIME প্রকারকে সিস্টেমে দৃশ্যমান করে।

শুধুমাত্র ডেটা URI সেট করতে, setData() কল করুন। শুধুমাত্র MIME প্রকার সেট করতে, setType() কল করুন। যদি প্রয়োজন হয়, আপনি setDataAndType() দিয়ে স্পষ্টভাবে উভয় সেট করতে পারেন।

সতর্কতা: আপনি যদি URI এবং MIME উভয় প্রকার সেট করতে চান, setData() এবং setType() কল করবেন না কারণ তারা একে অপরের মান বাতিল করে। URI এবং MIME উভয় প্রকার সেট করতে সর্বদা setDataAndType() ব্যবহার করুন।

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

বিভাগের সম্পূর্ণ তালিকার জন্য Intent ক্লাসের বিবরণ দেখুন।

আপনি addCategory() দিয়ে একটি বিভাগ নির্দিষ্ট করতে পারেন।

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

অতিরিক্ত
কী-মানের জোড়া যা অনুরোধ করা ক্রিয়া সম্পাদনের জন্য প্রয়োজনীয় অতিরিক্ত তথ্য বহন করে। ঠিক যেমন কিছু ক্রিয়া বিশেষ ধরণের ডেটা URI ব্যবহার করে, তেমনি কিছু ক্রিয়া বিশেষ অতিরিক্ত ব্যবহার করে।

আপনি বিভিন্ন putExtra() পদ্ধতির সাথে অতিরিক্ত ডেটা যোগ করতে পারেন, প্রতিটি দুটি প্যারামিটার গ্রহণ করে: কী নাম এবং মান। আপনি সমস্ত অতিরিক্ত ডেটা সহ একটি Bundle অবজেক্ট তৈরি করতে পারেন, তারপর putExtras() এর সাথে Intent Bundle সন্নিবেশ করুন।

উদাহরণস্বরূপ, ACTION_SEND দিয়ে একটি ইমেল পাঠানোর অভিপ্রায় তৈরি করার সময়, আপনি EXTRA_EMAIL কী দিয়ে প্রাপককে নির্দিষ্ট করতে পারেন এবং EXTRA_SUBJECT কী দিয়ে বিষয় নির্দিষ্ট করতে পারেন৷

Intent ক্লাস প্রমিত ডেটা প্রকারের জন্য অনেক EXTRA_* ধ্রুবক নির্দিষ্ট করে। আপনি যদি আপনার নিজের অতিরিক্ত কীগুলি ঘোষণা করতে চান (আপনার অ্যাপ যে উদ্দেশ্যগুলি গ্রহণ করে তার জন্য), আপনার অ্যাপের প্যাকেজের নামটি একটি উপসর্গ হিসাবে অন্তর্ভুক্ত করতে ভুলবেন না, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"

জাভা

static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";

সতর্কতা : আপনি অন্য অ্যাপের কাছ থেকে পাওয়ার আশা করছেন এমন উদ্দেশ্য পাঠানোর সময় Parcelable বা Serializable ডেটা ব্যবহার করবেন না। যদি একটি অ্যাপ একটি Bundle অবজেক্টে ডেটা অ্যাক্সেস করার চেষ্টা করে কিন্তু পার্সেল করা বা সিরিয়ালাইজড ক্লাসে অ্যাক্সেস না থাকে, তাহলে সিস্টেম একটি RuntimeException উত্থাপন করে।

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

আরও তথ্যের জন্য, setFlags() পদ্ধতি দেখুন।

উদাহরণ সুস্পষ্ট অভিপ্রায়

একটি সুস্পষ্ট অভিপ্রায় হল যেটি আপনি একটি নির্দিষ্ট অ্যাপ উপাদান চালু করতে ব্যবহার করেন, যেমন আপনার অ্যাপে একটি নির্দিষ্ট কার্যকলাপ বা পরিষেবা। একটি স্পষ্ট অভিপ্রায় তৈরি করতে, Intent বস্তুর জন্য উপাদানের নামটি সংজ্ঞায়িত করুন-অন্যান্য সমস্ত অভিপ্রায় বৈশিষ্ট্য ঐচ্ছিক।

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

কোটলিন

// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
val downloadIntent = Intent(this, DownloadService::class.java).apply {
    data = Uri.parse(fileUrl)
}
startService(downloadIntent)

জাভা

// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);

Intent(Context, Class) কনস্ট্রাক্টর অ্যাপের Context এবং একটি Class অবজেক্টের উপাদান সরবরাহ করে। যেমন, এই অভিপ্রায়টি স্পষ্টভাবে অ্যাপে DownloadService ক্লাস শুরু করে।

একটি পরিষেবা তৈরি এবং শুরু করার বিষয়ে আরও তথ্যের জন্য, পরিষেবা নির্দেশিকা দেখুন৷

উদাহরণ অন্তর্নিহিত অভিপ্রায়

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

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

কোটলিন

// Create the text message with a string.
val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, textMessage)
    type = "text/plain"
}

// Try to invoke the intent.
try {
    startActivity(sendIntent)
} catch (e: ActivityNotFoundException) {
    // Define what your app should do if no activity can handle the intent.
}

জাভা

// Create the text message with a string.
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");

// Try to invoke the intent.
try {
    startActivity(sendIntent);
} catch (ActivityNotFoundException e) {
    // Define what your app should do if no activity can handle the intent.
}

যখন startActivity() কল করা হয়, তখন সিস্টেমটি ইনস্টল করা সমস্ত অ্যাপ পরীক্ষা করে তা নির্ধারণ করে যে কোনটি এই ধরনের অভিপ্রায় পরিচালনা করতে পারে ( ACTION_SEND অ্যাকশন সহ একটি অভিপ্রায় এবং এটি "টেক্সট/প্লেইন" ডেটা বহন করে)। যদি শুধুমাত্র একটি অ্যাপ থাকে যা এটি পরিচালনা করতে পারে, সেই অ্যাপটি অবিলম্বে খোলে এবং অভিপ্রায় দেওয়া হয়। যদি অন্য কোনও অ্যাপ এটি পরিচালনা করতে না পারে, তাহলে আপনার অ্যাপটি ঘটে যাওয়া ActivityNotFoundException ধরতে পারে। যদি একাধিক ক্রিয়াকলাপ অভিপ্রায় স্বীকার করে, সিস্টেমটি একটি ডায়ালগ প্রদর্শন করে যেমন চিত্র 2 এ দেখানো হয়েছে, যাতে ব্যবহারকারী কোন অ্যাপটি ব্যবহার করবেন তা চয়ন করতে পারেন।

অন্যান্য অ্যাপ চালু করার বিষয়ে আরও তথ্য ব্যবহারকারীকে অন্য অ্যাপে পাঠানোর গাইডে দেওয়া আছে।

চিত্র 2. একটি চয়নকারী ডায়ালগ।

একজন অ্যাপ চয়নকারীকে জোর করে

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

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

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

কোটলিন

val sendIntent = Intent(Intent.ACTION_SEND)
...

// Always use string resources for UI text.
// This says something like "Share this photo with"
val title: String = resources.getString(R.string.chooser_title)
// Create intent to show the chooser dialog
val chooser: Intent = Intent.createChooser(sendIntent, title)

// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(packageManager) != null) {
    startActivity(chooser)
}

জাভা

Intent sendIntent = new Intent(Intent.ACTION_SEND);
...

// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show the chooser dialog
Intent chooser = Intent.createChooser(sendIntent, title);

// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

অনিরাপদ অভিপ্রায় লঞ্চ সনাক্ত করুন

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

যদি আপনার অ্যাপ নিম্নলিখিত দুটি ক্রিয়া সম্পাদন করে, তবে সিস্টেমটি একটি অনিরাপদ অভিপ্রায় লঞ্চ শনাক্ত করে এবং একটি কঠোর মোড লঙ্ঘন ঘটে:

  1. আপনার অ্যাপটি ডেলিভার করা অভিপ্রায়ের অতিরিক্ত থেকে একটি নেস্টেড অভিপ্রায়কে আনপার্সেল করে।
  2. আপনার অ্যাপ অবিলম্বে সেই নেস্টেড অভিপ্রায় ব্যবহার করে একটি অ্যাপ কম্পোনেন্ট শুরু করে, যেমন startActivity() , startService() , বা bindService() এ অভিপ্রায় পাস করা।

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

অনিরাপদ অভিপ্রায় লঞ্চের জন্য পরীক্ষা করুন

আপনার অ্যাপে অনিরাপদ অভিপ্রায় লঞ্চ হয়েছে কিনা তা পরীক্ষা করতে, নিম্নলিখিত কোড স্নিপেটে দেখানো হিসাবে আপনি আপনার VmPolicy কনফিগার করার সময় detectUnsafeIntentLaunch() এ কল করুন। যদি আপনার অ্যাপ একটি StrictMode লঙ্ঘন শনাক্ত করে, তাহলে আপনি সম্ভাব্য সংবেদনশীল তথ্য সুরক্ষিত রাখতে অ্যাপ এক্সিকিউশন বন্ধ করতে চাইতে পারেন।

কোটলিন

fun onCreate() {
    StrictMode.setVmPolicy(VmPolicy.Builder()
        // Other StrictMode checks that you've previously added.
        // ...
        .detectUnsafeIntentLaunch()
        .penaltyLog()
        // Consider also adding penaltyDeath()
        .build())
}

জাভা

protected void onCreate() {
    StrictMode.setVmPolicy(new VmPolicy.Builder()
        // Other StrictMode checks that you've previously added.
        // ...
        .detectUnsafeIntentLaunch()
        .penaltyLog()
        // Consider also adding penaltyDeath()
        .build());
}

উদ্দেশ্যগুলি আরও দায়িত্বের সাথে ব্যবহার করুন

একটি অনিরাপদ অভিপ্রায় লঞ্চ এবং একটি কঠোর মোড লঙ্ঘনের সম্ভাবনা কমাতে, এই সেরা অনুশীলনগুলি অনুসরণ করুন৷

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

আপনার অ্যাপের উপাদান অপ্রয়োজনীয়ভাবে রপ্তানি করবেন না। উদাহরণস্বরূপ, যদি আপনি একটি অভ্যন্তরীণ নেস্টেড অভিপ্রায় ব্যবহার করে একটি অ্যাপ কম্পোনেন্ট চালু করতে চান, তাহলে সেই উপাদানটির android:exported অ্যাট্রিবিউটটিকে false এ সেট করুন।

নেস্টেড অভিপ্রায়ের পরিবর্তে একটি PendingIntent ব্যবহার করুন। এইভাবে, যখন অন্য একটি অ্যাপ তার অন্তর্ভুক্ত Intent এর PendingIntent আনপার্সেল করে, তখন অন্য অ্যাপটি আপনার অ্যাপের পরিচয় ব্যবহার করে PendingIntent চালু করতে পারে। এই কনফিগারেশনটি অন্য অ্যাপটিকে আপনার অ্যাপে একটি অ-রপ্তানি করা কম্পোনেন্ট সহ যেকোনো কম্পোনেন্ট নিরাপদে চালু করতে দেয়।

চিত্র 2-এর চিত্রটি দেখায় যে কীভাবে সিস্টেমটি আপনার (ক্লায়েন্ট) অ্যাপ থেকে অন্য (পরিষেবা) অ্যাপে নিয়ন্ত্রণ পাস করে এবং আপনার অ্যাপে ফিরে আসে:

  1. আপনার অ্যাপটি এমন একটি অভিপ্রায় তৈরি করে যা অন্য অ্যাপে একটি ক্রিয়াকলাপ আহ্বান করে। সেই অভিপ্রায়ের মধ্যে, আপনি অতিরিক্ত হিসাবে একটি PendingIntent অবজেক্ট যোগ করুন। এই অমীমাংসিত অভিপ্রায় আপনার অ্যাপে একটি উপাদান আহ্বান করে; এই উপাদান রপ্তানি করা হয় না.
  2. আপনার অ্যাপের অভিপ্রায় প্রাপ্তির পরে, অন্য অ্যাপটি নেস্ট করা PendingIntent অবজেক্টটি বের করে।
  3. অন্য অ্যাপটি PendingIntent অবজেক্টে send() পদ্ধতি ব্যবহার করে।
  4. আপনার অ্যাপে নিয়ন্ত্রণ ফেরত দেওয়ার পরে, সিস্টেমটি আপনার অ্যাপের প্রসঙ্গ ব্যবহার করে মুলতুবি অভিপ্রায় আহ্বান করে।

চিত্র 2. একটি নেস্টেড মুলতুবি অভিপ্রায় ব্যবহার করার সময় আন্তঃ-অ্যাপ যোগাযোগের চিত্র।

একটি অন্তর্নিহিত অভিপ্রায় প্রাপ্তি

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

দ্রষ্টব্য: একটি সুস্পষ্ট অভিপ্রায় সর্বদা তার লক্ষ্যে পৌঁছে দেওয়া হয়, উপাদানটি ঘোষণা করা কোনো অভিপ্রায় ফিল্টার নির্বিশেষে।

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

প্রতিটি ইনটেন্ট ফিল্টার অ্যাপের ম্যানিফেস্ট ফাইলে একটি <intent-filter> উপাদান দ্বারা সংজ্ঞায়িত করা হয়, সংশ্লিষ্ট অ্যাপ উপাদানে (যেমন একটি <activity> উপাদান) নেস্ট করা হয়।

প্রতিটি অ্যাপ কম্পোনেন্টে একটি <intent-filter> উপাদান রয়েছে, স্পষ্টভাবে android:exported এর জন্য একটি মান সেট করুন। এই বৈশিষ্ট্যটি নির্দেশ করে যে অ্যাপের উপাদানটি অন্য অ্যাপে অ্যাক্সেসযোগ্য কিনা। কিছু পরিস্থিতিতে, যেমন ক্রিয়াকলাপ যার উদ্দেশ্য ফিল্টারগুলি LAUNCHER বিভাগ অন্তর্ভুক্ত করে, এই বৈশিষ্ট্যটিকে true সেট করা দরকারী। অন্যথায়, এই বৈশিষ্ট্যটিকে false সেট করা নিরাপদ।

সতর্কতা: যদি আপনার অ্যাপে কোনো অ্যাক্টিভিটি, পরিষেবা বা ব্রডকাস্ট রিসিভার ইন্টেন্ট ফিল্টার ব্যবহার করে এবং স্পষ্টভাবে android:exported জন্য মান সেট না করে, তাহলে আপনার অ্যাপটি Android 12 বা তার বেশি সংস্করণ চালিত ডিভাইসে ইনস্টল করা যাবে না।

<intent-filter> এর ভিতরে, আপনি এই তিনটি উপাদানের এক বা একাধিক ব্যবহার করে গ্রহণ করার জন্য অভিপ্রায়ের ধরন নির্দিষ্ট করতে পারেন:

<action>
গৃহীত অভিপ্রায় ক্রিয়া ঘোষণা করে, name বৈশিষ্ট্যে। মানটি অবশ্যই একটি কর্মের আক্ষরিক স্ট্রিং মান হতে হবে, শ্রেণি ধ্রুবক নয়।
<data>
এক বা একাধিক বৈশিষ্ট্য ব্যবহার করে গৃহীত ডেটার ধরন ঘোষণা করে যা ডেটা URI ( scheme , host , port , path ) এবং MIME প্রকারের বিভিন্ন দিক নির্দিষ্ট করে৷
<category>
গৃহীত অভিপ্রায় বিভাগ ঘোষণা করে, name বৈশিষ্ট্যে। মানটি অবশ্যই একটি কর্মের আক্ষরিক স্ট্রিং মান হতে হবে, শ্রেণি ধ্রুবক নয়।

দ্রষ্টব্য: অন্তর্নিহিত উদ্দেশ্যগুলি পেতে, আপনাকে অবশ্যই অভিপ্রায় ফিল্টারে CATEGORY_DEFAULT বিভাগ অন্তর্ভুক্ত করতে হবেstartActivity() এবং startActivityForResult() পদ্ধতিগুলি সমস্ত উদ্দেশ্যকে এমনভাবে বিবেচনা করে যেন তারা CATEGORY_DEFAULT বিভাগ ঘোষণা করেছে৷ আপনি যদি আপনার অভিপ্রায় ফিল্টারে এই বিভাগটি ঘোষণা না করেন, তাহলে কোনো অন্তর্নিহিত উদ্দেশ্য আপনার কার্যকলাপের সমাধান করবে না।

উদাহরণস্বরূপ, ডেটা টাইপ পাঠ্য হলে একটি ACTION_SEND অভিপ্রায় পাওয়ার জন্য একটি উদ্দেশ্য ফিল্টার সহ একটি কার্যকলাপ ঘোষণা রয়েছে:

<activity android:name="ShareActivity" android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

আপনি একটি ফিল্টার তৈরি করতে পারেন যাতে <action> , <data> , অথবা <category> এর একাধিক উদাহরণ রয়েছে। আপনি যদি তা করেন তবে আপনাকে নিশ্চিত হতে হবে যে উপাদানটি সেই ফিল্টার উপাদানগুলির যেকোনো এবং সমস্ত সমন্বয় পরিচালনা করতে পারে।

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

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

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

একইভাবে, অসাবধানতাবশত একটি ভিন্ন অ্যাপের Service চালানো এড়াতে, সর্বদা আপনার নিজের পরিষেবা শুরু করার জন্য একটি সুস্পষ্ট অভিপ্রায় ব্যবহার করুন৷

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

উদাহরণ ফিল্টার

কিছু অভিপ্রায় ফিল্টার আচরণ প্রদর্শন করতে, এখানে একটি সামাজিক-শেয়ারিং অ্যাপের ম্যানিফেস্ট ফাইল থেকে একটি উদাহরণ দেওয়া হল:

<activity android:name="MainActivity" android:exported="true">
    <!-- This activity is the main entry, should appear in app launcher -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name="ShareActivity" android:exported="false">
    <!-- This activity handles "SEND" actions with text data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <action android:name="android.intent.action.SEND_MULTIPLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.google.panorama360+jpg"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="video/*"/>
    </intent-filter>
</activity>

প্রথম অ্যাক্টিভিটি, MainActivity হল অ্যাপের প্রধান এন্ট্রি পয়েন্ট—যে অ্যাক্টিভিটি খোলে যখন ব্যবহারকারী প্রথমে লঞ্চার আইকন দিয়ে অ্যাপটি চালু করে:

  • ACTION_MAIN অ্যাকশন ইঙ্গিত করে যে এটিই প্রধান এন্ট্রি পয়েন্ট এবং কোনো উদ্দেশ্য ডেটা আশা করে না।
  • CATEGORY_LAUNCHER বিভাগটি নির্দেশ করে যে এই কার্যকলাপের আইকনটি সিস্টেমের অ্যাপ লঞ্চারে স্থাপন করা উচিত। যদি <activity> উপাদানটি icon সহ একটি আইকন নির্দিষ্ট না করে, তাহলে সিস্টেমটি <application> অ্যাপ্লিকেশন> উপাদান থেকে আইকনটি ব্যবহার করে।

অ্যাপ্লিকেশান লঞ্চারে ক্রিয়াকলাপটি প্রদর্শিত হওয়ার জন্য এই দুটিকে একসাথে যুক্ত করতে হবে৷

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

দ্রষ্টব্য: MIME প্রকার, application/vnd.google.panorama360+jpg , একটি বিশেষ ডেটা টাইপ যা প্যানোরামিক ফটোগুলি নির্দিষ্ট করে, যা আপনি Google প্যানোরামা APIগুলির সাথে পরিচালনা করতে পারেন৷

অন্যান্য অ্যাপের অভিপ্রায় ফিল্টারগুলির সাথে অভিপ্রায়গুলিকে মেলান৷

যদি অন্য কোনো অ্যাপ Android 13 (API লেভেল 33) বা উচ্চতরকে টার্গেট করে, তবে এটি আপনার অ্যাপের উদ্দেশ্যকে তখনই পরিচালনা করতে পারে যখন আপনার অভিপ্রায় সেই অন্য অ্যাপের <intent-filter> ফিল্টার> এলিমেন্টের ক্রিয়া এবং বিভাগের সাথে মিলে যায়। যদি সিস্টেমটি একটি মিল খুঁজে না পায় তবে এটি একটি ActivityNotFoundException নিক্ষেপ করে। পাঠানোর অ্যাপটিকে অবশ্যই এই ব্যতিক্রমটি পরিচালনা করতে হবে।

একইভাবে, আপনি যদি আপনার অ্যাপটি এমনভাবে আপডেট করেন যাতে এটি Android 13 বা উচ্চতরকে লক্ষ্য করে, তবে বহিরাগত অ্যাপগুলি থেকে উদ্ভূত সমস্ত অভিপ্রায় আপনার অ্যাপের একটি রপ্তানিকৃত উপাদানে বিতরণ করা হয় শুধুমাত্র যদি সেই অভিপ্রায়টি একটি <intent-filter> উপাদানের ক্রিয়া এবং বিভাগের সাথে মেলে যা আপনার অ্যাপ ঘোষণা করে। পাঠানো অ্যাপের টার্গেট SDK সংস্করণ নির্বিশেষে এই আচরণটি ঘটে।

নিম্নলিখিত ক্ষেত্রে, অভিপ্রায় মিল প্রয়োগ করা হয় না:

  • কোনো অভিপ্রায় ফিল্টার ঘোষণা করে না এমন উপাদানগুলিতে ইন্টেন্ট বিতরণ করা হয়।
  • একই অ্যাপের মধ্যে থেকে উদ্ভূত অভিপ্রায়।
  • সিস্টেম থেকে উদ্ভূত উদ্দেশ্য; অর্থাৎ, "সিস্টেম UID" (uid=1000) থেকে ইন্টেন্ট পাঠানো হচ্ছে। সিস্টেম অ্যাপ্লিকেশানগুলির মধ্যে system_server এবং অ্যাপ্লিকেশানগুলি রয়েছে যেগুলি android:sharedUserIdandroid.uid.system সেট করে৷
  • মূল থেকে উদ্ভূত অভিপ্রায়।

অভিপ্রায় ম্যাচিং সম্পর্কে আরও জানুন।

একটি মুলতুবি অভিপ্রায় ব্যবহার করে

একটি PendingIntent অবজেক্ট হল একটি Intent অবজেক্টের চারপাশে একটি মোড়ক। একটি PendingIntent এর প্রাথমিক উদ্দেশ্য হল একটি বিদেশী অ্যাপ্লিকেশনকে Intent ব্যবহার করার অনুমতি দেওয়া যাতে এটি আপনার অ্যাপের নিজস্ব প্রক্রিয়া থেকে সম্পাদিত হয়।

একটি মুলতুবি অভিপ্রায় জন্য প্রধান ব্যবহারের ক্ষেত্রে নিম্নলিখিত অন্তর্ভুক্ত:

  • যখন ব্যবহারকারী আপনার বিজ্ঞপ্তির সাথে একটি ক্রিয়া সম্পাদন করে তখন একটি অভিপ্রায় কার্যকর করার ঘোষণা করা (অ্যান্ড্রয়েড সিস্টেমের NotificationManager Intent কার্যকর করে)।
  • ব্যবহারকারী যখন আপনার অ্যাপ উইজেট (হোম স্ক্রীন অ্যাপটি Intent কার্যকর করে) দিয়ে একটি ক্রিয়া সম্পাদন করে তখন একটি অভিপ্রায় কার্যকর করার ঘোষণা করা।
  • একটি নির্দিষ্ট ভবিষ্যত সময়ে সম্পাদিত হওয়ার অভিপ্রায় ঘোষণা করা (অ্যান্ড্রয়েড সিস্টেমের AlarmManager Intent কার্যকর করে)।

যেভাবে প্রতিটি Intent অবজেক্টকে একটি নির্দিষ্ট ধরনের অ্যাপ কম্পোনেন্ট (হয় একটি Activity , একটি Service বা একটি BroadcastReceiver ) দ্বারা পরিচালনা করার জন্য ডিজাইন করা হয়েছে, তেমনি একই বিবেচনায় একটি PendingIntent তৈরি করতে হবে। একটি মুলতুবি অভিপ্রায় ব্যবহার করার সময়, আপনার অ্যাপ startActivity() মতো কলের মাধ্যমে অভিপ্রায়টি কার্যকর করে না। পরিবর্তে, আপনি যখন সংশ্লিষ্ট নির্মাতা পদ্ধতিতে কল করে PendingIntent তৈরি করবেন তখন আপনাকে অবশ্যই উদ্দিষ্ট উপাদানের প্রকার ঘোষণা করতে হবে:

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

প্রতিটি পদ্ধতি বর্তমান অ্যাপের Context , আপনি যে Intent মোড়ানো করতে চান এবং এক বা একাধিক ফ্ল্যাগ নেয় যেগুলি কীভাবে অভিপ্রায় ব্যবহার করা উচিত তা নির্দিষ্ট করে (যেমন অভিপ্রায়টি একাধিকবার ব্যবহার করা যেতে পারে কিনা)৷

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

পরিবর্তনশীলতা উল্লেখ করুন

যদি আপনার অ্যাপটি Android 12 বা উচ্চতরকে লক্ষ্য করে, তাহলে আপনাকে অবশ্যই আপনার অ্যাপ তৈরি করা প্রতিটি PendingIntent অবজেক্টের পরিবর্তনযোগ্যতা উল্লেখ করতে হবে। একটি প্রদত্ত PendingIntent বস্তু পরিবর্তনযোগ্য বা অপরিবর্তনীয় তা ঘোষণা করতে, যথাক্রমে PendingIntent.FLAG_MUTABLE বা PendingIntent.FLAG_IMMUTABLE পতাকা ব্যবহার করুন৷

যদি আপনার অ্যাপ পরিবর্তনযোগ্যতা ফ্ল্যাগ সেট না করে একটি PendingIntent অবজেক্ট তৈরি করার চেষ্টা করে, তাহলে সিস্টেমটি একটি IllegalArgumentException নিক্ষেপ করে, এবং নিম্নলিখিত বার্তাটি Logcat- এ উপস্থিত হয়:

PACKAGE_NAME: Targeting S+ (version 31 and above) requires that one of \
FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.

Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if \
some functionality depends on the PendingIntent being mutable, e.g. if \
it needs to be used with inline replies or bubbles.

যখনই সম্ভব অপরিবর্তনীয় মুলতুবি অভিপ্রায় তৈরি করুন

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

কোটলিন

val pendingIntent = PendingIntent.getActivity(applicationContext,
        REQUEST_CODE, intent,
        /* flags */ PendingIntent.FLAG_IMMUTABLE)

জাভা

PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),
        REQUEST_CODE, intent,
        /* flags */ PendingIntent.FLAG_IMMUTABLE);

যাইহোক, নির্দিষ্ট ব্যবহারের ক্ষেত্রে পরিবর্তে পরিবর্তনযোগ্য PendingIntent অবজেক্ট প্রয়োজন:

  • বিজ্ঞপ্তিতে সরাসরি উত্তর ক্রিয়া সমর্থন করা। সরাসরি উত্তরের জন্য PendingIntent অবজেক্টের ক্লিপ ডেটাতে পরিবর্তন প্রয়োজন যা উত্তরটির সাথে যুক্ত। সাধারণত, আপনি fillIn() পদ্ধতিতে একটি পতাকা হিসাবে FILL_IN_CLIP_DATA পাস করে এই পরিবর্তনের জন্য অনুরোধ করেন৷
  • CarAppExtender এর দৃষ্টান্ত ব্যবহার করে Android Auto ফ্রেমওয়ার্কের সাথে বিজ্ঞপ্তিগুলি সংযুক্ত করা।
  • PendingIntent এর উদাহরণ ব্যবহার করে বুদবুদে কথোপকথন স্থাপন করা। একটি পরিবর্তনযোগ্য PendingIntent অবজেক্ট সিস্টেমকে সঠিক পতাকা প্রয়োগ করতে দেয়, যেমন FLAG_ACTIVITY_MULTIPLE_TASK এবং FLAG_ACTIVITY_NEW_DOCUMENT
  • requestLocationUpdates() বা অনুরূপ API কল করে ডিভাইসের অবস্থানের তথ্যের অনুরোধ করা। পরিবর্তনযোগ্য PendingIntent অবজেক্ট সিস্টেমটিকে ইন্টেন্ট অতিরিক্ত যোগ করার অনুমতি দেয় যা অবস্থান জীবনচক্র ইভেন্টগুলিকে উপস্থাপন করে। এই ইভেন্টগুলিতে অবস্থানের পরিবর্তন এবং একটি প্রদানকারী উপলব্ধ হওয়া অন্তর্ভুক্ত।
  • AlarmManager ব্যবহার করে অ্যালার্ম নির্ধারণ করা। পরিবর্তনযোগ্য PendingIntent অবজেক্ট সিস্টেমটিকে EXTRA_ALARM_COUNT ইন্টেন্ট অতিরিক্ত যোগ করার অনুমতি দেয়। এই অতিরিক্ত একটি পুনরাবৃত্তি অ্যালার্ম ট্রিগার করা হয়েছে যে সংখ্যা প্রতিনিধিত্ব করে. এই অতিরিক্ত ধারণ করে, অভিপ্রায় একটি অ্যাপকে সঠিকভাবে সূচিত করতে পারে যে একটি পুনরাবৃত্তি অ্যালার্ম একাধিকবার ট্রিগার হয়েছে কিনা, যেমন ডিভাইসটি কখন ঘুমিয়ে ছিল।

যদি আপনার অ্যাপ একটি পরিবর্তনযোগ্য PendingIntent অবজেক্ট তৈরি করে, তাহলে এটি দৃঢ়ভাবে সুপারিশ করা হয় যে আপনি একটি স্পষ্ট অভিপ্রায় ব্যবহার করুন এবং ComponentName পূরণ করুন। এইভাবে, যখনই অন্য একটি অ্যাপ PendingIntent আহ্বান করে এবং আপনার অ্যাপে নিয়ন্ত্রণ ফিরিয়ে দেয়, আপনার অ্যাপের একই উপাদান সবসময় শুরু হয়।

মুলতুবি অভিপ্রায়ের মধ্যে স্পষ্ট অভিপ্রায় ব্যবহার করুন

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

  1. বেস ইন্টেন্টের অ্যাকশন, প্যাকেজ এবং কম্পোনেন্ট ফিল্ড সেট করা আছে কিনা চেক করুন।
  2. মুলতুবি অভিপ্রায় তৈরি করতে FLAG_IMMUTABLE ব্যবহার করুন, Android 6.0 (API স্তর 23) এ যোগ করুন। এই ফ্ল্যাগটি এমন অ্যাপগুলিকে আটকায় যেগুলি জনসংখ্যাবিহীন বৈশিষ্ট্যগুলি পূরণ করতে একটি PendingIntent পায়৷ আপনার অ্যাপের minSdkVersion 22 বা তার কম হলে, আপনি নিম্নলিখিত কোড ব্যবহার করে একসাথে নিরাপত্তা এবং সামঞ্জস্য প্রদান করতে পারেন:

    if (Build.VERSION.SDK_INT >= 23) {
      // Create a PendingIntent using FLAG_IMMUTABLE.
    } else {
      // Existing code that creates a PendingIntent.
    }

অভিপ্রায় সমাধান

যখন সিস্টেমটি একটি কার্যকলাপ শুরু করার একটি অন্তর্নিহিত অভিপ্রায় পায়, তখন এটি তিনটি দিকের উপর ভিত্তি করে অভিপ্রায় ফিল্টারের সাথে তুলনা করে অভিপ্রায়ের জন্য সর্বোত্তম কার্যকলাপ অনুসন্ধান করে:

  • অ্যাকশন।
  • ডেটা (ইউআরআই এবং ডেটা টাইপ উভয়ই)।
  • শ্রেণী।

নিম্নলিখিত বিভাগগুলি বর্ণনা করে যে কীভাবে একটি অ্যাপের ম্যানিফেস্ট ফাইলে অভিপ্রায় ফিল্টার ঘোষণা অনুসারে উপযুক্ত উপাদানগুলির সাথে ইন্টেন্টগুলি মিলিত হয়৷

কর্ম পরীক্ষা

গৃহীত অভিপ্রায় ক্রিয়াগুলি নির্দিষ্ট করতে, একটি অভিপ্রায় ফিল্টার শূন্য বা তার বেশি <action> উপাদানগুলি ঘোষণা করতে পারে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<intent-filter>
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.VIEW" />
    ...
</intent-filter>

এই ফিল্টারটি পাস করার জন্য, Intent নির্দিষ্ট করা ক্রিয়াটি অবশ্যই ফিল্টারে তালিকাভুক্ত ক্রিয়াগুলির একটির সাথে মিলবে৷

যদি ফিল্টার কোনো ক্রিয়াকে তালিকাভুক্ত না করে, তাহলে মিলের অভিপ্রায়ের জন্য কিছুই নেই, তাই সমস্ত অভিপ্রায় পরীক্ষায় ব্যর্থ হয়। যাইহোক, যদি একটি Intent একটি ক্রিয়া নির্দিষ্ট না করে, তবে ফিল্টারটিতে কমপক্ষে একটি ক্রিয়া থাকা পর্যন্ত এটি পরীক্ষায় উত্তীর্ণ হয়।

ক্যাটাগরি পরীক্ষা

গৃহীত অভিপ্রায় বিভাগগুলি নির্দিষ্ট করতে, একটি অভিপ্রায় ফিল্টার শূন্য বা তার বেশি <category> উপাদান ঘোষণা করতে পারে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    ...
</intent-filter>

বিভাগ পরীক্ষায় উত্তীর্ণ হওয়ার অভিপ্রায়ের জন্য, Intent প্রতিটি বিভাগ অবশ্যই ফিল্টারের একটি বিভাগের সাথে মেলে। বিপরীতটি প্রয়োজনীয় নয় - অভিপ্রায় ফিল্টারটি Intent নির্দিষ্ট করা থেকে আরও বেশি বিভাগ ঘোষণা করতে পারে এবং Intent এখনও পাস হয়৷ অতএব, ফিল্টারে কোন বিভাগ ঘোষণা করা হোক না কেন, কোন শ্রেণীবিহীন অভিপ্রায় সবসময় এই পরীক্ষায় উত্তীর্ণ হয়।

দ্রষ্টব্য: startActivity() এবং startActivityForResult() এ পাস করা সমস্ত অন্তর্নিহিত উদ্দেশ্যগুলিতে Android স্বয়ংক্রিয়ভাবে CATEGORY_DEFAULT বিভাগ প্রয়োগ করে৷ আপনি যদি চান যে আপনার অ্যাক্টিভিটি অন্তর্নিহিত অভিপ্রায় গ্রহণ করুক, তাহলে এটির অভিপ্রায় ফিল্টারগুলিতে "android.intent.category.DEFAULT" এর জন্য একটি বিভাগ অন্তর্ভুক্ত করতে হবে, যেমনটি আগের <intent-filter> ফিল্টার> উদাহরণে দেখানো হয়েছে।

ডেটা পরীক্ষা

গৃহীত অভিপ্রায় ডেটা নির্দিষ্ট করতে, একটি অভিপ্রায় ফিল্টার শূন্য বা তার বেশি <data> উপাদান ঘোষণা করতে পারে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<intent-filter>
    <data android:mimeType="video/mpeg" android:scheme="http" ... />
    <data android:mimeType="audio/mpeg" android:scheme="http" ... />
    ...
</intent-filter>

প্রতিটি <data> উপাদান একটি URI গঠন এবং একটি ডেটা টাইপ (MIME মিডিয়া টাইপ) নির্দিষ্ট করতে পারে। URI-এর প্রতিটি অংশ একটি পৃথক বৈশিষ্ট্য: scheme , host , port এবং path :

<scheme>://<host>:<port>/<path>

নিম্নলিখিত উদাহরণ এই বৈশিষ্ট্যগুলির জন্য সম্ভাব্য মান দেখায়:

content://com.example.project:200/folder/subfolder/etc

এই URI-তে, স্কিম হল content , হোস্ট হল com.example.project , পোর্ট হল 200 , এবং পাথ হল folder/subfolder/etc

এই বৈশিষ্ট্যগুলির প্রতিটি একটি <data> উপাদানে ঐচ্ছিক, কিন্তু রৈখিক নির্ভরতা রয়েছে:

  • একটি স্কিম নির্দিষ্ট করা না থাকলে, হোস্ট উপেক্ষা করা হয়।
  • একটি হোস্ট নির্দিষ্ট না হলে, পোর্ট উপেক্ষা করা হয়.
  • স্কিম এবং হোস্ট উভয়ই নির্দিষ্ট না থাকলে, পথটি উপেক্ষা করা হয়।

যখন একটি উদ্দেশ্যের URI-কে একটি ফিল্টারের একটি URI স্পেসিফিকেশনের সাথে তুলনা করা হয়, তখন এটি শুধুমাত্র ফিল্টারে অন্তর্ভুক্ত URI-এর অংশগুলির সাথে তুলনা করা হয়। যেমন:

  • যদি একটি ফিল্টার শুধুমাত্র একটি স্কিম নির্দিষ্ট করে, সেই স্কিমের সাথে সমস্ত URI ফিল্টারের সাথে মেলে৷
  • যদি কোনও ফিল্টার কোনও স্কিম এবং কোনও কর্তৃপক্ষ নির্দিষ্ট করে তবে কোনও পথ নির্দিষ্ট করে তবে একই স্কিম এবং কর্তৃপক্ষের সমস্ত ইউআরআই তাদের পথ নির্বিশেষে ফিল্টারটি পাস করে।
  • যদি কোনও ফিল্টার কোনও স্কিম, একটি কর্তৃপক্ষ এবং একটি পাথ নির্দিষ্ট করে তবে কেবল একই স্কিম, কর্তৃপক্ষ এবং পাথ সহ কেবল ইউআরআইগুলি ফিল্টারটি পাস করে।

দ্রষ্টব্য: একটি পাথ স্পেসিফিকেশনে একটি ওয়াইল্ডকার্ড তারকা (*) থাকতে পারে যাতে পাথের নামের একটি আংশিক ম্যাচ প্রয়োজন।

ডেটা টেস্টটি ইউআরআই এবং মাইম টাইপ উভয়ের সাথেই ফিল্টারে নির্দিষ্ট করা ইউআরআই এবং মাইম টাইপের সাথে তুলনা করে। নিয়মগুলি নিম্নরূপ:

  1. ফিল্টারটি কোনও ইউআরআই বা মাইম প্রকার নির্দিষ্ট না করে কেবল তখনই ইউআরআই বা মাইম টাইপ না করে এমন একটি উদ্দেশ্য পরীক্ষায় পাস করে না।
  2. এমন একটি অভিপ্রায় যা একটি ইউআরআই থাকে তবে কোনও মাইম টাইপ নেই (ইউআরআই থেকে সুস্পষ্ট বা অনুমানযোগ্য নয়) কেবল তখনই পরীক্ষায় উত্তীর্ণ হয় যখন তার ইউআরআই ফিল্টারটির ইউআরআই ফর্ম্যাটের সাথে মেলে এবং ফিল্টারটি একইভাবে কোনও মাইম টাইপ নির্দিষ্ট করে না।
  3. এমন একটি উদ্দেশ্য যা একটি মাইম টাইপ ধারণ করে তবে কোনও ইউআরআই পরীক্ষায় পাস করে কেবল তখনই ফিল্টার একই মাইম টাইপের তালিকাভুক্ত করে এবং একটি ইউআরআই ফর্ম্যাট নির্দিষ্ট না করে।
  4. একটি অভিপ্রায় যা একটি ইউআরআই এবং একটি মাইম টাইপ উভয়ই থাকে (ইউআরআই থেকে সুস্পষ্ট বা নির্ধারিত হয়) কেবলমাত্র পরীক্ষার মাইম টাইপ অংশটি পাস করে কেবলমাত্র যদি সেই ধরণের ফিল্টারে তালিকাভুক্ত কোনও ধরণের সাথে মেলে। এটি পরীক্ষার ইউআরআই অংশটি পাস করে যদি এর ইউআরআই ফিল্টারটিতে কোনও ইউআরআইয়ের সাথে মেলে বা এতে কোনও content: বা file: ইউআরআই এবং ফিল্টারটি কোনও ইউআরআই নির্দিষ্ট করে না। অন্য কথায়, একটি উপাদান content: এবং file: ডেটা যদি এর ফিল্টারটি কেবল একটি মাইম টাইপের তালিকা করে।

দ্রষ্টব্য: যদি কোনও উদ্দেশ্য যদি কোনও ইউআরআই বা মাইম টাইপ নির্দিষ্ট করে তবে <intent-filter><data> উপাদান না থাকলে ডেটা পরীক্ষা ব্যর্থ হবে।

এই শেষ নিয়ম, নিয়ম (ডি), এই প্রত্যাশা প্রতিফলিত করে যে উপাদানগুলি কোনও ফাইল বা সামগ্রী সরবরাহকারীর কাছ থেকে স্থানীয় ডেটা পেতে সক্ষম হয়। অতএব, তাদের ফিল্টারগুলি কেবল একটি ডেটা টাইপ তালিকাভুক্ত করতে পারে এবং স্পষ্টভাবে content: এবং file: স্কিমগুলি। নিম্নলিখিত উদাহরণটি একটি সাধারণ কেস দেখায় যাতে একটি <data> উপাদান অ্যান্ড্রয়েডকে বলে যে উপাদানটি কোনও সামগ্রী সরবরাহকারীর কাছ থেকে চিত্রের ডেটা পেতে পারে এবং এটি প্রদর্শন করতে পারে:

<intent-filter>
    <data android:mimeType="image/*" />
    ...
</intent-filter>

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

আর একটি সাধারণ কনফিগারেশন হ'ল একটি স্কিম এবং ডেটা টাইপ সহ একটি ফিল্টার। উদাহরণস্বরূপ, নিম্নলিখিতগুলির মতো একটি <data> উপাদান অ্যান্ড্রয়েডকে বলে যে ক্রিয়াটি সম্পাদন করার জন্য উপাদানটি নেটওয়ার্ক থেকে ভিডিও ডেটা পুনরুদ্ধার করতে পারে:

<intent-filter>
    <data android:scheme="http" android:mimeType="video/*" />
    ...
</intent-filter>

অভিপ্রায় মিলে

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

আপনার অ্যাপ্লিকেশনটি হোম অ্যাপ্লিকেশনটি যা করে তার অনুরূপ পদ্ধতিতে অভিপ্রায় ম্যাচিং ব্যবহার করতে পারে। PackageManager query...() পদ্ধতিগুলি যা সমস্ত উপাদানগুলি ফেরত দেয় যা একটি নির্দিষ্ট অভিপ্রায় এবং অনুরূপ resolve...() পদ্ধতিগুলি যা কোনও উদ্দেশ্যটির প্রতিক্রিয়া জানাতে সেরা উপাদান নির্ধারণ করে। উদাহরণস্বরূপ, queryIntentActivities() সমস্ত ক্রিয়াকলাপের একটি তালিকা দেয় যা যুক্তি হিসাবে পাস করা অভিপ্রায় সম্পাদন করতে পারে এবং queryIntentServices() পরিষেবার অনুরূপ তালিকা দেয়। কোনও পদ্ধতিই উপাদানগুলিকে সক্রিয় করে না; তারা কেবল প্রতিক্রিয়া জানাতে পারে তাদের তালিকাভুক্ত করে। সম্প্রচারের রিসিভারগুলির জন্য queryBroadcastReceivers() অনুরূপ একটি পদ্ধতি রয়েছে।