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

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

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

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

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

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

একটি অভিপ্রায় ফিল্টার যোগ করুন

আপনার অ্যাক্টিভিটি কোন উদ্দেশ্যগুলি পরিচালনা করতে পারে তা সঠিকভাবে সংজ্ঞায়িত করতে, কার্যকলাপটি যে ধরনের ক্রিয়াকলাপ এবং ডেটা গ্রহণ করে তার পরিপ্রেক্ষিতে আপনার যোগ করা প্রতিটি অভিপ্রায় ফিল্টারকে যতটা সম্ভব নির্দিষ্ট করুন৷

সিস্টেমটি একটি ক্রিয়াকলাপে একটি প্রদত্ত Intent পাঠাতে পারে যদি সেই ক্রিয়াকলাপে একটি অভিপ্রায় ফিল্টার থাকে যা Intent বস্তুর নিম্নলিখিত মানদণ্ড পূরণ করে:

অ্যাকশন
সঞ্চালনের জন্য কর্মের নামকরণ একটি স্ট্রিং। সাধারণত প্ল্যাটফর্ম-সংজ্ঞায়িত মানগুলির মধ্যে একটি, যেমন ACTION_SEND বা ACTION_VIEW

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

ডেটা
অভিপ্রায়ের সাথে যুক্ত ডেটার বর্ণনা।

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

দ্রষ্টব্য: যদি আপনার Uri ডেটা সম্পর্কে সুনির্দিষ্ট কিছু ঘোষণা করার প্রয়োজন না হয়, যেমন আপনার কার্যকলাপ যখন 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 ব্যবহার করতে হবে। এটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<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 এ সেট করা আছে৷ সুতরাং, যদি ব্যবহারকারী ক্রিয়াটি সম্পূর্ণ করার আগে এবং আপনি ফলাফল সেট করার আগে পিছনের বোতামটি আলতো চাপেন, তবে মূল কার্যকলাপটি "বাতিল" ফলাফল পায়।

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

কোটলিন

setResult(RESULT_COLOR_RED)
finish()

জাভা

setResult(RESULT_COLOR_RED);
finish();

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

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