Intent হলো একটি মেসেজিং অবজেক্ট যা আপনি অন্য অ্যাপ কম্পোনেন্ট থেকে কোনও অ্যাকশনের অনুরোধ করতে ব্যবহার করতে পারেন। যদিও ইন্টেন্ট বিভিন্ন উপায়ে কম্পোনেন্টের মধ্যে যোগাযোগ সহজতর করে, তবুও তিনটি মৌলিক ব্যবহারের ক্ষেত্রে রয়েছে:
- একটি কার্যকলাপ শুরু করা
একটি
Activityএকটি অ্যাপের মধ্যে একটি একক স্ক্রিন উপস্থাপন করে। আপনিstartActivity()এ একটিIntentপাস করে একটিActivityএকটি নতুন উদাহরণ শুরু করতে পারেন।Intentশুরু করার জন্য অ্যাক্টিভিটি বর্ণনা করে এবং প্রয়োজনীয় ডেটা বহন করে।যদি আপনি অ্যাক্টিভিটি শেষ হওয়ার পর থেকে ফলাফল পেতে চান, তাহলে
startActivityForResult()কল করুন। আপনার অ্যাক্টিভিটি আপনার অ্যাক্টিভিটিরonActivityResult()কলব্যাকে একটি পৃথকIntentঅবজেক্ট হিসাবে ফলাফল গ্রহণ করে। আরও তথ্যের জন্য, অ্যাক্টিভিটিস গাইড দেখুন। - একটি পরিষেবা শুরু করা হচ্ছে
Serviceহলো এমন একটি কম্পোনেন্ট যা ইউজার ইন্টারফেস ছাড়াই ব্যাকগ্রাউন্ডে কাজ করে। অ্যান্ড্রয়েড ৫.০ (এপিআই লেভেল ২১) এবং তার পরবর্তী সংস্করণের মাধ্যমে, আপনিJobSchedulerদিয়ে একটি পরিষেবা শুরু করতে পারেন।JobSchedulerসম্পর্কে আরও তথ্যের জন্য, এরAPI-reference documentationদেখুন।অ্যান্ড্রয়েড ৫.০ (এপিআই লেভেল ২১) এর আগের ভার্সনের জন্য, আপনি
Serviceক্লাসের পদ্ধতি ব্যবহার করে একটি পরিষেবা শুরু করতে পারেন। আপনিstartService()এ একটিIntentপাস করে এককালীন অপারেশন (যেমন একটি ফাইল ডাউনলোড করা) করার জন্য একটি পরিষেবা শুরু করতে পারেন।Intentশুরু করার জন্য পরিষেবাটি বর্ণনা করে এবং প্রয়োজনীয় ডেটা বহন করে।যদি পরিষেবাটি ক্লায়েন্ট-সার্ভার ইন্টারফেস দিয়ে ডিজাইন করা হয়, তাহলে আপনি
bindService()এ একটিIntentপাস করে অন্য উপাদান থেকে পরিষেবাটিতে আবদ্ধ করতে পারেন। আরও তথ্যের জন্য, পরিষেবা নির্দেশিকা দেখুন। - সম্প্রচার প্রদান
ব্রডকাস্ট হলো এমন একটি বার্তা যা যেকোনো অ্যাপ গ্রহণ করতে পারে। সিস্টেমটি সিস্টেম ইভেন্টের জন্য বিভিন্ন ব্রডকাস্ট সরবরাহ করে, যেমন যখন সিস্টেম বুট হয় বা ডিভাইসটি চার্জ করা শুরু করে। আপনি
sendBroadcast()অথবাsendOrderedBroadcast()এ একটিIntentপাস করে অন্যান্য অ্যাপে একটি ব্রডকাস্ট সরবরাহ করতে পারেন।
এই পৃষ্ঠার বাকি অংশে ব্যাখ্যা করা হয়েছে কিভাবে ইন্টেন্ট কাজ করে এবং কিভাবে ব্যবহার করতে হয়। সম্পর্কিত তথ্যের জন্য, অন্যান্য অ্যাপের সাথে ইন্টারঅ্যাক্ট করা এবং কন্টেন্ট শেয়ার করা দেখুন।
অভিপ্রায় প্রকার
দুই ধরণের উদ্দেশ্য রয়েছে:
- স্পষ্ট অভিপ্রায়গুলি নির্দিষ্ট করে যে কোন অ্যাপ্লিকেশনের কোন উপাদানটি উদ্দেশ্য পূরণ করবে, একটি সম্পূর্ণ
ComponentNameনির্দিষ্ট করে। আপনি সাধারণত আপনার নিজের অ্যাপে একটি উপাদান শুরু করার জন্য একটি স্পষ্ট অভিপ্রায় ব্যবহার করবেন, কারণ আপনি যে কার্যকলাপ বা পরিষেবাটি শুরু করতে চান তার ক্লাসের নাম জানেন। উদাহরণস্বরূপ, আপনি কোনও ব্যবহারকারীর ক্রিয়াকলাপের প্রতিক্রিয়ায় আপনার অ্যাপের মধ্যে একটি নতুন কার্যকলাপ শুরু করতে পারেন, অথবা ব্যাকগ্রাউন্ডে একটি ফাইল ডাউনলোড করার জন্য একটি পরিষেবা শুরু করতে পারেন। - অন্তর্নিহিত অভিপ্রায়গুলি কোনও নির্দিষ্ট উপাদানের নাম দেয় না, বরং একটি সাধারণ ক্রিয়া সম্পাদনের ঘোষণা দেয়, যা অন্য অ্যাপের একটি উপাদানকে এটি পরিচালনা করতে দেয়। উদাহরণস্বরূপ, আপনি যদি ব্যবহারকারীকে একটি মানচিত্রে একটি অবস্থান দেখাতে চান, তাহলে আপনি একটি অন্তর্নিহিত অভিপ্রায় ব্যবহার করে অন্য একটি সক্ষম অ্যাপ্লিকেশনকে একটি মানচিত্রে একটি নির্দিষ্ট অবস্থান দেখানোর অনুরোধ করতে পারেন।
চিত্র ১-এ দেখানো হয়েছে যে কোনও কার্যকলাপ শুরু করার সময় কীভাবে একটি ইন্টেন্ট ব্যবহার করা হয়। যখন Intent অবজেক্ট একটি নির্দিষ্ট কার্যকলাপ উপাদানের নাম স্পষ্টভাবে উল্লেখ করে, তখন সিস্টেমটি তাৎক্ষণিকভাবে সেই উপাদানটি শুরু করে।

চিত্র ১. সিস্টেমের মাধ্যমে আরেকটি কার্যকলাপ শুরু করার জন্য একটি অন্তর্নিহিত অভিপ্রায় কীভাবে সরবরাহ করা হয়: [1] Activity A একটি কর্মের বর্ণনা সহ একটি Intent তৈরি করে এবং এটি startActivity() এ প্রেরণ করে। [2] Android সিস্টেম সমস্ত অ্যাপে একটি অভিপ্রায় ফিল্টার অনুসন্ধান করে যা অভিপ্রায়টির সাথে মেলে। যখন একটি মিল পাওয়া যায়, [3] সিস্টেমটি তার onCreate() পদ্ধতিটি ব্যবহার করে এবং Intent পাস করে ম্যাচিং কার্যকলাপ ( Activity B ) শুরু করে।
যখন আপনি একটি অন্তর্নিহিত অভিপ্রায় ব্যবহার করেন, তখন অ্যান্ড্রয়েড সিস্টেম ডিভাইসের অন্যান্য অ্যাপের ম্যানিফেস্ট ফাইলে ঘোষিত অভিপ্রায় ফিল্টারের সাথে অভিপ্রায়টির বিষয়বস্তু তুলনা করে উপযুক্ত উপাদানটি খুঁজে বের করে। যদি অভিপ্রায়টি একটি অভিপ্রায় ফিল্টারের সাথে মিলে যায়, তাহলে সিস্টেমটি সেই উপাদানটি শুরু করে এবং এটিকে Intent বস্তু সরবরাহ করে। যদি একাধিক অভিপ্রায় ফিল্টার সামঞ্জস্যপূর্ণ হয়, তাহলে সিস্টেমটি একটি ডায়ালগ প্রদর্শন করে যাতে ব্যবহারকারী কোন অ্যাপটি ব্যবহার করবেন তা বেছে নিতে পারেন।
একটি ইনটেন্ট ফিল্টার হল একটি অ্যাপের ম্যানিফেস্ট ফাইলের একটি এক্সপ্রেশন যা কম্পোনেন্টটি কী ধরণের ইনটেন্ট পেতে চায় তা নির্দিষ্ট করে। উদাহরণস্বরূপ, একটি অ্যাক্টিভিটির জন্য একটি ইনটেন্ট ফিল্টার ঘোষণা করে, আপনি অন্যান্য অ্যাপগুলিকে একটি নির্দিষ্ট ধরণের ইনটেন্ট দিয়ে সরাসরি আপনার অ্যাক্টিভিটি শুরু করতে সক্ষম করেন। একইভাবে, যদি আপনি কোনও অ্যাক্টিভিটির জন্য কোনও ইনটেন্ট ফিল্টার ঘোষণা না করেন, তাহলে এটি শুধুমাত্র একটি স্পষ্ট ইনটেন্ট দিয়ে শুরু করা যেতে পারে।
সতর্কতা: আপনার অ্যাপটি নিরাপদ রাখার জন্য, কোনও Service শুরু করার সময় সর্বদা একটি স্পষ্ট অভিপ্রায় ব্যবহার করুন এবং আপনার পরিষেবার জন্য অভিপ্রায় ফিল্টার ঘোষণা করবেন না। কোনও পরিষেবা শুরু করার জন্য একটি অন্তর্নিহিত অভিপ্রায় ব্যবহার করা একটি নিরাপত্তা ঝুঁকি কারণ আপনি নিশ্চিত হতে পারবেন না যে কোন পরিষেবাটি অভিপ্রায়টির প্রতি সাড়া দেবে এবং ব্যবহারকারী কোন পরিষেবাটি শুরু হবে তা দেখতে পারবেন না। Android 5.0 (API স্তর 21) দিয়ে শুরু করে, যদি আপনি অন্তর্নিহিত অভিপ্রায় সহ bindService() কল করেন তবে সিস্টেমটি একটি ব্যতিক্রম দেয়।
একটি উদ্দেশ্য তৈরি করা
একটি Intent অবজেক্টে এমন তথ্য থাকে যা অ্যান্ড্রয়েড সিস্টেম কোন কম্পোনেন্টটি শুরু করবে তা নির্ধারণ করতে ব্যবহার করে (যেমন সঠিক কম্পোনেন্টের নাম বা কম্পোনেন্ট বিভাগ যা ইনটেন্ট গ্রহণ করবে), এবং প্রাপক কম্পোনেন্টটি সঠিকভাবে কাজ সম্পাদনের জন্য যে তথ্য ব্যবহার করে (যেমন কোন পদক্ষেপ নিতে হবে এবং কোন ডেটার উপর কাজ করতে হবে)।
একটি Intent থাকা প্রাথমিক তথ্যগুলি হল নিম্নলিখিত:
- কম্পোনেন্টের নাম
- শুরু করার জন্য উপাদানটির নাম।
এটি ঐচ্ছিক, কিন্তু এটি গুরুত্বপূর্ণ তথ্য যা একটি ইনটেন্টকে স্পষ্ট করে তোলে, যার অর্থ হল ইনটেন্টটি শুধুমাত্র কম্পোনেন্টের নাম দ্বারা সংজ্ঞায়িত অ্যাপ কম্পোনেন্টে পৌঁছে দেওয়া উচিত। কম্পোনেন্টের নাম ছাড়া, ইনটেন্টটি অন্তর্নিহিত থাকে এবং সিস্টেমটি সিদ্ধান্ত নেয় যে কোন কম্পোনেন্টটি অন্যান্য ইনটেন্ট তথ্যের (যেমন অ্যাকশন, ডেটা এবং বিভাগ—নীচে বর্ণিত) উপর ভিত্তি করে ইনটেন্ট গ্রহণ করবে। আপনার অ্যাপে যদি কোনও নির্দিষ্ট কম্পোনেন্ট শুরু করার প্রয়োজন হয়, তাহলে আপনাকে কম্পোনেন্টের নাম উল্লেখ করতে হবে।
দ্রষ্টব্য: কোনও
Serviceশুরু করার সময়, সর্বদা উপাদানের নাম উল্লেখ করুন । অন্যথায়, আপনি নিশ্চিত হতে পারবেন না যে কোন পরিষেবাটি উদ্দেশ্য অনুসারে সাড়া দেবে, এবং ব্যবহারকারী কোন পরিষেবাটি শুরু হবে তা দেখতে পাবে না।Intentএর এই ক্ষেত্রটি একটিComponentNameঅবজেক্ট, যা আপনি টার্গেট কম্পোনেন্টের সম্পূর্ণ যোগ্যতাসম্পন্ন ক্লাস নাম ব্যবহার করে নির্দিষ্ট করতে পারেন, যার মধ্যে অ্যাপের প্যাকেজ নামও অন্তর্ভুক্ত রয়েছে, উদাহরণস্বরূপ,com.example.ExampleActivity। আপনিsetComponent(),setClass(),setClassName(), অথবাIntentকনস্ট্রাক্টর ব্যবহার করে কম্পোনেন্ট নাম সেট করতে পারেন। - অ্যাকশন
- একটি স্ট্রিং যা সঞ্চালনের জন্য জেনেরিক ক্রিয়া নির্দিষ্ট করে (যেমন view বা pick )।
সম্প্রচারের অভিপ্রায়ের ক্ষেত্রে, এটি সেই ক্রিয়া যা সংঘটিত হয়েছিল এবং রিপোর্ট করা হচ্ছে। এই ক্রিয়াটি মূলত নির্ধারণ করে যে উদ্দেশ্যের বাকি অংশ কীভাবে গঠন করা হয়েছে—বিশেষ করে ডেটা এবং অতিরিক্ত তথ্যের মধ্যে থাকা তথ্য।
আপনার অ্যাপের মধ্যে ইন্টেন্ট ব্যবহারের জন্য (অথবা আপনার অ্যাপের উপাদানগুলিকে ব্যবহার করার জন্য অন্যান্য অ্যাপের ব্যবহারের জন্য) আপনি নিজের অ্যাকশনগুলি নির্দিষ্ট করতে পারেন, তবে সাধারণত আপনি
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 theContext// 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 theContext// 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-এ দেখানো ডায়ালগের মতো একটি ডায়ালগ প্রদর্শন করে, যাতে ব্যবহারকারী কোন অ্যাপটি ব্যবহার করবেন তা বেছে নিতে পারেন।
অন্যান্য অ্যাপ চালু করার বিষয়ে আরও তথ্য ব্যবহারকারীকে অন্য অ্যাপে পাঠানোর নির্দেশিকাতেও দেওয়া আছে।

চিত্র ২। একটি নির্বাচনকারী ডায়ালগ।
একটি অ্যাপ চয়নকারীকে জোর করা হচ্ছে
যখন একাধিক অ্যাপ আপনার অন্তর্নিহিত অভিপ্রায়ের প্রতি সাড়া দেয়, তখন ব্যবহারকারী কোন অ্যাপটি ব্যবহার করবেন তা নির্বাচন করতে পারেন এবং সেই অ্যাপটিকে অ্যাকশনের জন্য ডিফল্ট পছন্দ করে তুলতে পারেন। ডিফল্ট নির্বাচন করার ক্ষমতা এমন একটি অ্যাকশন সম্পাদনের সময় সহায়ক যার জন্য ব্যবহারকারী সম্ভবত প্রতিবার একই অ্যাপ ব্যবহার করতে চান, যেমন একটি ওয়েব পৃষ্ঠা খোলার সময় (ব্যবহারকারীরা প্রায়শই কেবল একটি ওয়েব ব্রাউজার পছন্দ করেন)।
তবে, যদি একাধিক অ্যাপ ইনটেন্টে সাড়া দিতে পারে এবং ব্যবহারকারী প্রতিবার একটি ভিন্ন অ্যাপ ব্যবহার করতে চান, তাহলে আপনার স্পষ্টভাবে একটি chooser ডায়ালগ দেখানো উচিত। chooser ডায়ালগ ব্যবহারকারীকে অ্যাকশনের জন্য কোন অ্যাপ ব্যবহার করতে হবে তা নির্বাচন করতে বলে (ব্যবহারকারী অ্যাকশনের জন্য একটি ডিফল্ট অ্যাপ নির্বাচন করতে পারে না)। উদাহরণস্বরূপ, যখন আপনার অ্যাপ ACTION_SEND অ্যাকশনের সাথে "শেয়ার" করে, তখন ব্যবহারকারীরা তাদের বর্তমান পরিস্থিতির উপর নির্ভর করে একটি ভিন্ন অ্যাপ ব্যবহার করে শেয়ার করতে চাইতে পারেন, তাই আপনার সর্বদা chooser ডায়ালগ ব্যবহার করা উচিত, যেমন চিত্র 2-এ দেখানো হয়েছে।
chooser দেখানোর জন্য, 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) এবং উচ্চতর ভার্সনগুলি একটি ডিবাগিং বৈশিষ্ট্য প্রদান করে যা আপনার অ্যাপ যদি কোনও ইনটেন্টের অনিরাপদ লঞ্চ করে তবে আপনাকে সতর্ক করে। উদাহরণস্বরূপ, আপনার অ্যাপটি নেস্টেড ইনটেন্টের অনিরাপদ লঞ্চ সম্পাদন করতে পারে, যা এমন একটি ইনটেন্ট যা অন্য ইনটেন্টে অতিরিক্ত হিসাবে পাস করা হয়।
যদি আপনার অ্যাপটি নিম্নলিখিত দুটি ক্রিয়া সম্পাদন করে, তাহলে সিস্টেমটি একটি অনিরাপদ অভিপ্রায় লঞ্চ সনাক্ত করে এবং একটি StrictMode লঙ্ঘন ঘটে:
- আপনার অ্যাপটি একটি ডেলিভার করা ইনটেন্টের অতিরিক্ত থেকে একটি নেস্টেড ইনটেন্টকে আলাদা করে।
- আপনার অ্যাপটি তাৎক্ষণিকভাবে সেই নেস্টেড ইনটেন্ট ব্যবহার করে একটি অ্যাপ কম্পোনেন্ট শুরু করে, যেমন ইনটেন্টটি
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 চালু করতে পারে। এই কনফিগারেশনটি অন্য অ্যাপটিকে আপনার অ্যাপে যেকোনো উপাদান, এমনকি একটি অ-রপ্তানি করা উপাদানও নিরাপদে চালু করতে দেয়।
চিত্র ২-এর চিত্রটি দেখায় যে কীভাবে সিস্টেম আপনার (ক্লায়েন্ট) অ্যাপ থেকে অন্য (পরিষেবা) অ্যাপে নিয়ন্ত্রণ স্থানান্তর করে এবং আপনার অ্যাপে ফিরে আসে:
- আপনার অ্যাপটি এমন একটি ইন্টেন্ট তৈরি করে যা অন্য অ্যাপে একটি কার্যকলাপকে আহ্বান করে। সেই ইন্টেন্টের মধ্যে, আপনি একটি অতিরিক্ত হিসাবে একটি
PendingIntentঅবজেক্ট যোগ করেন। এই মুলতুবি ইন্টেন্টটি আপনার অ্যাপের একটি উপাদানকে আহ্বান করে; এই উপাদানটি রপ্তানি করা হয় না। - আপনার অ্যাপের ইন্টেন্ট পাওয়ার পর, অন্য অ্যাপটি নেস্টেড
PendingIntentঅবজেক্টটি এক্সট্র্যাক্ট করে। - অন্য অ্যাপটি
PendingIntentঅবজেক্টেsend()পদ্ধতিটি ব্যবহার করে। - আপনার অ্যাপে নিয়ন্ত্রণ ফেরত দেওয়ার পর, সিস্টেমটি আপনার অ্যাপের প্রসঙ্গ ব্যবহার করে মুলতুবি থাকা ইন্টেন্টটি আহ্বান করে।
চিত্র ২. নেস্টেড পেন্ডিং ইনটেন্ট ব্যবহার করার সময় আন্তঃ-অ্যাপ যোগাযোগের চিত্র।
একটি অন্তর্নিহিত অভিপ্রায় প্রাপ্তি
আপনার অ্যাপ কোন কোন অন্তর্নিহিত ইন্টেন্ট গ্রহণ করতে পারে তা বিজ্ঞাপন দিতে, আপনার ম্যানিফেস্ট ফাইলে <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 সিস্টেম কম্পোনেন্টে অভিপ্রায় সরবরাহ করবে না। যাইহোক, যেহেতু একটি কম্পোনেন্টে একাধিক অভিপ্রায় ফিল্টার থাকতে পারে, তাই একটি অভিপ্রায় যা একটি কম্পোনেন্টের একটি ফিল্টারের মধ্য দিয়ে যায় না তা অন্য ফিল্টারে প্রবেশ করতে পারে। সিস্টেম কীভাবে অভিপ্রায় সমাধান করে সে সম্পর্কে আরও তথ্য Intent Resolution সম্পর্কে নীচের বিভাগে দেওয়া হয়েছে।
সতর্কতা: অন্য অ্যাপগুলিকে আপনার কম্পোনেন্টগুলি শুরু করা থেকে বিরত রাখার জন্য একটি ইন্টেন্ট ফিল্টার ব্যবহার করা নিরাপদ উপায় নয়। যদিও ইন্টেন্ট ফিল্টারগুলি একটি কম্পোনেন্টকে শুধুমাত্র নির্দিষ্ট ধরণের অন্তর্নিহিত ইন্টেন্টগুলিতে সাড়া দেওয়ার জন্য সীমাবদ্ধ করে, তবে ডেভেলপার যদি আপনার কম্পোনেন্টের নাম নির্ধারণ করে তবে অন্য একটি অ্যাপ সম্ভাব্যভাবে একটি স্পষ্ট ইন্টেন্ট ব্যবহার করে আপনার অ্যাপ কম্পোনেন্ট শুরু করতে পারে। যদি এটি গুরুত্বপূর্ণ হয় যে শুধুমাত্র আপনার নিজস্ব অ্যাপই আপনার কম্পোনেন্টগুলির একটি শুরু করতে সক্ষম, তাহলে আপনার ম্যানিফেস্টে ইন্টেন্ট ফিল্টার ঘোষণা করবেন না। পরিবর্তে, সেই কম্পোনেন্টের জন্য 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 ব্যবহার করার অনুমতি দেওয়া যেন এটি আপনার অ্যাপের নিজস্ব প্রক্রিয়া থেকে কার্যকর করা হয়েছে।
একটি মুলতুবি অভিপ্রায়ের জন্য প্রধান ব্যবহারের ক্ষেত্রে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:
- ব্যবহারকারী যখন আপনার Notification (Android সিস্টেমের
NotificationManagerIntentকার্যকর করে) ব্যবহার করে কোনও কাজ সম্পাদন করে তখন একটি অভিপ্রায় কার্যকর করার ঘোষণা দেওয়া। - ব্যবহারকারী যখন আপনার অ্যাপ উইজেট ব্যবহার করে কোনও কাজ সম্পাদন করে (হোম স্ক্রিন অ্যাপটি
Intentকার্যকর করে) তখন কার্যকর করার জন্য একটি অভিপ্রায় ঘোষণা করা। - একটি নির্দিষ্ট ভবিষ্যতের সময়ে কার্যকর করার জন্য একটি অভিপ্রায় ঘোষণা করা (অ্যান্ড্রয়েড সিস্টেমের
AlarmManagerIntentকার্যকর করে)।
ঠিক যেমন প্রতিটি Intent অবজেক্ট একটি নির্দিষ্ট ধরণের অ্যাপ কম্পোনেন্ট (হয় একটি Activity , একটি Service , অথবা একটি BroadcastReceiver ) দ্বারা পরিচালনা করার জন্য ডিজাইন করা হয়, তেমনি একই বিবেচনায় একটি PendingIntent তৈরি করতে হবে। Pending intent ব্যবহার করার সময়, আপনার অ্যাপ startActivity() এর মতো কল দিয়ে intent কার্যকর করে না। পরিবর্তে, PendingIntent তৈরি করার সময় আপনাকে সংশ্লিষ্ট creator পদ্ধতিতে কল করে intended component টাইপ ঘোষণা করতে হবে:
-
PendingIntent.getActivity()এমন একটিIntentএর জন্য যা একটিActivityশুরু করে। -
PendingIntent.getService()এমন একটিIntentএর জন্য যা একটিServiceশুরু করে। -
PendingIntent.getBroadcast()এমন একটিIntentএর জন্য যা একটিBroadcastReceiverশুরু করে।
যদি না আপনার অ্যাপটি অন্যান্য অ্যাপ থেকে পেন্ডিং ইন্টেন্ট গ্রহণ করে , তাহলে PendingIntent তৈরি করার জন্য উপরের পদ্ধতিগুলি সম্ভবত একমাত্র PendingIntent পদ্ধতি যা আপনার প্রয়োজন হবে।
প্রতিটি পদ্ধতিতে বর্তমান অ্যাপ Context , আপনি যে Intent মোড়ানোর কথা বলছেন এবং এক বা একাধিক ফ্ল্যাগ ব্যবহার করা হয় যা নির্দেশ করে যে কীভাবে Intent ব্যবহার করা উচিত (যেমন Intent একাধিকবার ব্যবহার করা যেতে পারে কিনা)।
মুলতুবি থাকা উদ্দেশ্যগুলি ব্যবহার সম্পর্কে আরও তথ্যের জন্য, প্রতিটি ব্যবহারের ক্ষেত্রে ডকুমেন্টেশন দেখুন, যেমন বিজ্ঞপ্তি এবং অ্যাপ উইজেট API নির্দেশিকাগুলিতে।
পরিবর্তনযোগ্যতা নির্দিষ্ট করুন
যদি আপনার অ্যাপটি 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 ব্যবহার করে এবং আপনার অ্যাপে নিয়ন্ত্রণ ফেরত পাঠায়, তখন আপনার অ্যাপের একই উপাদানটি সর্বদা শুরু হয়।
মুলতুবি থাকা ইন্টেন্টের মধ্যে স্পষ্ট ইন্টেন্ট ব্যবহার করুন
অন্যান্য অ্যাপগুলি কীভাবে আপনার অ্যাপের পেন্ডিং ইন্টেন্টগুলি ব্যবহার করতে পারে তা আরও ভালভাবে সংজ্ঞায়িত করতে, সর্বদা একটি পেন্ডিং ইন্টেন্টকে একটি স্পষ্ট ইন্টেন্টের চারপাশে মোড়ানো করুন। এই সর্বোত্তম অনুশীলনটি অনুসরণ করতে, নিম্নলিখিতগুলি করুন:
- বেস ইন্টেন্টের অ্যাকশন, প্যাকেজ এবং কম্পোনেন্ট ফিল্ড সেট করা আছে কিনা তা পরীক্ষা করুন।
মুলতুবি থাকা ইনটেন্ট তৈরি করতে Android 6.0 (API লেভেল 23) এ যোগ করা
FLAG_IMMUTABLEব্যবহার করুন। এই ফ্ল্যাগটিPendingIntentপ্রাপ্ত অ্যাপগুলিকে অ-জনবহুল বৈশিষ্ট্য পূরণ করতে বাধা দেয়। যদি আপনার অ্যাপেরminSdkVersion22বা তার কম হয়, তাহলে আপনি নিম্নলিখিত কোড ব্যবহার করে নিরাপত্তা এবং সামঞ্জস্যতা একসাথে প্রদান করতে পারেন:if (Build.VERSION.SDK_INT >= 23) { // Create a PendingIntent using FLAG_IMMUTABLE. } else { // Existing code that creates a PendingIntent. }
ইন্টেন্ট রেজোলিউশন
যখন সিস্টেমটি কোনও কার্যকলাপ শুরু করার জন্য একটি অন্তর্নিহিত অভিপ্রায় পায়, তখন এটি তিনটি দিকের উপর ভিত্তি করে অভিপ্রায় ফিল্টারের সাথে তুলনা করে অভিপ্রায়টির জন্য সেরা কার্যকলাপ অনুসন্ধান করে:
- কর্ম।
- ডেটা (URI এবং ডেটা টাইপ উভয়ই)।
- বিভাগ।
নিম্নলিখিত বিভাগগুলিতে বর্ণনা করা হয়েছে যে কীভাবে একটি অ্যাপের ম্যানিফেস্ট ফাইলে ইন্টেন্ট ফিল্টার ঘোষণা অনুসারে উপযুক্ত উপাদানগুলির সাথে ইন্টেন্টগুলি মিলিত হয়।
অ্যাকশন পরীক্ষা
গৃহীত ইন্টেন্ট অ্যাকশন নির্দিষ্ট করার জন্য, একটি ইন্টেন্ট ফিল্টার শূন্য বা তার বেশি <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>
For an intent to pass the category test, every category in the Intent must match a category in the filter. The reverse is not necessary—the intent filter may declare more categories than are specified in the Intent and the Intent still passes. Therefore, an intent with no categories always passes this test, regardless of what categories are declared in the filter.
Note: Android automatically applies the CATEGORY_DEFAULT category to all implicit intents passed to startActivity() and startActivityForResult() . If you want your activity to receive implicit intents, it must include a category for "android.intent.category.DEFAULT" in its intent filters, as shown in the previous <intent-filter> example.
Data test
To specify accepted intent data, an intent filter can declare zero or more <data> elements, as shown in the following example:
<intent-filter> <data android:mimeType="video/mpeg" android:scheme="http" ... /> <data android:mimeType="audio/mpeg" android:scheme="http" ... /> ... </intent-filter>
Each <data> element can specify a URI structure and a data type (MIME media type). Each part of the URI is a separate attribute: scheme , host , port , and path :
<scheme>://<host>:<port>/<path>
The following example shows possible values for these attributes:
content://com.example.project:200/folder/subfolder/etc
In this URI, the scheme is content , the host is com.example.project , the port is 200 , and the path is folder/subfolder/etc .
Each of these attributes is optional in a <data> element, but there are linear dependencies:
- If a scheme is not specified, the host is ignored.
- If a host is not specified, the port is ignored.
- If both the scheme and host are not specified, the path is ignored.
When the URI in an intent is compared to a URI specification in a filter, it's compared only to the parts of the URI included in the filter. For example:
- If a filter specifies only a scheme, all URIs with that scheme match the filter.
- If a filter specifies a scheme and an authority but no path, all URIs with the same scheme and authority pass the filter, regardless of their paths.
- If a filter specifies a scheme, an authority, and a path, only URIs with the same scheme, authority, and path pass the filter.
Note: A path specification can contain a wildcard asterisk (*) to require only a partial match of the path name.
The data test compares both the URI and the MIME type in the intent to a URI and MIME type specified in the filter. The rules are as follows:
- An intent that contains neither a URI nor a MIME type passes the test only if the filter does not specify any URIs or MIME types.
- An intent that contains a URI but no MIME type (neither explicit nor inferable from the URI) passes the test only if its URI matches the filter's URI format and the filter likewise does not specify a MIME type.
- An intent that contains a MIME type but not a URI passes the test only if the filter lists the same MIME type and does not specify a URI format.
- An intent that contains both a URI and a MIME type (either explicit or inferable from the URI) passes the MIME type part of the test only if that type matches a type listed in the filter. It passes the URI part of the test either if its URI matches a URI in the filter or if it has a
content:orfile:URI and the filter does not specify a URI. In other words, a component is presumed to supportcontent:andfile:data if its filter lists only a MIME type.
Note: If an intent specifies a URI or MIME type, the data test will fail if there are no <data> elements in the <intent-filter> .
This last rule, rule (d), reflects the expectation that components are able to get local data from a file or content provider. Therefore, their filters can list just a data type and don't need to explicitly name the content: and file: schemes. The following example shows a typical case in which a <data> element tells Android that the component can get image data from a content provider and display it:
<intent-filter> <data android:mimeType="image/*" /> ... </intent-filter>
Filters that specify a data type but not a URI are perhaps the most common because most available data is dispensed by content providers.
Another common configuration is a filter with a scheme and a data type. For example, a <data> element like the following tells Android that the component can retrieve video data from the network in order to perform the action:
<intent-filter> <data android:scheme="http" android:mimeType="video/*" /> ... </intent-filter>
Intent matching
Intents are matched against intent filters not only to discover a target component to activate, but also to discover something about the set of components on the device. For example, the Home app populates the app launcher by finding all the activities with intent filters that specify the ACTION_MAIN action and CATEGORY_LAUNCHER category. A match is only successful if the actions and categories in the Intent match against the filter, as described in the documentation for the IntentFilter class.
Your application can use intent matching in a manner similar to what the Home app does. The PackageManager has a set of query...() methods that return all components that can accept a particular intent and a similar series of resolve...() methods that determine the best component to respond to an intent. For example, queryIntentActivities() returns a list of all activities that can perform the intent passed as an argument, and queryIntentServices() returns a similar list of services. Neither method activates the components; they just list the ones that can respond. There's a similar method, queryBroadcastReceivers() , for broadcast receivers.