অ্যান্ড্রয়েড ব্যবহারকারীদের ক্ষতিকারক অ্যাপ থেকে রক্ষা করে এবং একটি নির্ভরযোগ্য ইউজার ইন্টারফেস (UI) অভিজ্ঞতা প্রদান করে। অ্যাক্টিভিটি সিকিউরিটি ফ্রেমওয়ার্কটি বিভিন্ন নিয়ম এবং প্ল্যাটফর্ম সীমাবদ্ধতা নিয়ে গঠিত। এই নিয়ম ও সীমাবদ্ধতাগুলো অনাকাঙ্ক্ষিত UI বাধা, টাস্ক হাইজ্যাকিং এবং অন্যান্য নিরাপত্তা ঝুঁকি প্রতিরোধ করে। এই ঝুঁকিগুলো অ্যাপের উপাদানগুলো কখন এবং কীভাবে স্ক্রিনে প্রদর্শিত হবে তার সাথে সম্পর্কিত। এই ফ্রেমওয়ার্কের একটি প্রধান উপাদান হলো ব্যাকগ্রাউন্ড থেকে অ্যাক্টিভিটি চালু হওয়াকে সীমাবদ্ধ করা।
পটভূমি কার্যকলাপ চালুর সীমাবদ্ধতা
একটি ব্যাকগ্রাউন্ড অ্যাক্টিভিটি লঞ্চ (BAL) ঘটে যখন ফোরগ্রাউন্ডে না থাকা কোনো অ্যাপ, যার কোনো দৃশ্যমান অ্যাক্টিভিটি নেই, অথবা অন্য কোনো অ্যাপ থেকে প্রাপ্ত একটি PendingIntent (PendingIntent) একটি নতুন অ্যাক্টিভিটি শুরু করার চেষ্টা করে। এটিকে ব্যাকগ্রাউন্ড অ্যাক্টিভিটি লঞ্চ (BAL) বলা হয়। যদিও এর কিছু বৈধ ব্যবহার রয়েছে, যেমন অ্যালার্ম ক্লক অ্যাপ চালু হওয়ার ক্ষেত্রে, অনিয়ন্ত্রিত BAL ব্যবহারকারীর অভিজ্ঞতাকে খারাপ করে এবং নিরাপত্তা ঝুঁকি তৈরি করে।
তাদের কেন সীমাবদ্ধ করা হয়েছে?
অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) থেকে, প্ল্যাটফর্মটি অ্যাপগুলো কখন ব্যাকগ্রাউন্ড থেকে কার্যক্রম শুরু করতে পারবে তার উপর বিধিনিষেধ আরোপ করেছে। এই সুরক্ষা ব্যবস্থাগুলো ক্ষতিকর অ্যাপের কার্যকলাপ প্রতিরোধ করতে এবং সাধারণ অপব্যবহারগুলো প্রশমিত করার মাধ্যমে ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সাহায্য করে, যার মধ্যে রয়েছে:
- UI হাইজ্যাকিং ও পপ-আপ বিজ্ঞাপন : একটি ব্যাকগ্রাউন্ড অ্যাপ অপ্রত্যাশিতভাবে ব্যবহারকারীর ব্যবহৃত অ্যাপটির উপরে একটি অ্যাক্টিভিটি (প্রায়শই একটি বিজ্ঞাপন) চালু করে, যা ব্যবহারকারীর সেশন হাইজ্যাক করে নেয়।
- ফিশিং ও ছদ্মবেশ ধারণ : একটি ব্যাকগ্রাউন্ড অ্যাপ ব্যবহারকারীর পরিচয়পত্র চুরি করার জন্য অন্য একটি অ্যাপের ছদ্মবেশ ধারণ করে এমন একটি অ্যাক্টিভিটি চালু করে (উদাহরণস্বরূপ, একটি বৈধ অ্যাপের নকল লগইন স্ক্রিন)। এটি প্রায়শই "অ্যাক্টিভিটি স্যান্ডউইচ" আক্রমণের মাধ্যমে সম্পন্ন করা হয়, যেখানে একটি বৈধ অ্যাপের টাস্ক স্ট্যাকে একটি ক্ষতিকারক অ্যাক্টিভিটি ঢুকিয়ে দেওয়া হয়।
- ট্যাপজ্যাকিং : একটি ব্যাকগ্রাউন্ড অ্যাপ অন্য একটি অ্যাপের উপর একটি স্বচ্ছ বা অস্পষ্ট অ্যাক্টিভিটি প্রদর্শন করে ব্যবহারকারীর ট্যাপগুলো আটক করে এবং তাদেরকে অনাকাঙ্ক্ষিত কাজ করতে প্ররোচিত করে।
- অ্যাপ অ্যাওয়েকেনিং : একটি অ্যাপের ব্যাকগ্রাউন্ড কম্পোনেন্ট অন্য একটি অ্যাপের ফোরগ্রাউন্ড কম্পোনেন্টগুলোকে জাগিয়ে তোলে, যার মাধ্যমে অবৈধভাবে দৈনিক সক্রিয় ব্যবহারকারীর সংখ্যা বাড়ানো হয়।
ফোরগ্রাউন্ড পরিষেবা (চলমান কাজগুলির জন্য)
আপনার অ্যাপকে যদি ব্যাকগ্রাউন্ডে দীর্ঘক্ষণ ধরে চলা কোনো কাজ করতে হয় এবং ব্যবহারকারীকে সে সম্পর্কে অবগত থাকতে হয়, যেমন গান চালানো বা ওয়ার্কআউট ট্র্যাক করা, তাহলে আপনার একটি ফোরগ্রাউন্ড সার্ভিস ব্যবহার করা উচিত। একটি ফোরগ্রাউন্ড সার্ভিসে অবশ্যই একটি স্থায়ী নোটিফিকেশন প্রদর্শন করতে হবে যা ব্যবহারকারী বন্ধ করতে পারবেন না। এই নোটিফিকেশনটি ইন্টারেক্টিভ কন্ট্রোল প্রদান করতে পারে (উদাহরণস্বরূপ, একটি মিউজিক অ্যাপের জন্য প্লে/পজ বাটন)। এটি ব্যবহারকারীকে অবগত রাখে এবং নিয়ন্ত্রণে রাখে, কিন্তু ফুল-স্ক্রিন অ্যাক্টিভিটি দিয়ে তাদের কাজে বাধা দেয় না।
এই ক্রমবিন্যাস অনুসরণ করে—সাধারণ নোটিফিকেশন দিয়ে শুরু করে এবং কেবল প্রয়োজন হলেই আরও কঠোর বিকল্পগুলোর দিকে অগ্রসর হয়ে—আপনি আপনার ব্যবহারকারীদের জন্য একটি উন্নত ও আরও অনুমানযোগ্য অভিজ্ঞতা তৈরি করেন।
যখন ব্যাকগ্রাউন্ড কার্যকলাপ শুরু হয় তখন অনুমতি দেওয়া হয় (ব্যতিক্রম)
নিম্নলিখিত শর্তগুলির মধ্যে যেকোনো একটি পূরণ হলে একটি অ্যাপ ব্যাকগ্রাউন্ড থেকে কোনো অ্যাক্টিভিটি শুরু করতে পারে:
- অ্যাপটিতে একটি দৃশ্যমান উইন্ডো রয়েছে, যেমন ফোরগ্রাউন্ডে থাকা একটি অ্যাক্টিভিটি।
- অ্যাপটি হলো বর্তমান ইনপুট মেথড এডিটর (IME)।
- সিস্টেম থেকে পাঠানো একটি
PendingIntent(উদাহরণস্বরূপ, একটি নোটিফিকেশন ট্যাপ থেকে) থেকে অ্যাক্টিভিটিটি শুরু করা হয়। - অ্যাপটির কাছে ব্যবহারকারীর দেওয়া
SYSTEM_ALERT_WINDOWপারমিশনটি রয়েছে। - অ্যাপটিকে
START_ACTIVITIES_FROM_BACKGROUNDঅনুমতিটি দেওয়া হয়েছে। - অ্যাপটি এমন একটি পরিষেবার সাথে সংযুক্ত, যেটিকে ব্যাকগ্রাউন্ড কার্যক্রম শুরু করার অনুমতি দেওয়া হয়েছে।
- ডিভাইসের লঞ্চার অ্যাপের মাধ্যমে এটি চালু করা হয়, যেমন যখন কোনো ব্যবহারকারী একটি অ্যাপ আইকনে ট্যাপ করেন বা কোনো উইজেটের সাথে ইন্টারঅ্যাক্ট করেন।
- এটি অপারেটিং সিস্টেমের একটি মূল অংশ থেকে চালু হয় যা সব সময় চালু থাকা আবশ্যক, যেমন টেলিফোনি পরিষেবা যা ইনকামিং কল স্ক্রিনটি চালু করে।
নতুন কঠোরকরণ এবং প্রয়োজনীয় অপ্ট-ইন
নিরাপত্তা আরও জোরদার করতে, অ্যান্ড্রয়েড আরও কঠোর নিয়ম চালু করেছে। এই নিয়ম অনুযায়ী, যে অ্যাপগুলো অ্যাক্টিভিটি চালু করার জন্য PendingIntent এবং IntentSender ব্যবহার করে, তাদের সুস্পষ্ট সম্মতি (opt-in) দিতে হবে। অ্যাক্টিভিটি চালু করার অনুমতি কেবল তখনই দেওয়া হবে, যখন PendingIntent তৈরি করা অ্যাপটি অথবা এটি প্রেরণকারী অ্যাপটি ব্যাকগ্রাউন্ডে চালু হওয়ার বিশেষাধিকার (privilege) দেওয়ার জন্য সম্মতি জানাবে।
বেশিরভাগ ক্ষেত্রে, যে অ্যাপটি PendingIntent পাঠাচ্ছে, সেটিরই সম্মতি দেওয়া উচিত, কারণ সাধারণত ব্যবহারকারী সরাসরি সেই অ্যাপটির সাথেই ইন্টারঅ্যাক্ট করে (উদাহরণস্বরূপ, কোনো বোতামে ট্যাপ করা)।
প্রেরকদের অবশ্যই পেন্ডিংইনটেন্ট-এর জন্য অপ্ট-ইন করতে হবে।
যখন আপনার অ্যাপ অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তখন এটি একটি PendingIntent পাঠানোর সময় ডিফল্টরূপে আর তার নিজস্ব বিএএল (BAL) প্রিভিলেজ প্রদান করে না। আপনি যদি স্পষ্টভাবে এটি চালু করার জন্য সম্মতি না দেন, তাহলে অ্যাক্টিভিটি চালু হওয়া ব্লক হয়ে যেতে পারে , যদি না PendingIntent নির্মাতা ইতিমধ্যেই তার নিজের প্রিভিলেজগুলো দিয়ে থাকে।
লঞ্চ সফল করা নিশ্চিত করতে, প্রেরককে ActivityOptions.setPendingIntentBackgroundActivityStartMode() কল করে তার বিশেষাধিকার মঞ্জুর করার জন্য অপ্ট-ইন করতে হবে এবং প্রস্তাবিত মোডটি হলো ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE (SDK 36-এ যোগ করা হয়েছে)।
এটি একটি আরও কঠোর এবং নিরাপদ মোড। এটি কেবল তখনই অনুমতি দেয়, যখন PendingIntent পাঠানোর মুহূর্তে প্রেরক অ্যাপটি স্ক্রিনে দৃশ্যমান থাকে। এটি আরও জোরালোভাবে নিশ্চিত করে যে, অ্যাক্টিভিটি চালু হওয়াটি আপনার অ্যাপের সাথে ব্যবহারকারীর মিথস্ক্রিয়ারই একটি সরাসরি ফলাফল।
বিশেষাধিকার প্রদানের জন্য ActivityOptions.setPendingIntentBackgroundActivityStartMode() ব্যবহার করুন।
// Sender Side
ActivityOptions options = ActivityOptions.makeBasic()
.setPendingIntentBackgroundActivityStartMode(
ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE);
try {
myPendingIntent.send(options.toBundle());
} catch (PendingIntent.CanceledException e) {
Log.e(TAG, "The PendingIntent was canceled", e);
}
// Sender Side
val options = ActivityOptions.makeBasic().apply {
pendingIntentBackgroundActivityStartMode = ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE
}
try {
myPendingIntent.send(options.toBundle())
} catch (e: PendingIntent.CanceledException) {
Log.e(TAG, "The PendingIntent was canceled", e)
}
নির্মাতাদের অবশ্যই পেন্ডিংইনটেন্ট-এর জন্য অপ্ট-ইন করতে হবে।
যখন আপনার অ্যাপ অ্যান্ড্রয়েড ১৫ (এপিআই লেভেল ৩৫) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তখন PendingIntent তৈরি করা কোনো অ্যাপ ডিফল্টরূপে আর সেটিকে ব্যাকগ্রাউন্ডে চালু হওয়ার অনুমতি দেয় না। প্রেরককে আপনার অ্যাপের বিএএল (BAL) সুবিধা ব্যবহার করার অনুমতি দিতে হলে, আপনাকে অবশ্যই স্পষ্টভাবে সম্মতি জানাতে হবে।
বিশেষাধিকার প্রদানের জন্য ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode() ব্যবহার করুন।
// Creator Side
Intent intent = new Intent(context, MyActivity.class);
ActivityOptions options = ActivityOptions.makeBasic().setPendingIntentCreatorBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED);
PendingIntent pendingIntent = PendingIntent.getActivity(context, REQUEST_CODE, intent, PendingIntent.FLAG_IMMUTABLE, options.toBundle());
// Creator Side
val intent = Intent(context, MyActivity::class.java)
val options = ActivityOptions.makeBasic().apply {
pendingIntentCreatorBackgroundActivityStartMode = ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED
}
val pendingIntent = PendingIntent.getActivity(context, REQUEST_CODE, intent,
PendingIntent.FLAG_IMMUTABLE, options.toBundle())
IntentSender দিয়ে চালু করা হচ্ছে
IntentSender ব্যবহার করে অ্যাক্টিভিটি চালু করার ক্ষেত্রেও একই BAL বিধিনিষেধ প্রযোজ্য। যেহেতু একটি IntentSender PendingIntent.getIntentSender- এর মাধ্যমে পাওয়া যায়, তাই এটিও একই ধরনের অপ্ট-ইন শর্তাবলীর অধীন।
- অ্যান্ড্রয়েড ১৪ (এপিআই ৩৪) থেকে Context.startIntentSender() ব্যবহার করার জন্য প্রেরকের পক্ষ থেকে সম্মতি প্রয়োজন। আপনাকে এখানেও
ActivityOptionsবান্ডেলটি প্রদান করতে হবে।
ActivityOptions options = ActivityOptions.makeBasic()
.setPendingIntentBackgroundActivityStartMode(
ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED);
context.startIntentSender(myIntentSender, fillInIntent, flagsMask,
flagsValues, extraFlags, options.toBundle());
val options = ActivityOptions.makeBasic().apply {
pendingIntentBackgroundActivityStartMode = ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED
}
context.startIntentSender(myIntentSender, fillInIntent, flagsMask,
flagsValues, extraFlags, options.toBundle())
- অ্যান্ড্রয়েড ১৭ (এপিআই ৩৭+) থেকে IntentSender.sendIntent() ব্যবহার করার জন্য প্রেরকের পক্ষ থেকে সম্মতি প্রয়োজন।
ActivityOptions options = ActivityOptions.makeBasic()
.setPendingIntentBackgroundActivityStartMode(
ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED);
myIntentSender.sendIntent(context, code, intent, onFinished, handler,
requiredPermission, options.toBundle());
val options = ActivityOptions.makeBasic().apply {
pendingIntentBackgroundActivityStartMode = ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED
}
myIntentSender.sendIntent(context, code, intent, onFinished, handler,
requiredPermission, options.toBundle())
- অ্যাক্টিভিটি রেজাল্ট লঞ্চার ব্যবহার করে
এই AndroidX API অভ্যন্তরীণভাবে Context.startIntentSender() ব্যবহার করে এবং একারণে এটি BAL বিধিনিষেধ দ্বারা প্রভাবিত।
ক্রম চিত্র: BAL সীমাবদ্ধতা

এই ডায়াগ্রামটি একটি PendingIntent ব্যবহার করে নিরাপদে কোনো অ্যাক্টিভিটি চালু করার প্রক্রিয়াটি ব্যাখ্যা করে। সফলভাবে চালু হওয়া একটি বৈধ প্রিভিলেজ চেইনের উপর নির্ভর করে, যেখানে অংশগ্রহণকারী অ্যাপগুলোর মধ্যে অন্তত একটি তার প্রিভিলেজ প্রদান করে এবং ব্যাকগ্রাউন্ড থেকে একটি অ্যাক্টিভিটি চালু করার ক্ষমতা রাখে।
- সৃষ্টি ও প্রতিনিধি নিয়োগ (অ্যাপ এ - স্রষ্টা)
- ক্রিয়েটর অ্যাপটি
PendingIntentতৈরি করে। - SDK 35+ টার্গেট করার ক্ষেত্রে, ক্রিয়েটর যদি তার প্রিভিলেজগুলো ব্যবহার করাতে চায়, তবে তাকে অবশ্যই setPendingIntentCreatorBackgroundActivityStartMode() ব্যবহার করে তার BAL প্রিভিলেজগুলো স্পষ্টভাবে ডেলিগেট করতে হবে। ডিফল্টরূপে, কোনো প্রিভিলেজ ডেলিগেট করা হয় না।
- এরপর
PendingIntentঅন্য একটি অ্যাপে (অ্যাপ বি) পাঠিয়ে দেওয়া হয়।
- ক্রিয়েটর অ্যাপটি
- সূচনা ও অবদান (অ্যাপ বি - প্রেরক)
- পরবর্তী কোনো এক সময়ে, প্রেরক অ্যাপটি
PendingIntent.send()কল করার মাধ্যমে লঞ্চটি শুরু করে। - SDK 34+ টার্গেট করার ক্ষেত্রে, প্রেরক যদি তার প্রিভিলেজগুলো ব্যবহৃত হতে দিতে চায়, তবে তাকে অবশ্যই setPendingIntentBackgroundActivityStartMode() ব্যবহার করে স্পষ্টভাবে নিজের প্রিভিলেজ প্রদান করতে হবে। ডিফল্টরূপে, কোনো প্রিভিলেজ অর্পণ করা হয় না।
- পরবর্তী কোনো এক সময়ে, প্রেরক অ্যাপটি
- অ্যান্ড্রয়েড সিস্টেম নিরাপত্তা যাচাইকরণ
- অ্যান্ড্রয়েড সিস্টেম লঞ্চের অনুরোধটি গ্রহণ করে এবং একটি নিরাপত্তা যাচাই সম্পন্ন করে।
- এটি দুটি শর্ত মূল্যায়ন করে:
- ক্রিয়েটর কি তার বিশেষাধিকার অর্পণ করেছে, এবং ক্রিয়েটর অ্যাপটি কি বর্তমানে সাধারণ BAL ব্যতিক্রমগুলির মধ্যে একটি পূরণ করে?
- প্রেরক কি তার বিশেষাধিকারগুলো প্রদান করেছে, এবং প্রেরক অ্যাপটি কি বর্তমানে সাধারণ BAL ব্যতিক্রমগুলোর মধ্যে একটি পূরণ করে?
- ফলাফল
- অনুমোদিত : যদি ধাপ ৩-এর দুটি শর্তের মধ্যে অন্তত একটি পূরণ হয়, তাহলে প্রিভিলেজ চেইনটি যাচাই করা হয়। অ্যান্ড্রয়েড সিস্টেম টার্গেট অ্যাক্টিভিটি শুরু করে এবং প্রেরক একটি সফলতার ফলাফল পায়।
- ব্লকড : যদি কোনো শর্তই পূরণ না হয়, তাহলে সিস্টেম লঞ্চটি ব্লক করে দেয়। প্রেরক অ্যাপটি ব্যর্থতা নির্দেশকারী কোনো সরাসরি রিটার্ন ভ্যালু বা এক্সেপশন পায় না। এর পরিবর্তে, অ্যান্ড্রয়েড সিস্টেম অভ্যন্তরীণভাবে লগক্যাট-এ " Background activity launch blocked! " বার্তাটি লগ করে, যা ডেভেলপারদের ডিবাগিংয়ের জন্য অবশ্যই পরীক্ষা করতে হয়।
টাস্ক হাইজ্যাকিং প্রতিরোধ
ইন-টাস্ক হাইজ্যাকিং আক্রমণ (যেমন ‘অ্যাক্টিভিটি স্যান্ডউইচ’) প্রতিরোধ করতে, অ্যান্ড্রয়েড ১৫ এপিআই লেভেল ৩৭ বা তার চেয়ে উচ্চতর লেভেলকে টার্গেট করা অ্যাপগুলোর জন্য নতুন নিয়ম চালু করেছে।
- নিয়ম ১ : একটি একক টাস্কের মধ্যে, একটি অ্যাক্টিভিটি শুধুমাত্র সেই অন্য একটি অ্যাক্টিভিটি দ্বারা চালু করা যেতে পারে যা টাস্কের বর্তমান শীর্ষ-স্থানীয় অ্যাক্টিভিটির মতো একই অ্যাপ্লিকেশনের (অর্থাৎ, একই UID) অন্তর্গত।
- নিয়ম ২ : কোনো ফোরগ্রাউন্ড টাস্কের মধ্যে থাকা শুধুমাত্র সেই অ্যাক্টিভিটিই একটি নতুন টাস্ক তৈরি করতে বা একটি ভিন্ন, বিদ্যমান টাস্ককে ফোরগ্রাউন্ডে আনতে পারবে, যার UID সর্বোচ্চ অ্যাক্টিভিটির UID-এর সাথে মেলে।
ইন-টাস্ক সুরক্ষার জন্য ডেভেলপারের সম্মতি
এই আচরণটি টার্গেট SDK 37 থেকে সক্রিয় করা যেতে পারে, এটি সক্রিয় করতে আপনাকে অবশ্যই স্পষ্টভাবে অপ্ট-ইন করতে হবে। এটি ইন-টাস্ক হাইজ্যাকিং (বা অ্যাক্টিভিটি স্যান্ডউইচিং ) প্রতিরোধ করার জন্য ডিজাইন করা হয়েছে, যেখানে একটি ক্ষতিকারক অ্যাপ আপনার অ্যাপের টাস্কের মধ্যে একটি অ্যাক্টিভিটি চালু করে সেটির ছদ্মবেশ ধারণ করতে এবং ব্যবহারকারীর ডেটা চুরি করতে পারে।
সুরক্ষা সক্ষম করা
আপনার অ্যাপ্লিকেশনের জন্য ASM অপ্ট-ইন এবং সক্রিয় করতে, আপনার AndroidManifest.xml ফাইলে android:allowCrossUidActivitySwitchFromBelow অ্যাট্রিবিউটটিকে false-এ সেট করুন। এটি একটি অ্যাপ্লিকেশন-স্তরের সেটিং যা ডিফল্টরূপে আপনার অ্যাপের সমস্ত অ্যাক্টিভিটিকে সুরক্ষিত রাখে।
নির্দিষ্ট কার্যকলাপের জন্য ব্যতিক্রম তৈরি করা
যদি আপনি আপনার অ্যাপের জন্য এটি সক্রিয় করে থাকেন কিন্তু অন্য অ্যাপগুলোকে একটি নির্দিষ্ট, বিশ্বস্ত অ্যাক্টিভিটি চালু করার অনুমতি দিতে চান, তাহলে আপনি একটি টার্গেটেড এক্সেপশন তৈরি করতে পারেন। এই সুরক্ষা থেকে একটিমাত্র অ্যাক্টিভিটিকে অব্যাহতি দিতে, সেই অ্যাক্টিভিটির onCreate() মেথডের মধ্যে setAllowCrossUidActivitySwitchFromBelow(true) কল করুন। এর ফলে শুধুমাত্র সেই একটি অ্যাক্টিভিটি চালু করা যাবে এবং আপনার অ্যাপের বাকি অংশ সুরক্ষিত থাকবে।
সমস্যা সমাধান
রেগুলার এক্সপ্রেশন ব্যবহার করে প্রাসঙ্গিক মেসেজ খুঁজে পেতে লগক্যাট ফিল্টার করুন। প্রায়শই ActivityTaskManager ট্যাগটি ব্যবহৃত হয়, এবং ActivityTaskManager দিয়ে ফিল্টার করলে লগগুলোকে আলাদা করতে সাহায্য হতে পারে।
গুরুত্বপূর্ণ লগ বার্তাগুলি বোঝা
অবরুদ্ধ সূচনা (ত্রুটি) : এই বার্তাটি নির্দেশ করে যে একটি কার্যকলাপ শুরু হতে বাধা দেওয়া হয়েছে।
- অর্থ : একটি অ্যাক্টিভিটি শুরু করার অনুমতি দেওয়া হয়নি কারণ প্রেরক (SDK 34+ এর জন্য) অথবা নির্মাতা (SDK 35+ এর জন্য) -এর যেকোনো একজনের পক্ষ থেকে প্রয়োজনীয় PendingIntent অপ্ট-ইন অনুপস্থিত ছিল।
- করণীয় : আপনাকে অবশ্যই আপনার কোড আপডেট করে সঠিক ActivityOptions অপ্ট-ইন অন্তর্ভুক্ত করতে হবে।
লগগুলো বিশ্লেষণ করার সময় এই ক্ষেত্রগুলো যাচাই করুন:
- realCallingPackage : যে অ্যাপটি PendingIntent-টি পাঠিয়েছে। এটিই প্রেরক ।
- callingPackage : যে অ্যাপটি PendingIntent-টি তৈরি করেছে। এটিই হলো সৃষ্টিকর্তা ।
কঠোর মোড
অ্যান্ড্রয়েড ১৬ থেকে শুরু করে, অ্যাপ ডেভেলপাররা স্ট্রিক্ট মোড চালু করতে পারেন, যার ফলে কোনো অ্যাক্টিভিটি চালু হওয়া ব্লক হয়ে গেলে (অথবা অ্যাপটির টার্গেট SDK চালু হলে ব্লক হওয়ার ঝুঁকিতে থাকলে) নোটিফিকেশন পাওয়া যায়।
আপনার অ্যাপ্লিকেশন, অ্যাক্টিভিটি বা অন্য কোনো অ্যাপ্লিকেশন কম্পোনেন্টের Application.onCreate() মেথড থেকে শুরুতেই সক্রিয় করার জন্য উদাহরণ কোড:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectBlockedBackgroundActivityLaunch()
.penaltyLog()
.build());
)
}