অন্যান্য অ্যাপকে আপনার কার্যকলাপ শুরু করতে দিন

আপনার অ্যাপ যদি এমন কোনো কাজ করতে পারে যা অন্য কোনো অ্যাপের জন্য দরকারি হতে পারে, তাহলে আপনার অ্যাক্টিভিটিতে উপযুক্ত ইন্টেন্ট ফিল্টার উল্লেখ করে অ্যাকশন রিকোয়েস্টে সাড়া দেওয়ার জন্য এটিকে প্রস্তুত করুন।

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

চিত্র ১. বাছাই করার ডায়ালগ বক্স।

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

যখন আপনার অ্যাপটি কোনো ডিভাইসে ইনস্টল করা হয়, তখন সিস্টেম আপনার ইন্টেন্ট ফিল্টারগুলো শনাক্ত করে এবং সেই তথ্য ইনস্টল করা সমস্ত অ্যাপ দ্বারা সমর্থিত ইন্টেন্টগুলোর একটি অভ্যন্তরীণ ক্যাটালগে যোগ করে। যখন কোনো অ্যাপ একটি ইমপ্লিসিট ইন্টেন্ট সহ startActivity() বা startActivityForResult() কল করে, তখন সিস্টেম সেই ইন্টেন্টটিতে সাড়া দিতে পারে এমন অ্যাক্টিভিটিগুলো খুঁজে দেখে।

একটি ইন্টেন্ট ফিল্টার যোগ করুন

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

সিস্টেমটি কোনো অ্যাক্টিভিটিতে একটি নির্দিষ্ট Intent পাঠাতে পারে, যদি সেই অ্যাক্টিভিটির একটি Intent ফিল্টার থাকে যা Intent অবজেক্টের নিম্নলিখিত শর্তগুলো পূরণ করে:

পদক্ষেপ
যে কাজটি করতে হবে তার নাম নির্দেশকারী একটি স্ট্রিং। সাধারণত এটি প্ল্যাটফর্ম-নির্ধারিত মানগুলোর মধ্যে একটি হয়, যেমন ACTION_SEND বা ACTION_VIEW

আপনার ইন্টেন্ট ফিল্টারে <action> এলিমেন্টের মাধ্যমে এটি নির্দিষ্ট করুন। এই এলিমেন্টে আপনি যে ভ্যালুটি নির্দিষ্ট করবেন, তা অবশ্যই অ্যাকশনটির সম্পূর্ণ স্ট্রিং নাম হতে হবে, এপিআই কনস্ট্যান্ট নয়, যেমনটি এই পৃষ্ঠার উদাহরণগুলিতে দেখানো হয়েছে।

ডেটা
অভিপ্রায়টির সাথে সংশ্লিষ্ট ডেটার বিবরণ।

আপনার ইন্টেন্ট ফিল্টারে <data> এলিমেন্ট ব্যবহার করে এটি নির্দিষ্ট করুন। এই এলিমেন্টে এক বা একাধিক অ্যাট্রিবিউট ব্যবহার করে, আপনি MIME টাইপ, একটি URI প্রিফিক্স, একটি URI স্কিম, অথবা এগুলোর এবং গৃহীত ডেটা টাইপ নির্দেশকারী অন্যান্য উপাদানের সংমিশ্রণ নির্দিষ্ট করতে পারেন।

দ্রষ্টব্য: যদি ডেটা Uri Data Uri) সম্পর্কে নির্দিষ্ট বিবরণ দেওয়ার প্রয়োজন না হয়, যেমন যখন আপনার অ্যাক্টিভিটি অন্য ধরনের "অতিরিক্ত" ডেটা পরিচালনা করে, তখন ইউআরআই-এর পরিবর্তে শুধু android:mimeType অ্যাট্রিবিউটটি উল্লেখ করুন। এর মাধ্যমে আপনার অ্যাক্টিভিটি কোন ধরনের ডেটা পরিচালনা করবে তা জানানো হয়, যেমন text/plain বা image/jpeg

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

আপনার ইন্টেন্ট ফিল্টারে <category> এলিমেন্ট ব্যবহার করে এটি নির্দিষ্ট করুন।

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

উদাহরণস্বরূপ, এখানে একটি অ্যাক্টিভিটি রয়েছে যেখানে একটি ইন্টেন্ট ফিল্টার আছে, যা ডেটা টাইপ টেক্সট বা ইমেজ হলে ACTION_SEND ইন্টেন্টটি পরিচালনা করে:

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

পরামর্শ: যদি আপনি চান যে চুজার ডায়ালগের আইকনটি আপনার অ্যাক্টিভিটির ডিফল্ট আইকন থেকে আলাদা হোক, তাহলে <intent-filter> এলিমেন্টে android:icon যোগ করুন।

প্রতিটি আগত ইন্টেন্ট শুধুমাত্র একটি অ্যাকশন এবং একটি ডেটা টাইপ নির্দিষ্ট করে, কিন্তু প্রতিটি <intent-filter> এর মধ্যে <action> , <category> , এবং <data> এলিমেন্টগুলোর একাধিক ইনস্ট্যান্স ঘোষণা করা যেতে পারে।

যদি কোনো দুটি অ্যাকশন ও ডেটার জোড়া তাদের আচরণে পরস্পর স্বতন্ত্র হয়, তাহলে কোন ডেটা টাইপের সাথে কোন অ্যাকশনগুলো গ্রহণযোগ্য হবে তা নির্দিষ্ট করার জন্য আলাদা ইনটেন্ট ফিল্টার তৈরি করুন।

উদাহরণস্বরূপ, ধরুন আপনার অ্যাক্টিভিটি ACTION_SEND এবং ACTION_SENDTO উভয় ইন্টেন্টের জন্যই টেক্সট এবং ইমেজ উভয়ই পরিচালনা করে। এই ক্ষেত্রে, আপনাকে দুটি অ্যাকশনের জন্য দুটি পৃথক ইন্টেন্ট ফিল্টার সংজ্ঞায়িত করতে হবে, কারণ একটি ACTION_SENDTO ইন্টেন্টকে অবশ্যই send বা sendto URI স্কিম ব্যবহার করে প্রাপকের ঠিকানা নির্দিষ্ট করার জন্য `data Uri ব্যবহার করতে হয়। এটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<activity android:name="ShareActivity">
    <!-- Filter for sending text; accepts SENDTO action with sms URI schemes -->
    <intent-filter>
        <action android:name="android.intent.action.SENDTO"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="sms" />
        <data android:scheme="smsto" />
    </intent-filter>
    <!-- Filter for sending text or images; accepts SEND action and text or image data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

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

সোশ্যাল শেয়ারিং কার্যক্রম সম্পাদনকারী ACTION_SEND ইন্টেন্ট পাঠানো ও গ্রহণ করার বিষয়ে আরও তথ্যের জন্য, ‘অন্যান্য অ্যাপ থেকে সাধারণ ডেটা গ্রহণ করা’ দেখুন। এছাড়াও, ‘সাধারণ ডেটা শেয়ার করা’ এবং ‘ফাইল শেয়ার করা’ অংশে আপনি ডেটা শেয়ার করার বিষয়ে প্রয়োজনীয় তথ্য পেতে পারেন।

আপনার অ্যাক্টিভিটিতে ইনটেন্টটি পরিচালনা করুন।

আপনার কার্যক্রমে কী পদক্ষেপ নেবেন তা স্থির করতে, এটি শুরু করার জন্য ব্যবহৃত Intent পড়ুন।

আপনার অ্যাক্টিভিটি শুরু হওয়ার সাথে সাথে, যে Intent অ্যাক্টিভিটিটি শুরু করেছে সেটি পাওয়ার জন্য getIntent() কল করুন। আপনি অ্যাক্টিভিটির লাইফসাইকেলের যেকোনো সময়ে এটি করতে পারেন, তবে সাধারণত onCreate() বা onStart() এর মতো শুরুর দিকের কলব্যাকগুলোতে এটি করা হয়ে থাকে।

নিম্নলিখিত উদাহরণে এটি দেখানো হয়েছে:

কোটলিন

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContentView(R.layout.main)

    val data: Uri? = intent?.data

    // Figure out what to do based on the intent type
    if (intent?.type?.startsWith("image/") == true) {
        // Handle intents with image data
    } else if (intent?.type == "text/plain") {
        // Handle intents with text
    }
}

জাভা

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    // Get the intent that started this activity
    Intent intent = getIntent();
    Uri data = intent.getData();

    // Figure out what to do based on the intent type
    if (intent.getType().indexOf("image/") != -1) {
        // Handle intents with image data
    } else if (intent.getType().equals("text/plain")) {
        // Handle intents with text
    }
}

একটি ফলাফল ফেরত দিন

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

কোটলিন

// Create intent to deliver some kind of result data
Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")).also { result ->
    setResult(Activity.RESULT_OK, result)
}
finish()

জাভা

// Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri"));
setResult(Activity.RESULT_OK, result);
finish();

ফলাফলের সাথে আপনাকে অবশ্যই একটি রেজাল্ট কোড উল্লেখ করতে হবে। সাধারণত, এটি হয় RESULT_OK অথবা RESULT_CANCELED । এরপর, প্রয়োজন অনুযায়ী, আপনি একটি Intent মাধ্যমে অতিরিক্ত ডেটা প্রদান করতে পারেন।

দ্রষ্টব্য: ফলাফলটি ডিফল্টরূপে RESULT_CANCELED হিসেবে সেট করা থাকে। তাই, যদি ব্যবহারকারী কাজটি সম্পন্ন করার আগে এবং আপনি ফলাফল সেট করার আগেই ব্যাক বাটনে ট্যাপ করেন, তাহলে মূল অ্যাক্টিভিটিটি "canceled" ফলাফলটি পাবে।

যদি আপনার কেবল একটি পূর্ণসংখ্যা ফেরত দেওয়ার প্রয়োজন হয় যা একাধিক ফলাফল বিকল্পের মধ্যে একটি নির্দেশ করে, তাহলে আপনি ফলাফল কোডটিকে ০-এর চেয়ে বড় যেকোনো মানে সেট করতে পারেন। যদি আপনি একটি পূর্ণসংখ্যা প্রদানের জন্য ফলাফল কোডটি ব্যবহার করেন এবং আপনার Intent অন্তর্ভুক্ত করার কোনো প্রয়োজন না থাকে, তাহলে আপনি setResult() কল করতে পারেন এবং শুধুমাত্র একটি ফলাফল কোড পাস করতে পারেন:

কোটলিন

setResult(RESULT_COLOR_RED)
finish()

জাভা

setResult(RESULT_COLOR_RED);
finish();

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

দ্রষ্টব্য: আপনার অ্যাক্টিভিটি startActivity() নাকি startActivityForResult() দিয়ে শুরু করা হয়েছে, তা যাচাই করার কোনো প্রয়োজন নেই। যদি আপনার অ্যাক্টিভিটি শুরু করা ইন্টেন্টটি কোনো ফলাফল আশা করে থাকে, তবে কেবল setResult() কল করুন। যদি মূল অ্যাক্টিভিটি startActivityForResult() কল করে থাকে, তাহলে আপনি setResult() -এ যে ফলাফলটি সরবরাহ করেন, সিস্টেম সেটিই প্রদান করে; অন্যথায়, ফলাফলটি উপেক্ষা করা হয়।