একটি 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 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 এ দেখানো হয়েছে, যাতে ব্যবহারকারী কোন অ্যাপটি ব্যবহার করবেন তা চয়ন করতে পারেন।
অন্যান্য অ্যাপ চালু করার বিষয়ে আরও তথ্য ব্যবহারকারীকে অন্য অ্যাপে পাঠানোর গাইডে দেওয়া আছে।

চিত্র 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) এবং উচ্চতর একটি ডিবাগিং বৈশিষ্ট্য প্রদান করে যা আপনাকে সতর্ক করে যদি আপনার অ্যাপ কোনো উদ্দেশ্যের অনিরাপদ লঞ্চ করে। উদাহরণস্বরূপ, আপনার অ্যাপ একটি নেস্টেড অভিপ্রায়ের একটি অনিরাপদ লঞ্চ করতে পারে, যা একটি অভিপ্রায় যা অন্য অভিপ্রায়ে অতিরিক্ত হিসাবে পাস করা হয়।
যদি আপনার অ্যাপ নিম্নলিখিত দুটি ক্রিয়া সম্পাদন করে, তবে সিস্টেমটি একটি অনিরাপদ অভিপ্রায় লঞ্চ শনাক্ত করে এবং একটি কঠোর মোড লঙ্ঘন ঘটে:
- আপনার অ্যাপটি ডেলিভার করা অভিপ্রায়ের অতিরিক্ত থেকে একটি নেস্টেড অভিপ্রায়কে আনপার্সেল করে।
- আপনার অ্যাপ অবিলম্বে সেই নেস্টেড অভিপ্রায় ব্যবহার করে একটি অ্যাপ কম্পোনেন্ট শুরু করে, যেমন
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-এর চিত্রটি দেখায় যে কীভাবে সিস্টেমটি আপনার (ক্লায়েন্ট) অ্যাপ থেকে অন্য (পরিষেবা) অ্যাপে নিয়ন্ত্রণ পাস করে এবং আপনার অ্যাপে ফিরে আসে:
- আপনার অ্যাপটি এমন একটি অভিপ্রায় তৈরি করে যা অন্য অ্যাপে একটি ক্রিয়াকলাপ আহ্বান করে। সেই অভিপ্রায়ের মধ্যে, আপনি অতিরিক্ত হিসাবে একটি
PendingIntent
অবজেক্ট যোগ করুন। এই অমীমাংসিত অভিপ্রায় আপনার অ্যাপে একটি উপাদান আহ্বান করে; এই উপাদান রপ্তানি করা হয় না. - আপনার অ্যাপের অভিপ্রায় প্রাপ্তির পরে, অন্য অ্যাপটি নেস্ট করা
PendingIntent
অবজেক্টটি বের করে। - অন্য অ্যাপটি
PendingIntent
অবজেক্টেsend()
পদ্ধতি ব্যবহার করে। - আপনার অ্যাপে নিয়ন্ত্রণ ফেরত দেওয়ার পরে, সিস্টেমটি আপনার অ্যাপের প্রসঙ্গ ব্যবহার করে মুলতুবি অভিপ্রায় আহ্বান করে।
চিত্র 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:sharedUserId
এandroid.uid.system
সেট করে৷ - মূল থেকে উদ্ভূত অভিপ্রায়।
অভিপ্রায় ম্যাচিং সম্পর্কে আরও জানুন।
একটি মুলতুবি অভিপ্রায় ব্যবহার করে
একটি PendingIntent
অবজেক্ট হল একটি Intent
অবজেক্টের চারপাশে একটি মোড়ক। একটি PendingIntent
এর প্রাথমিক উদ্দেশ্য হল একটি বিদেশী অ্যাপ্লিকেশনকে Intent
ব্যবহার করার অনুমতি দেওয়া যাতে এটি আপনার অ্যাপের নিজস্ব প্রক্রিয়া থেকে সম্পাদিত হয়।
একটি মুলতুবি অভিপ্রায় জন্য প্রধান ব্যবহারের ক্ষেত্রে নিম্নলিখিত অন্তর্ভুক্ত:
- যখন ব্যবহারকারী আপনার বিজ্ঞপ্তির সাথে একটি ক্রিয়া সম্পাদন করে তখন একটি অভিপ্রায় কার্যকর করার ঘোষণা করা (অ্যান্ড্রয়েড সিস্টেমের
NotificationManager
Intent
কার্যকর করে)। - ব্যবহারকারী যখন আপনার অ্যাপ উইজেট (হোম স্ক্রীন অ্যাপটি
Intent
কার্যকর করে) দিয়ে একটি ক্রিয়া সম্পাদন করে তখন একটি অভিপ্রায় কার্যকর করার ঘোষণা করা। - একটি নির্দিষ্ট ভবিষ্যত সময়ে সম্পাদিত হওয়ার অভিপ্রায় ঘোষণা করা (অ্যান্ড্রয়েড সিস্টেমের
AlarmManager
Intent
কার্যকর করে)।
যেভাবে প্রতিটি Intent
অবজেক্টকে একটি নির্দিষ্ট ধরনের অ্যাপ কম্পোনেন্ট (হয় একটি Activity
, একটি Service
বা একটি BroadcastReceiver
) দ্বারা পরিচালনা করার জন্য ডিজাইন করা হয়েছে, তেমনি একই বিবেচনায় একটি PendingIntent
তৈরি করতে হবে। একটি মুলতুবি অভিপ্রায় ব্যবহার করার সময়, আপনার অ্যাপ startActivity()
এর মতো কলের মাধ্যমে অভিপ্রায়টি কার্যকর করে না। পরিবর্তে, আপনি যখন সংশ্লিষ্ট নির্মাতা পদ্ধতিতে কল করে PendingIntent
তৈরি করবেন তখন আপনাকে অবশ্যই উদ্দিষ্ট উপাদানের প্রকার ঘোষণা করতে হবে:
-
PendingIntent.getActivity()
একটিIntent
জন্য যা একটিActivity
শুরু করে। -
PendingIntent.getService()
একটিIntent
জন্য যা একটিService
শুরু করে। -
PendingIntent.getBroadcast()
একটিIntent
জন্য যা একটিBroadcastReceiver
শুরু করে।
আপনার অ্যাপটি অন্যান্য অ্যাপ থেকে পেন্ডিং ইনটেন্ট না পেলে , একটি 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
আহ্বান করে এবং আপনার অ্যাপে নিয়ন্ত্রণ ফিরিয়ে দেয়, আপনার অ্যাপের একই উপাদান সবসময় শুরু হয়।
মুলতুবি অভিপ্রায়ের মধ্যে স্পষ্ট অভিপ্রায় ব্যবহার করুন
অন্যান্য অ্যাপগুলি কীভাবে আপনার অ্যাপের মুলতুবি থাকা অভিপ্রায়গুলি ব্যবহার করতে পারে তা আরও ভালভাবে সংজ্ঞায়িত করতে, সর্বদা একটি সুস্পষ্ট অভিপ্রায়ের চারপাশে একটি মুলতুবি অভিপ্রায়কে মোড়ানো করুন৷ এই সর্বোত্তম অনুশীলন অনুসরণ করতে সাহায্য করার জন্য, নিম্নলিখিতগুলি করুন:
- বেস ইন্টেন্টের অ্যাকশন, প্যাকেজ এবং কম্পোনেন্ট ফিল্ড সেট করা আছে কিনা চেক করুন।
মুলতুবি অভিপ্রায় তৈরি করতে
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()
এ পাস করা সমস্ত অন্তর্নিহিত অভিপ্রায়গুলিতে CATEGORY_DEFAULT
বিভাগটি প্রয়োগ করে। আপনি যদি চান যে আপনার ক্রিয়াকলাপটি অন্তর্নিহিত উদ্দেশ্যগুলি পেতে পারে তবে এটি অবশ্যই পূর্ববর্তী <intent-filter>
উদাহরণে দেখানো হয়েছে, এর অভিপ্রায় ফিল্টারগুলিতে "android.intent.category.DEFAULT"
এর জন্য একটি বিভাগ অন্তর্ভুক্ত করতে হবে।
ডেটা পরীক্ষা
স্বীকৃত অভিপ্রায় ডেটা নির্দিষ্ট করতে, একটি অভিপ্রায় ফিল্টার শূন্য বা আরও <data>
উপাদানগুলি ঘোষণা করতে পারে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
<intent-filter> <data android:mimeType="video/mpeg" android:scheme="http" ... /> <data android:mimeType="audio/mpeg" android:scheme="http" ... /> ... </intent-filter>
প্রতিটি <data>
উপাদান একটি ইউআরআই কাঠামো এবং একটি ডেটা টাইপ (মাইম মিডিয়া টাইপ) নির্দিষ্ট করতে পারে। ইউআরআইয়ের প্রতিটি অংশ একটি পৃথক বৈশিষ্ট্য: scheme
, host
, port
এবং path
:
<scheme>://<host>:<port>/<path>
নিম্নলিখিত উদাহরণগুলি এই বৈশিষ্ট্যগুলির জন্য সম্ভাব্য মানগুলি দেখায়:
content://com.example.project:200/folder/subfolder/etc
এই ইউআরআই -তে, স্কিমটি content
, হোস্টটি com.example.project
, বন্দরটি 200
, এবং পথটি folder/subfolder/etc
।
এই বৈশিষ্ট্যগুলির প্রতিটি একটি <data>
উপাদানটিতে al চ্ছিক, তবে লিনিয়ার নির্ভরতা রয়েছে:
- যদি কোনও স্কিম নির্দিষ্ট না করা হয় তবে হোস্টকে উপেক্ষা করা হয়।
- যদি কোনও হোস্ট নির্দিষ্ট না করা হয় তবে বন্দরটি উপেক্ষা করা হবে।
- যদি স্কিম এবং হোস্ট উভয়ই নির্দিষ্ট না করা হয় তবে পথটি উপেক্ষা করা হয়।
যখন কোনও অভিপ্রায় ইউআরআই কোনও ফিল্টারে ইউআরআই স্পেসিফিকেশনের সাথে তুলনা করা হয়, তখন এটি কেবল ফিল্টারটিতে অন্তর্ভুক্ত ইউআরআইয়ের অংশগুলির সাথে তুলনা করা হয়। যেমন:
- যদি কোনও ফিল্টার কেবল একটি স্কিম নির্দিষ্ট করে তবে সেই স্কিম সহ সমস্ত ইউআরআই ফিল্টারটির সাথে মেলে।
- যদি কোনও ফিল্টার কোনও স্কিম এবং কোনও কর্তৃপক্ষ নির্দিষ্ট করে তবে কোনও পথ নির্দিষ্ট করে তবে একই স্কিম এবং কর্তৃপক্ষের সমস্ত ইউআরআই তাদের পথ নির্বিশেষে ফিল্টারটি পাস করে।
- যদি কোনও ফিল্টার কোনও স্কিম, একটি কর্তৃপক্ষ এবং একটি পাথ নির্দিষ্ট করে তবে কেবল একই স্কিম, কর্তৃপক্ষ এবং পাথ সহ কেবল ইউআরআইগুলি ফিল্টারটি পাস করে।
দ্রষ্টব্য: একটি পাথ স্পেসিফিকেশনে একটি ওয়াইল্ডকার্ড তারকা (*) থাকতে পারে যাতে পাথের নামের কেবল একটি আংশিক মিলের প্রয়োজন হয়।
ডেটা টেস্টটি ইউআরআই এবং মাইম টাইপ উভয়ের সাথেই ফিল্টারে নির্দিষ্ট করা ইউআরআই এবং মাইম টাইপের সাথে তুলনা করে। নিয়মগুলি নিম্নরূপ:
- ফিল্টারটি কোনও ইউআরআই বা মাইম প্রকার নির্দিষ্ট না করে কেবল তখনই ইউআরআই বা মাইম টাইপ না করে এমন একটি উদ্দেশ্য পরীক্ষায় পাস করে না।
- এমন একটি অভিপ্রায় যা একটি ইউআরআই থাকে তবে কোনও মাইম টাইপ নেই (ইউআরআই থেকে সুস্পষ্ট বা অনুমানযোগ্য নয়) কেবল তখনই পরীক্ষায় উত্তীর্ণ হয় যখন তার ইউআরআই ফিল্টারটির ইউআরআই ফর্ম্যাটের সাথে মেলে এবং ফিল্টারটি একইভাবে কোনও মাইম টাইপ নির্দিষ্ট করে না।
- এমন একটি উদ্দেশ্য যা একটি মাইম টাইপ ধারণ করে তবে কোনও ইউআরআই পরীক্ষায় পাস করে কেবল তখনই ফিল্টার একই মাইম টাইপের তালিকাভুক্ত করে এবং একটি ইউআরআই ফর্ম্যাট নির্দিষ্ট না করে।
- একটি অভিপ্রায় যা একটি ইউআরআই এবং একটি মাইম টাইপ উভয়ই থাকে (ইউআরআই থেকে সুস্পষ্ট বা নির্ধারিত হয়) কেবলমাত্র পরীক্ষার মাইম টাইপ অংশটি পাস করে কেবলমাত্র যদি সেই ধরণের ফিল্টারে তালিকাভুক্ত কোনও ধরণের সাথে মেলে। এটি পরীক্ষার ইউআরআই অংশটি পাস করে যদি এর ইউআরআই ফিল্টারটিতে কোনও ইউআরআইয়ের সাথে মেলে বা এতে কোনও
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()
অনুরূপ একটি পদ্ধতি রয়েছে।
একটি Intent
একটি মেসেজিং অবজেক্ট যা আপনি অন্য অ্যাপ্লিকেশন উপাদান থেকে কোনও ক্রিয়াকলাপের জন্য অনুরোধ করতে ব্যবহার করতে পারেন। যদিও উদ্দেশ্যগুলি বিভিন্ন উপায়ে উপাদানগুলির মধ্যে যোগাযোগের সুবিধার্থে, তিনটি মৌলিক ব্যবহারের ক্ষেত্রে রয়েছে:
- একটি ক্রিয়াকলাপ শুরু
একটি
Activity
একটি অ্যাপ্লিকেশন একটি একক স্ক্রিন প্রতিনিধিত্ব করে। আপনিstartActivity()
এরIntent
পাস করে কোনওActivity
একটি নতুন উদাহরণ শুরু করতে পারেন।Intent
শুরু করার জন্য ক্রিয়াকলাপটি বর্ণনা করে এবং কোনও প্রয়োজনীয় ডেটা বহন করে।আপনি যদি ক্রিয়াকলাপটি শেষ হয়ে গেলে কোনও ফলাফল পেতে চান তবে
startActivityForResult()
কল করুন। আপনার ক্রিয়াকলাপটি আপনার ক্রিয়াকলাপেরonActivityResult()
কলব্যাকের একটি পৃথকIntent
অবজেক্ট হিসাবে ফলাফল গ্রহণ করে। আরও তথ্যের জন্য, ক্রিয়াকলাপ গাইড দেখুন। - একটি পরিষেবা শুরু করা হচ্ছে
একটি
Service
এমন একটি উপাদান যা কোনও ব্যবহারকারী ইন্টারফেস ছাড়াই পটভূমিতে অপারেশন সম্পাদন করে। অ্যান্ড্রয়েড 5.0 (এপিআই স্তর 21) সহ এবং পরে, আপনিJobScheduler
দিয়ে একটি পরিষেবা শুরু করতে পারেন।JobScheduler
সম্পর্কে আরও তথ্যের জন্য, এরAPI-reference documentation
দেখুন।অ্যান্ড্রয়েড 5.0 (এপিআই স্তর 21) এর আগে সংস্করণগুলির জন্য, আপনি
Service
শ্রেণীর পদ্ধতি ব্যবহার করে একটি পরিষেবা শুরু করতে পারেন। আপনি এককালীন অপারেশন (যেমন কোনও ফাইল ডাউনলোড করা) শুরু করার জন্য একটি পরিষেবা শুরু করতে পারেন () শুরুতে একটিIntent
পাস করেstartService()
।Intent
পরিষেবাটি শুরু করার জন্য বর্ণনা করে এবং কোনও প্রয়োজনীয় ডেটা বহন করে।যদি পরিষেবাটি ক্লায়েন্ট-সার্ভার ইন্টারফেসের সাথে ডিজাইন করা হয় তবে আপনি
bindService()
এরIntent
পাস করে অন্য উপাদান থেকে পরিষেবাটিতে আবদ্ধ করতে পারেন। আরও তথ্যের জন্য, পরিষেবাদি গাইড দেখুন। - একটি সম্প্রচার বিতরণ
একটি সম্প্রচার একটি বার্তা যা কোনও অ্যাপ্লিকেশন পেতে পারে। সিস্টেমটি সিস্টেম ইভেন্টগুলির জন্য বিভিন্ন সম্প্রচার সরবরাহ করে, যেমন সিস্টেম বুট আপ বা ডিভাইস চার্জিং শুরু করে। আপনি
sendBroadcast()
বাsendOrderedBroadcast()
এরIntent
পাস করে অন্যান্য অ্যাপ্লিকেশনগুলিতে একটি সম্প্রচার সরবরাহ করতে পারেন।
এই পৃষ্ঠার বাকি অংশগুলি ব্যাখ্যা করে যে কীভাবে উদ্দেশ্যগুলি কাজ করে এবং কীভাবে সেগুলি ব্যবহার করবেন। সম্পর্কিত তথ্যের জন্য, অন্যান্য অ্যাপ্লিকেশনগুলির সাথে ইন্টারঅ্যাক্ট করা এবং সামগ্রী ভাগ করে নেওয়া দেখুন।
অভিপ্রায় প্রকার
দুটি ধরণের অভিপ্রায় রয়েছে:
- সুস্পষ্ট অভিপ্রায়গুলি নির্দিষ্ট করে কোন উপাদানটির কোন উপাদানটি একটি সম্পূর্ণ
ComponentName
নির্দিষ্ট করে উদ্দেশ্যটি পূরণ করবে। আপনি সাধারণত নিজের অ্যাপ্লিকেশনটিতে একটি উপাদান শুরু করার জন্য একটি সুস্পষ্ট অভিপ্রায় ব্যবহার করবেন, কারণ আপনি যে ক্রিয়াকলাপ বা পরিষেবা শুরু করতে চান তার শ্রেণীর নাম আপনি জানেন। উদাহরণস্বরূপ, আপনি ব্যবহারকারীর ক্রিয়াকলাপের প্রতিক্রিয়া হিসাবে আপনার অ্যাপের মধ্যে একটি নতুন কার্যকলাপ শুরু করতে পারেন বা পটভূমিতে একটি ফাইল ডাউনলোড করার জন্য একটি পরিষেবা শুরু করতে পারেন। - অন্তর্নিহিত উদ্দেশ্যগুলি একটি নির্দিষ্ট উপাদানটির নাম দেয় না, তবে পরিবর্তে সম্পাদন করার জন্য একটি সাধারণ ক্রিয়া ঘোষণা করে, যা অন্য অ্যাপ্লিকেশন থেকে একটি উপাদান এটি পরিচালনা করতে দেয়। উদাহরণস্বরূপ, আপনি যদি কোনও মানচিত্রে ব্যবহারকারীকে কোনও অবস্থান দেখাতে চান তবে আপনি অন্য কোনও সক্ষম অ্যাপ্লিকেশনটিকে মানচিত্রে একটি নির্দিষ্ট অবস্থান প্রদর্শন করার জন্য অনুরোধ করার জন্য একটি অন্তর্নিহিত অভিপ্রায় ব্যবহার করতে পারেন।
চিত্র 1 দেখায় যে কোনও ক্রিয়াকলাপ শুরু করার সময় কীভাবে একটি অভিপ্রায় ব্যবহার করা হয়। যখন Intent
অবজেক্টটি একটি নির্দিষ্ট ক্রিয়াকলাপের উপাদানকে স্পষ্টভাবে নাম দেয়, সিস্টেমটি তাত্ক্ষণিকভাবে সেই উপাদানটি শুরু করে।

চিত্র 1। সিস্টেমের মাধ্যমে অন্য ক্রিয়াকলাপ শুরু করার জন্য কীভাবে একটি অন্তর্নিহিত অভিপ্রায় সরবরাহ করা হয়: [1] ক্রিয়াকলাপ একটি ক্রিয়া বিবরণ সহ একটি Intent
তৈরি করে এবং এটি startActivity()
এ পাস করে। [২] অ্যান্ড্রয়েড সিস্টেমটি অভিপ্রায়টির সাথে মেলে এমন একটি অভিপ্রায় ফিল্টারটির জন্য সমস্ত অ্যাপ্লিকেশন অনুসন্ধান করে। যখন কোনও ম্যাচ পাওয়া যায়, [3] সিস্টেমটি তার onCreate()
পদ্ধতিটি অনুরোধ করে এবং এটিকে Intent
পাস করে ম্যাচিং ক্রিয়াকলাপ ( ক্রিয়াকলাপ বি ) শুরু করে।
আপনি যখন একটি অন্তর্নিহিত অভিপ্রায় ব্যবহার করেন, অ্যান্ড্রয়েড সিস্টেমটি ডিভাইসে অন্যান্য অ্যাপ্লিকেশনগুলির ম্যানিফেস্ট ফাইলে ঘোষিত অভিপ্রায় ফিল্টারগুলির সাথে উদ্দেশ্যটির সামগ্রীর তুলনা করে শুরু করার জন্য উপযুক্ত উপাদানটি সন্ধান করে। যদি অভিপ্রায়টি কোনও অভিপ্রায় ফিল্টারের সাথে মেলে তবে সিস্টেমটি সেই উপাদানটি শুরু করে এবং এটিকে Intent
সরবরাহ করে। যদি একাধিক অভিপ্রায় ফিল্টার সামঞ্জস্যপূর্ণ হয় তবে সিস্টেমটি একটি ডায়ালগ প্রদর্শন করে যাতে ব্যবহারকারী কোন অ্যাপ্লিকেশনটি ব্যবহার করতে পারে তা চয়ন করতে পারে।
একটি অভিপ্রায় ফিল্টার একটি অ্যাপের ম্যানিফেস্ট ফাইলের একটি অভিব্যক্তি যা উপাদানটি গ্রহণ করতে চায় এমন ধরণের উদ্দেশ্যগুলি নির্দিষ্ট করে। উদাহরণস্বরূপ, কোনও ক্রিয়াকলাপের জন্য একটি অভিপ্রায় ফিল্টার ঘোষণা করে, আপনি অন্যান্য অ্যাপ্লিকেশনগুলির পক্ষে নির্দিষ্ট ধরণের অভিপ্রায় দিয়ে সরাসরি আপনার ক্রিয়াকলাপ শুরু করা সম্ভব করে তোলে। তেমনিভাবে, আপনি যদি কোনও ক্রিয়াকলাপের জন্য কোনও অভিপ্রায় ফিল্টার ঘোষণা না করেন তবে এটি কেবল একটি সুস্পষ্ট অভিপ্রায় দিয়েই শুরু করা যেতে পারে।
সতর্কতা: আপনার অ্যাপ্লিকেশনটি সুরক্ষিত কিনা তা নিশ্চিত করার জন্য, কোনও Service
শুরু করার সময় সর্বদা একটি সুস্পষ্ট অভিপ্রায় ব্যবহার করুন এবং আপনার পরিষেবার জন্য অভিপ্রায় ফিল্টার ঘোষণা করবেন না। কোনও পরিষেবা শুরু করার জন্য একটি অন্তর্নিহিত অভিপ্রায় ব্যবহার করা একটি সুরক্ষা বিপত্তি কারণ আপনি কোন পরিষেবাটি অভিপ্রায়টির প্রতিক্রিয়া জানাবেন তা আপনি নিশ্চিত হতে পারবেন না এবং ব্যবহারকারী কোন পরিষেবাটি শুরু হয় তা দেখতে পাচ্ছেন না। অ্যান্ড্রয়েড 5.0 (এপিআই স্তর 21) দিয়ে শুরু করে, আপনি যদি একটি অন্তর্নিহিত অভিপ্রায় সহ bindService()
কল করেন তবে সিস্টেমটি একটি ব্যতিক্রম ছুঁড়ে দেয়।
একটি অভিপ্রায় তৈরি
একটি Intent
অবজেক্টের তথ্য বহন করে যা অ্যান্ড্রয়েড সিস্টেমটি কোন উপাদানটি শুরু করতে হবে তা নির্ধারণ করতে ব্যবহার করে (যেমন সঠিক উপাদানটির নাম বা উপাদান বিভাগ যা অভিপ্রায় গ্রহণ করা উচিত), পাশাপাশি প্রাপক উপাদানটি যথাযথভাবে ক্রিয়াটি সম্পাদন করার জন্য ব্যবহার করে এমন তথ্য (যেমন গ্রহণের জন্য অ্যাকশন এবং ডেটা করার জন্য ডেটা)।
একটি Intent
অন্তর্ভুক্ত প্রাথমিক তথ্য নিম্নলিখিত:
- উপাদানের নাম
- শুরু করার জন্য উপাদানটির নাম।
এটি al চ্ছিক, তবে এটি তথ্যের সমালোচনামূলক অংশ যা একটি উদ্দেশ্যকে সুস্পষ্ট করে তোলে, যার অর্থ উদ্দেশ্যটি কেবলমাত্র উপাদানটির নাম দ্বারা সংজ্ঞায়িত অ্যাপ্লিকেশন উপাদানটিতে সরবরাহ করা উচিত। কোনও উপাদান নাম ব্যতীত, উদ্দেশ্যটি অন্তর্নিহিত এবং সিস্টেমটি সিদ্ধান্ত নেয় যে কোন উপাদানটি অন্যান্য অভিপ্রায় তথ্যের উপর ভিত্তি করে উদ্দেশ্যটি গ্রহণ করা উচিত (যেমন ক্রিয়া, ডেটা এবং বিভাগ - নীচে বর্ণিত)। আপনার যদি আপনার অ্যাপ্লিকেশনটিতে একটি নির্দিষ্ট উপাদান শুরু করতে হয় তবে আপনার উপাদানটির নাম নির্দিষ্ট করা উচিত।
দ্রষ্টব্য: কোনও
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
অবজেক্ট) যা ডেটা এবং/অথবা সেই ডেটার মাইম টাইপের জন্য ডেটা উল্লেখ করে। সরবরাহ করা ডেটা ধরণের সাধারণত অভিপ্রায়টির ক্রিয়া দ্বারা নির্ধারিত হয়। উদাহরণস্বরূপ, যদি ক্রিয়াটিACTION_EDIT
হয় তবে ডেটা সম্পাদনা করার জন্য ডকুমেন্টের ইউআরআই থাকতে হবে।একটি উদ্দেশ্য তৈরি করার সময়, প্রায়শই তার ইউআরআই ছাড়াও ডেটা (এর মাইম টাইপ) নির্দিষ্ট করা গুরুত্বপূর্ণ। উদাহরণস্বরূপ, এমন একটি ক্রিয়াকলাপ যা চিত্রগুলি প্রদর্শন করতে সক্ষম হয় সম্ভবত ইউআরআই ফর্ম্যাটগুলি একই রকম হতে পারে, যদিও কোনও অডিও ফাইল খেলতে সক্ষম হবে না। আপনার ডেটার মাইম প্রকারটি নির্দিষ্ট করে অ্যান্ড্রয়েড সিস্টেমকে আপনার উদ্দেশ্যটি পাওয়ার জন্য সেরা উপাদানটি খুঁজে পেতে সহায়তা করে। যাইহোক, মাইম টাইপটি কখনও কখনও ইউআরআই থেকে অনুমান করা যায় - বিশেষত যখন ডেটা কোনও
content:
ইউআরআই। একটিcontent:
ইউআরআই নির্দেশ করে যে ডেটা ডিভাইসে অবস্থিত এবং কোনওContentProvider
দ্বারা নিয়ন্ত্রিত, যা ডেটা মাইম টাইপকে সিস্টেমে দৃশ্যমান করে তোলে।কেবলমাত্র ইউআরআই ডেটা সেট করতে
setData()
কল করুন। কেবল মাইম টাইপ সেট করতে,setType()
কল করুন। যদি প্রয়োজন হয় তবে আপনি উভয়setDataAndType()
দিয়ে স্পষ্টভাবে সেট করতে পারেন।সতর্কতা: আপনি যদি ইউআরআই এবং মাইম উভয় প্রকার সেট করতে চান তবে
setData()
এবংsetType()
কল করবেন না কারণ তারা প্রত্যেকে অন্যের মান বাতিল করে দেয়। ইউআরআই এবং মাইম উভয় প্রকার সেট করতে সর্বদাsetDataAndType()
ব্যবহার করুন। - শ্রেণী
- উদ্দেশ্যটি পরিচালনা করা উচিত এমন ধরণের উপাদান সম্পর্কে অতিরিক্ত তথ্যযুক্ত একটি স্ট্রিং। যে কোনও সংখ্যক বিভাগের বিবরণ একটি অভিপ্রায় স্থাপন করা যেতে পারে, তবে বেশিরভাগ অভিপ্রায়গুলির জন্য কোনও বিভাগের প্রয়োজন হয় না। এখানে কিছু সাধারণ বিভাগ আছে:
-
CATEGORY_BROWSABLE
- লক্ষ্য ক্রিয়াকলাপটি কোনও ওয়েব ব্রাউজার দ্বারা কোনও লিঙ্ক দ্বারা রেফারেন্সযুক্ত ডেটা যেমন কোনও চিত্র বা ইমেল বার্তার মতো প্রদর্শন করতে শুরু করার অনুমতি দেয়।
-
CATEGORY_LAUNCHER
- ক্রিয়াকলাপটি কোনও কাজের প্রাথমিক ক্রিয়াকলাপ এবং এটি সিস্টেমের অ্যাপ্লিকেশন লঞ্চারে তালিকাভুক্ত।
বিভাগগুলির সম্পূর্ণ তালিকার জন্য
Intent
শ্রেণীর বিবরণ দেখুন।আপনি
addCategory()
দিয়ে একটি বিভাগ নির্দিষ্ট করতে পারেন। -
উপরে তালিকাভুক্ত এই বৈশিষ্ট্যগুলি (উপাদানটির নাম, ক্রিয়া, ডেটা এবং বিভাগ) একটি উদ্দেশ্যটির সংজ্ঞায়িত বৈশিষ্ট্যগুলি উপস্থাপন করে। এই বৈশিষ্ট্যগুলি পড়ে, অ্যান্ড্রয়েড সিস্টেমটি কোন অ্যাপ্লিকেশন উপাদানটি শুরু করা উচিত তা সমাধান করতে সক্ষম। যাইহোক, একটি উদ্দেশ্য অতিরিক্ত তথ্য বহন করতে পারে যা এটি কোনও অ্যাপ্লিকেশন উপাদানটিতে কীভাবে সমাধান করা হয় তা প্রভাবিত করে না। একটি উদ্দেশ্য নিম্নলিখিত তথ্য সরবরাহ করতে পারে:
- অতিরিক্ত
- অনুরোধ করা ক্রিয়াটি সম্পাদন করার জন্য প্রয়োজনীয় অতিরিক্ত তথ্য বহনকারী কী-মান জোড়া। কিছু ক্রিয়া যেমন নির্দিষ্ট ধরণের ডেটা ইউআরআই ব্যবহার করে তেমনি কিছু ক্রিয়াও নির্দিষ্ট অতিরিক্ত ব্যবহার করে।
আপনি বিভিন্ন
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
অবজেক্টের উপাদানটির নামটি সংজ্ঞায়িত করুন - অন্যান্য সমস্ত অভিপ্রায় বৈশিষ্ট্য al চ্ছিক।
উদাহরণস্বরূপ, আপনি যদি ওয়েব থেকে কোনও ফাইল ডাউনলোড করার জন্য ডিজাইন করা 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 -এ প্রদর্শিত একটি ডায়ালগ প্রদর্শন করে, যাতে ব্যবহারকারী কোন অ্যাপ্লিকেশনটি ব্যবহার করতে পারেন তা চয়ন করতে পারেন।
অন্যান্য অ্যাপ্লিকেশন চালু করার বিষয়ে আরও তথ্য ব্যবহারকারীকে অন্য অ্যাপ্লিকেশনটিতে প্রেরণ সম্পর্কে গাইডে সরবরাহ করা হয়।

চিত্র 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); }
অনিরাপদ অভিপ্রায় লঞ্চগুলি সনাক্ত করুন
আপনার অ্যাপ্লিকেশনটি আপনার অ্যাপের অভ্যন্তরের উপাদানগুলির মধ্যে নেভিগেট করতে বা অন্য অ্যাপের পক্ষে কোনও ক্রিয়া সম্পাদনের জন্য অভিপ্রায় চালু করতে পারে। প্ল্যাটফর্ম সুরক্ষা উন্নত করতে, অ্যান্ড্রয়েড 12 (এপিআই স্তর 31) এবং উচ্চতর একটি ডিবাগিং বৈশিষ্ট্য সরবরাহ করে যা আপনাকে সতর্ক করে দেয় যদি আপনার অ্যাপটি কোনও উদ্দেশ্যটির অনিরাপদ লঞ্চটি সম্পাদন করে। উদাহরণস্বরূপ, আপনার অ্যাপ্লিকেশনটি কোনও নেস্টেড ইন্টেন্টের একটি অনিরাপদ লঞ্চ করতে পারে, যা এমন একটি অভিপ্রায় যা অন্য অভিপ্রায় অতিরিক্ত হিসাবে পাস করা হয়।
যদি আপনার অ্যাপ্লিকেশন নিম্নলিখিত উভয় ক্রিয়াকলাপ সম্পাদন করে তবে সিস্টেমটি একটি অনিরাপদ অভিপ্রায় লঞ্চটি সনাক্ত করে এবং একটি কঠোরমোড লঙ্ঘন ঘটে:
- আপনার অ্যাপ্লিকেশনটি বিতরণ করা অভিপ্রায়ের অতিরিক্ত থেকে একটি নেস্টেড অভিপ্রায়কে ছড়িয়ে দেয়।
- আপনার অ্যাপ্লিকেশনটি তাত্ক্ষণিকভাবে সেই নেস্টেড অভিপ্রায়টি ব্যবহার করে একটি অ্যাপ্লিকেশন উপাদান শুরু করে, যেমন উদ্দেশ্যটি
startActivity()
,startService()
, বাbindService()
এর মধ্যে পাস করা।
কীভাবে এই পরিস্থিতি সনাক্ত করতে এবং আপনার অ্যাপ্লিকেশনটিতে পরিবর্তন আনতে হবে সে সম্পর্কে আরও তথ্যের জন্য, মিডিয়ামে অ্যান্ড্রয়েড নেস্টিং ইন্টেন্টস সম্পর্কে ব্লগ পোস্টটি পড়ুন।
অনিরাপদ অভিপ্রায় লঞ্চগুলির জন্য পরীক্ষা করুন
আপনার অ্যাপ্লিকেশনটিতে অনিরাপদ অভিপ্রায় লঞ্চগুলি যাচাই করতে, আপনি যখন আপনার VmPolicy
কনফিগার করেন তখন detectUnsafeIntentLaunch()
কল করুন, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে। যদি আপনার অ্যাপ্লিকেশনটি স্ট্রাইকমোড লঙ্ঘন সনাক্ত করে তবে আপনি সম্ভাব্য সংবেদনশীল তথ্য সুরক্ষার জন্য অ্যাপ এক্সিকিউশন বন্ধ করতে চাইতে পারেন।
কোটলিন
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 এর চিত্রটি দেখায় যে কীভাবে সিস্টেমটি আপনার (ক্লায়েন্ট) অ্যাপ্লিকেশন থেকে অন্য (পরিষেবা) অ্যাপ্লিকেশনটিতে নিয়ন্ত্রণ করে এবং আপনার অ্যাপ্লিকেশনটিতে ফিরে আসে:
- আপনার অ্যাপ্লিকেশনটি এমন একটি উদ্দেশ্য তৈরি করে যা অন্য অ্যাপ্লিকেশনটিতে কোনও ক্রিয়াকলাপের আহ্বান জানায়। সেই অভিপ্রায়টির মধ্যে, আপনি অতিরিক্ত হিসাবে একটি
PendingIntent
অবজেক্ট যুক্ত করুন। এই মুলতুবি অভিপ্রায়টি আপনার অ্যাপ্লিকেশনটিতে একটি উপাদানকে অনুরোধ করে; এই উপাদানটি রফতানি করা হয় না। - আপনার অ্যাপ্লিকেশনটির অভিপ্রায় পাওয়ার পরে, অন্যান্য অ্যাপ্লিকেশনটি নেস্টেড
PendingIntent
অবজেক্টটি বের করে। - অন্যান্য অ্যাপ্লিকেশনটি
PendingIntent
অবজেক্টেsend()
পদ্ধতিটি অনুরোধ করে। - আপনার অ্যাপ্লিকেশনটিতে নিয়ন্ত্রণটি ফেরত দেওয়ার পরে, সিস্টেমটি আপনার অ্যাপের প্রসঙ্গটি ব্যবহার করে মুলতুবি অভিপ্রায়টি অনুরোধ করে।
চিত্র 2। নেস্টেড মুলতুবি অভিপ্রায় ব্যবহার করার সময় আন্ত-অ্যাপ্লিকেশন যোগাযোগের চিত্র।
একটি অন্তর্নিহিত অভিপ্রায় প্রাপ্তি
আপনার অ্যাপ্লিকেশনটি কী কী অন্তর্নিহিত অভিপ্রায় গ্রহণ করতে পারে তা বিজ্ঞাপন দেওয়ার জন্য, আপনার ম্যানিফেস্ট ফাইলে একটি <intent-filter>
উপাদান সহ আপনার প্রতিটি অ্যাপ্লিকেশন উপাদানগুলির জন্য এক বা একাধিক অভিপ্রায় ফিল্টার ঘোষণা করুন। প্রতিটি অভিপ্রায় ফিল্টার অভিপ্রায়টির ক্রিয়া, ডেটা এবং বিভাগের ভিত্তিতে এটি গ্রহণ করে এমন উদ্দেশ্যগুলির ধরণ নির্দিষ্ট করে। সিস্টেমটি আপনার অ্যাপ্লিকেশন উপাদানটিতে একটি অন্তর্নিহিত অভিপ্রায় সরবরাহ করে কেবলমাত্র যদি উদ্দেশ্যটি আপনার কোনও উদ্দেশ্য ফিল্টারগুলির মধ্য দিয়ে যেতে পারে।
দ্রষ্টব্য: উপাদানটি ঘোষণা করে এমন কোনও উদ্দেশ্য ফিল্টার নির্বিশেষে একটি সুস্পষ্ট অভিপ্রায় সর্বদা তার লক্ষ্যে সরবরাহ করা হয়।
একটি অ্যাপ্লিকেশন উপাদান এটি করতে পারে এমন প্রতিটি অনন্য কাজের জন্য পৃথক ফিল্টার ঘোষণা করা উচিত। উদাহরণস্বরূপ, একটি চিত্র গ্যালারী অ্যাপের একটি ক্রিয়াকলাপে দুটি ফিল্টার থাকতে পারে: একটি চিত্র দেখার জন্য একটি ফিল্টার এবং একটি চিত্র সম্পাদনা করার জন্য অন্য একটি ফিল্টার। যখন ক্রিয়াকলাপটি শুরু হয়, এটি Intent
পরীক্ষা করে এবং Intent
তথ্যের উপর ভিত্তি করে কীভাবে আচরণ করবেন তা সিদ্ধান্ত নেয় (যেমন সম্পাদক নিয়ন্ত্রণগুলি দেখানো বা না দেখানো)।
প্রতিটি অভিপ্রায় ফিল্টারটি অ্যাপ্লিকেশনটির ম্যানিফেস্ট ফাইলে একটি <intent-filter>
উপাদান দ্বারা সংজ্ঞায়িত করা হয়, সংশ্লিষ্ট অ্যাপ্লিকেশন উপাদানটিতে বাসা করা (যেমন একটি <activity>
উপাদান)।
প্রতিটি অ্যাপ্লিকেশন উপাদানটিতে একটি <intent-filter>
উপাদান অন্তর্ভুক্ত রয়েছে, স্পষ্টভাবে android:exported
। এই বৈশিষ্ট্যটি নির্দেশ করে যে অ্যাপ্লিকেশন উপাদানটি অন্যান্য অ্যাপ্লিকেশনগুলিতে অ্যাক্সেসযোগ্য কিনা। কিছু পরিস্থিতিতে, যেমন ক্রিয়াকলাপ যাদের অভিপ্রায় ফিল্টারগুলি LAUNCHER
বিভাগ অন্তর্ভুক্ত করে, এই বৈশিষ্ট্যটিকে true
সেট করা দরকারী। অন্যথায়, এই বৈশিষ্ট্যটিকে false
হিসাবে সেট করা আরও নিরাপদ।
সতর্কতা: যদি আপনার অ্যাপ্লিকেশনটিতে কোনও ক্রিয়াকলাপ, পরিষেবা, বা সম্প্রচার রিসিভারটি ইনটেন্ট ফিল্টারগুলি ব্যবহার করে এবং android:exported
, আপনার অ্যাপ্লিকেশনটি অ্যান্ড্রয়েড 12 বা উচ্চতর চালিত কোনও ডিভাইসে ইনস্টল করা যাবে না।
<intent-filter>
ফিল্টার> এর অভ্যন্তরে, আপনি এই তিনটি উপাদানগুলির মধ্যে এক বা একাধিক ব্যবহার করে গ্রহণের জন্য উদ্দেশ্যগুলির ধরণটি নির্দিষ্ট করতে পারেন:
-
<action>
-
name
বৈশিষ্ট্য হিসাবে স্বীকৃত অভিপ্রায় ক্রিয়া ঘোষণা করে। মানটি অবশ্যই কোনও ক্রিয়াকলাপের আক্ষরিক স্ট্রিং মান হতে হবে, শ্রেণি ধ্রুবক নয়। -
<data>
- এক বা একাধিক বৈশিষ্ট্য ব্যবহার করে যা ডেটা ইউআরআই (
scheme
,host
,port
,path
) এবং মাইম টাইপের বিভিন্ন দিক নির্দিষ্ট করে তা ব্যবহার করে স্বীকৃত ডেটাগুলির ধরণ ঘোষণা করে। -
<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>
এর একাধিক উদাহরণ অন্তর্ভুক্ত করে। আপনি যদি তা করেন তবে আপনার অবশ্যই নিশ্চিত হওয়া দরকার যে উপাদানটি সেই ফিল্টার উপাদানগুলির যে কোনও এবং সমস্ত সংমিশ্রণ পরিচালনা করতে পারে।
আপনি যখন একাধিক ধরণের অভিপ্রায় পরিচালনা করতে চান, তবে কেবল ক্রিয়া, ডেটা এবং বিভাগের ধরণের নির্দিষ্ট সংমিশ্রণে, তখন আপনাকে একাধিক অভিপ্রায় ফিল্টার তৈরি করতে হবে।
তিনটি উপাদানের প্রত্যেকের সাথে অভিপ্রায় তুলনা করে একটি ফিল্টারের বিরুদ্ধে একটি অন্তর্নিহিত অভিপ্রায় পরীক্ষা করা হয়। উপাদানটিতে সরবরাহ করার জন্য, অভিপ্রায়টি অবশ্যই তিনটি পরীক্ষা পাস করতে হবে। যদি এটি তাদের মধ্যে একটির সাথেও মেলে ব্যর্থ হয় তবে অ্যান্ড্রয়েড সিস্টেমটি উপাদানটিতে অভিপ্রায় সরবরাহ করবে না। তবে, যেহেতু কোনও উপাদানটিতে একাধিক অভিপ্রায় ফিল্টার থাকতে পারে, এমন একটি অভিপ্রায় যা কোনও উপাদানগুলির ফিল্টারগুলির মধ্য দিয়ে যায় না এটি অন্য ফিল্টারে এটি তৈরি করতে পারে। সিস্টেমটি কীভাবে উদ্দেশ্য সমাধান করে সে সম্পর্কে আরও তথ্য উদ্দেশ্য রেজোলিউশন সম্পর্কে নীচের বিভাগে সরবরাহ করা হয়।
সতর্কতা: একটি অভিপ্রায় ফিল্টার ব্যবহার করা আপনার উপাদানগুলি শুরু করা থেকে অন্য অ্যাপ্লিকেশনগুলিকে রোধ করার কোনও সুরক্ষিত উপায় নয়। যদিও অভিপ্রায় ফিল্টারগুলি কেবলমাত্র নির্দিষ্ট ধরণের অন্তর্নিহিত অভিপ্রায়গুলির প্রতিক্রিয়া জানাতে একটি উপাদানকে সীমাবদ্ধ করে, অন্য অ্যাপ্লিকেশনটি যদি বিকাশকারী আপনার উপাদানগুলির নামগুলি নির্ধারণ করে তবে একটি স্পষ্ট অভিপ্রায় ব্যবহার করে আপনার অ্যাপ্লিকেশন উপাদানটি সম্ভাব্যভাবে শুরু করতে পারে। যদি এটি গুরুত্বপূর্ণ যে কেবলমাত্র আপনার নিজস্ব অ্যাপ্লিকেশনটি আপনার উপাদানগুলির একটি শুরু করতে সক্ষম হয় তবে আপনার ম্যানিফেস্টে অভিপ্রায় ফিল্টারগুলি ঘোষণা করবেন না। পরিবর্তে, 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
প্রবেশ করতে পারে যা দুটি অভিপ্রায় ফিল্টারগুলির মধ্যে একটির সাথে মিলে একটি অন্তর্নিহিত অভিপ্রায় জারি করে।
দ্রষ্টব্য: মাইম টাইপ, application/vnd.google.panorama360+jpg
, একটি বিশেষ ডেটা টাইপ যা প্যানোরামিক ফটোগুলি নির্দিষ্ট করে, যা আপনি গুগল প্যানোরামা এপিআইগুলির সাথে পরিচালনা করতে পারেন।
অন্যান্য অ্যাপ্লিকেশনগুলির অভিপ্রায় ফিল্টারগুলির সাথে উদ্দেশ্যগুলি মেলে
যদি অন্য অ্যাপ্লিকেশনটি অ্যান্ড্রয়েড 13 (এপিআই স্তর 33) বা উচ্চতর লক্ষ্যবস্তু করে, তবে এটি আপনার অ্যাপ্লিকেশনটির অভিপ্রায়টি কেবল তখনই পরিচালনা করতে পারে যদি আপনার অভিপ্রায়টি অন্য অ্যাপ্লিকেশনটিতে <intent-filter>
উপাদানগুলির ক্রিয়া এবং বিভাগগুলির সাথে মেলে। যদি সিস্টেমটি কোনও ম্যাচ না খুঁজে পায় তবে এটি একটি ActivityNotFoundException
নিক্ষেপ করে। প্রেরণ অ্যাপ্লিকেশনটি অবশ্যই এই ব্যতিক্রম পরিচালনা করতে হবে।
একইভাবে, আপনি যদি আপনার অ্যাপ্লিকেশনটি আপডেট করেন যাতে এটি অ্যান্ড্রয়েড 13 বা উচ্চতর লক্ষ্য করে, বাহ্যিক অ্যাপ্লিকেশনগুলি থেকে উত্পন্ন সমস্ত উদ্দেশ্যগুলি কেবল তখনই আপনার অ্যাপ্লিকেশনটির একটি রফতানি উপাদানগুলিতে সরবরাহ করা হয় যদি সেই উদ্দেশ্যটি আপনার অ্যাপ্লিকেশনটি ঘোষণা করে এমন একটি <intent-filter>
> উপাদানগুলির ক্রিয়া এবং বিভাগগুলির সাথে মেলে। এই আচরণটি প্রেরণ অ্যাপের টার্গেট এসডিকে সংস্করণ নির্বিশেষে ঘটে।
নিম্নলিখিত ক্ষেত্রে, অভিপ্রায় ম্যাচিং প্রয়োগ করা হয় না:
- উদ্দেশ্যগুলি এমন উপাদানগুলিতে বিতরণ করা হয় যা কোনও উদ্দেশ্য ফিল্টার ঘোষণা করে না।
- একই অ্যাপের মধ্যে থেকে উত্পন্ন ইনটেন্টস।
- সিস্টেম থেকে উদ্ভূত অভিপ্রায়; এটি হ'ল "সিস্টেম ইউআইডি" (ইউআইডি = 1000) থেকে অভিপ্রায় প্রেরণ করা হচ্ছে। সিস্টেম অ্যাপ্লিকেশনগুলির মধ্যে
system_server
এবং অ্যাপ্লিকেশনগুলি অন্তর্ভুক্ত রয়েছে যাandroid:sharedUserId
থেকেandroid.uid.system
। - মূল থেকে উদ্ভূত অভিপ্রায়।
অভিপ্রায় ম্যাচিং সম্পর্কে আরও জানুন।
একটি মুলতুবি অভিপ্রায় ব্যবহার
একটি PendingIntent
অবজেক্টটি একটি Intent
অবজেক্টের চারপাশে একটি মোড়ক। একটি PendingIntent
প্রাথমিক উদ্দেশ্য হ'ল একটি বিদেশী অ্যাপ্লিকেশনকে অন্তর্ভুক্ত Intent
ব্যবহার করার জন্য অনুমতি দেওয়া যেন এটি আপনার অ্যাপের নিজস্ব প্রক্রিয়া থেকে কার্যকর করা হয়েছে।
মুলতুবি অভিপ্রায়ের জন্য প্রধান ব্যবহারের ক্ষেত্রে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:
- যখন ব্যবহারকারী আপনার বিজ্ঞপ্তি দিয়ে কোনও ক্রিয়া সম্পাদন করে (অ্যান্ড্রয়েড সিস্টেমের
NotificationManager
Intent
কার্যকর করে) কার্যকর করার অভিপ্রায় ঘোষণা করে। - যখন ব্যবহারকারী আপনার অ্যাপ্লিকেশন উইজেটের সাথে কোনও ক্রিয়া সম্পাদন করে (হোম স্ক্রিন অ্যাপটি
Intent
সম্পাদন করে) যখন কার্যকর করার অভিপ্রায় ঘোষণা করে। - একটি নির্দিষ্ট ভবিষ্যতের সময়ে মৃত্যুদন্ড কার্যকর করার অভিপ্রায় ঘোষণা করে (অ্যান্ড্রয়েড সিস্টেমের
AlarmManager
Intent
কার্যকর করে)।
প্রতিটি Intent
অবজেক্ট যেমন নির্দিষ্ট ধরণের অ্যাপ্লিকেশন উপাদান (হয় কোনও Activity
, Service
, বা BroadcastReceiver
) দ্বারা পরিচালিত করার জন্য ডিজাইন করা হয়েছে, তেমনি একই বিবেচনার সাথেও একটি PendingIntent
তৈরি করতে হবে। মুলতুবি অভিপ্রায় ব্যবহার করার সময়, আপনার অ্যাপ্লিকেশনটি startActivity()
এর মতো কল দিয়ে অভিপ্রায়টি কার্যকর করে না। পরিবর্তে, আপনি যখন সংশ্লিষ্ট স্রষ্টার পদ্ধতিটি কল করে PendingIntent
তৈরি করেন তখন আপনাকে অবশ্যই উদ্দেশ্যযুক্ত উপাদানগুলির প্রকারটি ঘোষণা করতে হবে:
- কোনও
Activity
শুরু করে এমনIntent
জন্যPendingIntent.getActivity()
। - কোনও
Service
শুরু করে এমনIntent
জন্যPendingIntent.getService()
। -
BroadcastReceiver
শুরু করে এমন একটিIntent
জন্যPendingIntent.getBroadcast()
।
Unless your app is receiving pending intents from other apps, the above methods to create a PendingIntent
are probably the only PendingIntent
methods you'll ever need.
Each method takes the current app Context
, the Intent
you want to wrap, and one or more flags that specify how the intent should be used (such as whether the intent can be used more than once).
For more information about using pending intents, see the documentation for each of the respective use cases, such as in the Notifications and App Widgets API guides.
Specify mutability
If your app targets Android 12 or higher, you must specify the mutability of each PendingIntent
object that your app creates. To declare that a given PendingIntent
object is mutable or immutable, use the PendingIntent.FLAG_MUTABLE
or PendingIntent.FLAG_IMMUTABLE
flag, respectively.
If your app attempts to create a PendingIntent
object without setting either mutability flag, the system throws an IllegalArgumentException
, and the following message appears in 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.
Create immutable pending intents whenever possible
In most cases, your app should create immutable PendingIntent
objects, as shown in the following code snippet. If a PendingIntent
object is immutable, then other apps cannot modify the intent to adjust the result of invoking the intent.
কোটলিন
val pendingIntent = PendingIntent.getActivity(applicationContext, REQUEST_CODE, intent, /* flags */ PendingIntent.FLAG_IMMUTABLE)
জাভা
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), REQUEST_CODE, intent, /* flags */ PendingIntent.FLAG_IMMUTABLE);
However, certain use cases require mutable PendingIntent
objects instead:
- Supporting direct reply actions in notifications . The direct reply requires a change to the clip data in the PendingIntent object that's associated with the reply. Usually, you request this change by passing
FILL_IN_CLIP_DATA
as a flag to thefillIn()
method. - Associating notifications with the Android Auto framework, using instances of
CarAppExtender
. - Placing conversations in bubbles using instances of
PendingIntent
. A mutablePendingIntent
object allows the system to apply the correct flags, such asFLAG_ACTIVITY_MULTIPLE_TASK
andFLAG_ACTIVITY_NEW_DOCUMENT
. - Requesting device location information by calling
requestLocationUpdates()
or similar APIs. The mutablePendingIntent
object allows the system to add intent extras that represent location lifecycle events. These events include a change in location and a provider becoming available. - Scheduling alarms using
AlarmManager
. The mutablePendingIntent
object allows the system to add theEXTRA_ALARM_COUNT
intent extra. This extra represents the number of times that a repeating alarm has been triggered. By containing this extra, the intent can accurately notify an app as to whether a repeating alarm was triggered multiple times, such as when the device was asleep.
If your app creates a mutable PendingIntent
object, it's strongly recommended that you use an explicit intent and fill in the ComponentName
. That way, whenever another app invokes the PendingIntent
and passes control back to your app, the same component in your app always starts.
Use explicit intents within pending intents
To better define how other apps can use your app's pending intents, always wrap a pending intent around an explicit intent . To help follow this best practice, do the following:
- Check that the action, package, and component fields of the base intent are set.
Use
FLAG_IMMUTABLE
, added in Android 6.0 (API level 23), to create pending intents. This flag prevents apps that receive aPendingIntent
from filling in unpopulated properties. If your app'sminSdkVersion
is22
or lower, you can provide safety and compatibility together using the following code:if (Build.VERSION.SDK_INT >= 23) { // Create a PendingIntent using FLAG_IMMUTABLE. } else { // Existing code that creates a PendingIntent. }
Intent resolution
When the system receives an implicit intent to start an activity, it searches for the best activity for the intent by comparing it to intent filters based on three aspects:
- অ্যাকশন।
- Data (both URI and data type).
- শ্রেণী।
The following sections describe how intents are matched to the appropriate components according to the intent filter declaration in an app's manifest file.
Action test
To specify accepted intent actions, an intent filter can declare zero or more <action>
elements, as shown in the following example:
<intent-filter> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.VIEW" /> ... </intent-filter>
To pass this filter, the action specified in the Intent
must match one of the actions listed in the filter.
If the filter does not list any actions, there is nothing for an intent to match, so all intents fail the test. However, if an Intent
does not specify an action, it passes the test as long as the filter contains at least one action.
Category test
To specify accepted intent categories, an intent filter can declare zero or more <category>
elements, as shown in the following example:
<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. যেমন:
- 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. নিয়মগুলি নিম্নরূপ:
- 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>
অভিপ্রায় মিলে
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.