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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

কোটলিন

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

জাভা

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

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

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

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

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

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

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

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

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

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

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

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

কোটলিন

const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"

জাভা

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

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

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

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

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

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

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

কোটলিন

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

জাভা

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

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

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

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

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

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

কোটলিন

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

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

জাভা

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

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

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

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

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

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

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

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

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

কোটলিন

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

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

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

জাভা

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

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

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

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

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

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

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

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

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

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

কোটলিন

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

জাভা

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

কোটলিন

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

জাভা

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

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

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

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

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

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

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

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

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

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

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

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

কর্ম পরীক্ষা

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

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

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

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

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

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

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

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

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

ডেটা পরীক্ষা

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

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

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

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

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

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

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

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

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

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

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

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

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

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

দ্রষ্টব্য: যদি একটি অভিপ্রায় একটি URI বা MIME প্রকার নির্দিষ্ট করে, <intent-filter> -এ কোনো <data> উপাদান না থাকলে ডেটা পরীক্ষা ব্যর্থ হবে।

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

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

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

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

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

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

দ্রষ্টব্য: কোনও 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 দ্বারা নিয়ন্ত্রিত, যা ডেটা মাইম টাইপকে সিস্টেমে দৃশ্যমান করে তোলে।

শুধুমাত্র ডেটা URI সেট করতে, setData() কল করুন। শুধুমাত্র MIME প্রকার সেট করতে, 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 বস্তুর জন্য উপাদানের নামটি সংজ্ঞায়িত করুন-অন্যান্য সমস্ত অভিপ্রায় বৈশিষ্ট্য ঐচ্ছিক।

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

কোটলিন

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

জাভা

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

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

কোনও পরিষেবা তৈরি এবং শুরু করার বিষয়ে আরও তথ্যের জন্য, পরিষেবাগুলি গাইড দেখুন।

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

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

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

কোটলিন

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

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

জাভা

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

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

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

অন্যান্য অ্যাপ্লিকেশন চালু করার বিষয়ে আরও তথ্য ব্যবহারকারীকে অন্য অ্যাপ্লিকেশনটিতে প্রেরণ সম্পর্কে গাইডে সরবরাহ করা হয়।

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

একটি অ্যাপ্লিকেশন চয়নকারীকে জোর করে

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

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

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

কোটলিন

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

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

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

জাভা

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

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

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

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

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

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

  1. আপনার অ্যাপ্লিকেশনটি বিতরণ করা অভিপ্রায়ের অতিরিক্ত থেকে একটি নেস্টেড অভিপ্রায়কে ছড়িয়ে দেয়।
  2. আপনার অ্যাপ্লিকেশনটি তাত্ক্ষণিকভাবে সেই নেস্টেড অভিপ্রায়টি ব্যবহার করে একটি অ্যাপ্লিকেশন উপাদান শুরু করে, যেমন উদ্দেশ্যটি 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 এর চিত্রটি দেখায় যে কীভাবে সিস্টেমটি আপনার (ক্লায়েন্ট) অ্যাপ্লিকেশন থেকে অন্য (পরিষেবা) অ্যাপ্লিকেশনটিতে নিয়ন্ত্রণ করে এবং আপনার অ্যাপ্লিকেশনটিতে ফিরে আসে:

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

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

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

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

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

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

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

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

সতর্কতা: যদি আপনার অ্যাপ্লিকেশনটিতে কোনও ক্রিয়াকলাপ, পরিষেবা, বা সম্প্রচার রিসিভারটি ইনটেন্ট ফিল্টারগুলি ব্যবহার করে এবং android:exported , আপনার অ্যাপ্লিকেশনটি অ্যান্ড্রয়েড 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 তৈরি করেন তখন আপনাকে অবশ্যই উদ্দেশ্যযুক্ত উপাদানগুলির প্রকারটি ঘোষণা করতে হবে:

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

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

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

পরিবর্তনশীলতা নির্দিষ্ট করুন

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

যদি আপনার অ্যাপ্লিকেশনটি কোনও পরিবর্তনশীল পতাকা সেট না করে একটি PendingIntent অবজেক্ট তৈরি করার চেষ্টা করে তবে সিস্টেমটি একটি IllegalArgumentException ছুঁড়ে দেয় এবং নিম্নলিখিত বার্তাটি লগক্যাটে উপস্থিত হয়:

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 অবজেক্টগুলির প্রয়োজন:

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

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

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

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

  1. বেস ইনটেন্টের ক্রিয়া, প্যাকেজ এবং উপাদান ক্ষেত্রগুলি সেট করা আছে কিনা তা পরীক্ষা করে দেখুন।
  2. মুলতুবি উদ্দেশ্যগুলি তৈরি করতে অ্যান্ড্রয়েড 6.0 (এপিআই স্তর 23) এ যুক্ত FLAG_IMMUTABLE ব্যবহার করুন। এই পতাকাটি এমন অ্যাপ্লিকেশনগুলিকে বাধা দেয় যা অপ্রচলিত বৈশিষ্ট্যগুলি পূরণ করা থেকে 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 চ্ছিক, তবে লিনিয়ার নির্ভরতা রয়েছে:

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

যখন কোনও অভিপ্রায় ইউআরআই কোনও ফিল্টারে ইউআরআই স্পেসিফিকেশনের সাথে তুলনা করা হয়, তখন এটি কেবল ফিল্টারটিতে অন্তর্ভুক্ত ইউআরআইয়ের অংশগুলির সাথে তুলনা করা হয়। যেমন:

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

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

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

  1. ফিল্টারটি কোনও ইউআরআই বা মাইম প্রকার নির্দিষ্ট না করে কেবল তখনই ইউআরআই বা মাইম টাইপ না করে এমন একটি উদ্দেশ্য পরীক্ষায় পাস করে না।
  2. এমন একটি অভিপ্রায় যা একটি ইউআরআই থাকে তবে কোনও মাইম টাইপ নেই (ইউআরআই থেকে সুস্পষ্ট বা অনুমানযোগ্য নয়) কেবল তখনই পরীক্ষায় উত্তীর্ণ হয় যখন তার ইউআরআই ফিল্টারটির ইউআরআই ফর্ম্যাটের সাথে মেলে এবং ফিল্টারটি একইভাবে কোনও মাইম টাইপ নির্দিষ্ট করে না।
  3. 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.
  4. 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: or file: URI and the filter does not specify a URI. In other words, a component is presumed to support content: and file: 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.