ব্যবহারকারীকে অন্য অ্যাপে পাঠানো হচ্ছে

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

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

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

ইমপ্লিসিট ইনটেন্ট তৈরি করুন

ইমপ্লিসিট ইনটেন্ট শুরু করার জন্য কম্পোনেন্টের ক্লাস নাম ঘোষণা করে না, পরিবর্তে এটি পারফর্ম করার জন্য একটি অ্যাকশন ঘোষণা করে। অ্যাকশন থেকে বোঝা যায় যে আপনি কী করতে চান, যেমন কোনও কিছু দেখা, এডিট করা, পাঠানো বা পাওয়া।

ডেটার সাথে ইনটেন্ট অ্যাকশন যুক্ত করুন

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

আপনার ডেটা Uri হলে, একটি সহজ Intent() কনস্ট্রাক্টর আছে যা আপনি অ্যাকশন ও ডেটা সংজ্ঞায়িত করতে ব্যবহার করতে পারেন।

যেমন, টেলিফোন নম্বর নির্দিষ্ট করার জন্য Uri ডেটা ব্যবহার করে ফোন কল শুরু করার ইনটেন্ট কীভাবে তৈরি করতে হয় তা এখানে দেওয়া হল:

Kotlin

val callIntent: Intent = Uri.parse("tel:5551234").let { number ->
    Intent(Intent.ACTION_DIAL, number)
}

জাভা

Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);

আপনার অ্যাপ startActivity()-এ কল করার মাধ্যমে এই ইনটেন্টকে ইনভোক করলে, ফোন অ্যাপ প্রদত্ত ফোন নম্বরে কল শুরু করে।

এখানে আরও কয়েকটি ইনটেন্ট এবং তাদের অ্যাকশন ও Uri ডেটা পেয়ার দেওয়া হল:

ম্যাপ দেখুন

Kotlin

// Map point based on address
val mapIntent: Intent = Uri.parse(
        "geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"
).let { location ->
    // Or map point based on latitude/longitude
    // val location: Uri = Uri.parse("geo:37.422219,-122.08364?z=14") // z param is zoom level
    Intent(Intent.ACTION_VIEW, location)
}

জাভা

// Map point based on address
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
// Or map point based on latitude/longitude
// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

ওয়েব পৃষ্ঠা দেখুন

Kotlin

val webIntent: Intent = Uri.parse("https://www.android.com").let { webpage ->
    Intent(Intent.ACTION_VIEW, webpage)
}

জাভা

Uri webpage = Uri.parse("https://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

ইনটেন্টে অতিরিক্ত তথ্য যোগ করা

অন্যান্য ধরনের ইমপ্লিসিট ইনটেন্টের জন্য "অতিরিক্ত" ডেটার প্রয়োজন হয় যা বিভিন্ন ধরনের ডেটা প্রদান করে, যেমন স্ট্রিং। আপনি বিভিন্ন putExtra() পদ্ধতি ব্যবহার করে এক বা একাধিক অতিরিক্ত ডেটা যোগ করতে পারবেন।

ডিফল্ট হিসেবে, সিস্টেম ইনটেন্টের জন্য প্রয়োজনীয় উপযুক্ত MIME-এর প্রকার নির্ধারণ করে, যা Uri অন্তর্ভুক্ত ডেটার উপর ভিত্তি করে করা হয়। আপনি ইনটেন্টে Uri অন্তর্ভুক্ত না করলে, ইনটেন্টের সাথে যুক্ত ডেটার ধরন নির্দিষ্ট করতে, সাধারণত setType() ব্যবহার করা উচিত। MIME-এর ধরন সেট করার মাধ্যমে আরও নির্দিষ্ট করে দেওয়া হয় যে কোন ধরনের অ্যাক্টিভিটি ইনটেন্ট পাবে।

এখানে আরও কিছু ইনটেন্ট দেওয়া হল যা কাঙ্ক্ষিত অ্যাকশন নির্দিষ্ট করার জন্য অতিরিক্ত ডেটা যোগ করে:

অ্যাটাচমেন্ট সহ ইমেল পাঠাও

Kotlin

Intent(Intent.ACTION_SEND).apply {
    // The intent does not have a URI, so declare the "text/plain" MIME type
    type = "text/plain"
    putExtra(Intent.EXTRA_EMAIL, arrayOf("jan@example.com")) // recipients
    putExtra(Intent.EXTRA_SUBJECT, "Email subject")
    putExtra(Intent.EXTRA_TEXT, "Email message text")
    putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"))
    // You can also attach multiple items by passing an ArrayList of Uris
}

জাভা

Intent emailIntent = new Intent(Intent.ACTION_SEND);
// The intent does not have a URI, so declare the "text/plain" MIME type
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jan@example.com"}); // recipients
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
// You can also attach multiple items by passing an ArrayList of Uris

ক্যালেন্ডার ইভেন্ট তৈরি করুন

মনে রাখবেন: ক্যালেন্ডার ইভেন্টের জন্য এই ইনটেন্ট শুধুমাত্র API লেভেল ১৪ এবং তার পরবর্তী ভার্সনে কাজ করে।

Kotlin

// Event is on January 23, 2021 -- from 7:30 AM to 10:30 AM.
Intent(Intent.ACTION_INSERT, Events.CONTENT_URI).apply {
    val beginTime: Calendar = Calendar.getInstance().apply {
        set(2021, 0, 23, 7, 30)
    }
    val endTime = Calendar.getInstance().apply {
        set(2021, 0, 23, 10, 30)
    }
    putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.timeInMillis)
    putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.timeInMillis)
    putExtra(Events.TITLE, "Ninja class")
    putExtra(Events.EVENT_LOCATION, "Secret dojo")
}

জাভা

// Event is on January 23, 2021 -- from 7:30 AM to 10:30 AM.
Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance();
beginTime.set(2021, 0, 23, 7, 30);
Calendar endTime = Calendar.getInstance();
endTime.set(2021, 0, 23, 10, 30);
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
calendarIntent.putExtra(Events.TITLE, "Ninja class");
calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");

মনে রাখবেন: আপনার Intent যতটা সম্ভব নির্দিষ্টভাবে উল্লেখ করা গুরুত্বপূর্ণ। যেমন, আপনি যদি ACTION_VIEW ইনটেন্ট ব্যবহার করে কোনও ছবি দেখাতে চান, তাহলে আপনাকে image/*-এর MIME-এর প্রকার নির্দিষ্ট করতে হবে। এটি এমন অ্যাপকে আটকায় যা অন্যান্য ধরনের ডেটা (যেমন ম্যাপ অ্যাপ) "দেখতে" পারে, যাতে ইনটেন্ট দ্বারা ট্রিগার না হয়।

ইনটেন্ট সহ অ্যাক্টিভিটি শুরু করুন

আপনার Intent তৈরি করা এবং অতিরিক্ত তথ্য সেট করা হয়ে গেলে, সিস্টেমে এটি পাঠাতে startActivity() কল করুন:

Kotlin

startActivity(intent)

জাভা

startActivity(intent);

কোনও অ্যাপ ইনটেন্ট রিসিভ করতে না পারলে সেই পরিস্থিতি ম্যানেজ করা

যদিও ডিভাইসে ইনস্টল করা অন্য অ্যাপের মাধ্যমে অনেক ইনটেন্ট ম্যানেজ করা হয়—যেমন ফোন, ইমেল বা ক্যালেন্ডার অ্যাপ—আপনার অ্যাপকে এমন পরিস্থিতির জন্য প্রস্তুত থাকতে হবে যেখানে কোনও অ্যাক্টিভিটি আপনার অ্যাপের ইনটেন্ট ম্যানেজ করতে পারবে না। আপনি যখনই কোনও ইনটেন্ট ইনভোক করবেন, তখনই ActivityNotFoundException ক্যাচ করার জন্য প্রস্তুত থাকুন, যা আপনার অ্যাপের ইনটেন্ট ম্যানেজ করার জন্য অন্য কোনও অ্যাক্টিভিটি না থাকলে ঘটে:

Kotlin

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

জাভা

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

এই ব্যতিক্রমটি ধরার পরে, আপনার অ্যাপের পরবর্তী পদক্ষেপ কী হওয়া উচিত তা ঠিক করুন। আপনি যে ইনটেন্ট ইনভোক করার চেষ্টা করেছেন তার নির্দিষ্ট বৈশিষ্ট্যের উপর এই পরবর্তী ধাপ নির্ভর করে। যেমন, আপনি যদি এমন কোনও নির্দিষ্ট অ্যাপের কথা জানেন যা ইনটেন্ট ম্যানেজ করতে পারে, তাহলে ব্যবহারকারীকে অ্যাপটি ডাউনলোড করার জন্য একটি লিঙ্ক দিন। কীভাবে Google Play-তে আপনার প্রোডাক্টের লিঙ্ক করবেন সেই সম্পর্কে আরও জানুন।

দ্ব্যর্থতা নিরসন ডায়ালগ

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

স্ক্রিনের নিচের দিকে
  একটি প্যানেল দেখা যায়। এই প্যানেলে বিভিন্ন অ্যাপের তালিকা থাকে যা
  ইনটেন্ট ম্যানেজ করতে পারে।

ছবি ১. একাধিক অ্যাপ কোনও ইনটেন্ট ম্যানেজ করতে পারলে, যে বেছে নেওয়ার ডায়ালগ দেখানো হয় তার উদাহরণ।

সম্পূর্ণ উদাহরণ

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

Kotlin

// Build the intent.
val location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California")
val mapIntent = Intent(Intent.ACTION_VIEW, location)

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

জাভা

// Build the intent.
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

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

অ্যাপ বেছে নেওয়ার বিকল্প দেখান

ছবি ২. একটি বাছাইকারী ডায়ালগ।

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

তবে, একাধিক অ্যাপের মাধ্যমে কোনও অ্যাকশন করা গেলে এবং ব্যবহারকারী প্রতিবার আলাদা অ্যাপ ব্যবহার করতে চাইলে—যেমন, "শেয়ার" অ্যাকশন, যার জন্য ব্যবহারকারীর কাছে একাধিক অ্যাপ থাকতে পারে যার মাধ্যমে তিনি কোনও আইটেম শেয়ার করতে পারেন—আপনাকে ছবি ২-এ দেখানো ডায়ালগ বক্সের মতো একটি ডায়ালগ বক্স দেখাতে হবে। বেছে নেওয়ার ডায়ালগ ব্যবহারকারীকে প্রতিবার অ্যাকশনের জন্য কোন অ্যাপ ব্যবহার করবেন তা বেছে নিতে বাধ্য করে (ব্যবহারকারী অ্যাকশনের জন্য কোনও ডিফল্ট অ্যাপ বেছে নিতে পারবেন না)।

বেছে নেওয়ার বিকল্প দেখাতে, createChooser() ব্যবহার করে একটি Intent তৈরি করুন এবং এটি startActivity()-এ পাস করুন। যেমন:

Kotlin

val intent = Intent(Intent.ACTION_SEND)

// Create intent to show chooser
val chooser = Intent.createChooser(intent, /* title */ null)

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

জাভা

Intent intent = new Intent(Intent.ACTION_SEND);

// Create intent to show chooser
Intent chooser = Intent.createChooser(intent, /* title */ null);

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

এটি করলে এমন অ্যাপের তালিকা সহ ডায়ালগ খুলে যায় যা createChooser() পদ্ধতিতে পাস করা ইনটেন্টের উত্তর দেয়। অ্যাকশন ACTION_SEND বা ACTION_SEND_MULTIPLE না হলে title প্যারামিটার প্রদান করা হতে পারে