गतिविधि की सुरक्षा

Android, उपयोगकर्ताओं को नुकसान पहुंचाने वाले ऐप्लिकेशन से बचाता है. साथ ही, भरोसेमंद यूज़र इंटरफ़ेस (यूआई) का अनुभव देता है. ऐक्टिविटी सुरक्षा फ़्रेमवर्क में, नियम और प्लैटफ़ॉर्म पर लगी पाबंदियां शामिल होती हैं. इन नियमों और पाबंदियों की मदद से, यूज़र इंटरफ़ेस (यूआई) में होने वाली अनचाही रुकावटों, टास्क हाइजैकिंग, और सुरक्षा से जुड़े अन्य खतरों को रोका जा सकता है. ये खतरे, स्क्रीन पर ऐप्लिकेशन के कॉम्पोनेंट दिखने के समय और तरीके से जुड़े होते हैं. इस फ़्रेमवर्क का एक अहम कॉम्पोनेंट, बैकग्राउंड से ऐक्टिविटी शुरू करने पर पाबंदी लगाता है.

बैकग्राउंड में ऐक्टिविटी लॉन्च करने पर लगी पाबंदियां

बैकग्राउंड में ऐक्टिविटी लॉन्च (बीएएल) तब होती है, जब फ़ोरग्राउंड में मौजूद न होने वाला कोई ऐप्लिकेशन, दिखने वाली कोई भी ऐक्टिविटी न होने पर, या किसी दूसरे ऐप्लिकेशन से मिला PendingIntent, नई ऐक्टिविटी शुरू करने की कोशिश करता है. इसे बैकग्राउंड में ऐक्टिविटी लॉन्च (बीएएल) कहा जाता है. हालांकि, इसके सही इस्तेमाल के उदाहरण भी मौजूद हैं. जैसे, अलार्म क्लॉक ऐप्लिकेशन का शुरू होना. वहीं, बीएएल पर पाबंदी न होने से, उपयोगकर्ताओं को खराब अनुभव मिलता है और सुरक्षा से जुड़ी समस्याएं पैदा होती हैं.

इन पर पाबंदी क्यों लगाई जाती है?

Android 10 (एपीआई लेवल 29) से, प्लैटफ़ॉर्म ने इस पर पाबंदियां लगाई हैं कि ऐप्लिकेशन, बैकग्राउंड से कब ऐक्टिविटी शुरू कर सकते हैं. इन सुरक्षा सुविधाओं से, नुकसान पहुंचाने वाले ऐप्लिकेशन के व्यवहार को रोकने में मदद मिलती है. साथ ही, आम तौर पर होने वाले गलत इस्तेमाल को कम करके, उपयोगकर्ता अनुभव को बेहतर बनाया जा सकता है. इनमें ये शामिल हैं:

  • यूज़र इंटरफ़ेस (यूआई) हाइजैकिंग और पॉप-अप विज्ञापन: बैकग्राउंड में चल रहा कोई ऐप्लिकेशन, अचानक से ऐसी ऐक्टिविटी (आम तौर पर, कोई विज्ञापन) लॉन्च करता है जो फ़िलहाल उपयोगकर्ता के साथ इंटरैक्ट कर रहे ऐप्लिकेशन के ऊपर दिखती है. इससे उपयोगकर्ता का सेशन हाइजैक हो जाता है.
  • फ़िशिंग और धोखाधड़ी: बैकग्राउंड में चल रहा कोई ऐप्लिकेशन, ऐसी ऐक्टिविटी लॉन्च करता है जो किसी दूसरे ऐप्लिकेशन की नकल करती है. उदाहरण के लिए, किसी असली ऐप्लिकेशन के लिए नकली लॉगिन स्क्रीन. इससे उपयोगकर्ता की क्रेडेंशियल चुराई जा सकती हैं. ऐसा अक्सर "ऐक्टिविटी सैंडविच" के ज़रिए किया जाता है. इसमें, नुकसान पहुंचाने वाली ऐक्टिविटी को असली ऐप्लिकेशन के टास्क स्टैक में डाला जाता है.
  • टैपजैकिंग: बैकग्राउंड में चल रहा कोई ऐप्लिकेशन, किसी दूसरे ऐप्लिकेशन के ऊपर पारदर्शी या धुंधली ऐक्टिविटी दिखाता है, ताकि उपयोगकर्ता के टैप को इंटरसेप्ट किया जा सके और उन्हें अनचाही कार्रवाइयां करने के लिए फंसाया जा सके.
  • ऐप्लिकेशन को चालू करना: किसी एक ऐप्लिकेशन का बैकग्राउंड कॉम्पोनेंट, दूसरे ऐप्लिकेशन के फ़ोरग्राउंड कॉम्पोनेंट को चालू करता है, ताकि हर दिन सक्रिय उपयोगकर्ताओं की मेट्रिक को गैर-कानूनी तरीके से बढ़ाया जा सके.

फ़ोरग्राउंड सेवाएं (जारी रहने वाले टास्क के लिए)

अगर आपके ऐप्लिकेशन को बैकग्राउंड में लंबे समय तक चलने वाला कोई टास्क पूरा करना है और उपयोगकर्ता को इस बारे में पता होना चाहिए, तो आपको फ़ोरग्राउंड सेवा का इस्तेमाल करना चाहिए. जैसे, संगीत चलाना या वर्कआउट को ट्रैक करना. फ़ोरग्राउंड सेवा को लगातार एक सूचना दिखानी होगी, जिसे उपयोगकर्ता बंद नहीं कर सकता. इस सूचना में इंटरैक्टिव कंट्रोल दिए जा सकते हैं. जैसे, किसी म्यूज़िक ऐप्लिकेशन के लिए, चलाएं/रोकें बटन. इससे उपयोगकर्ता को जानकारी मिलती है और वह कंट्रोल कर पाता है. हालांकि, इससे उपयोगकर्ता को पूरी स्क्रीन पर दिखने वाली ऐक्टिविटी से कोई रुकावट नहीं होती.

इस क्रम का पालन करके, उपयोगकर्ताओं के लिए बेहतर और ज़्यादा अनुमानित अनुभव बनाया जा सकता है. इसके लिए, सामान्य सूचनाओं से शुरुआत करें और सिर्फ़ ज़रूरत पड़ने पर, ज़्यादा रुकावट डालने वाले विकल्पों का इस्तेमाल करें.

बैकग्राउंड में ऐक्टिविटी शुरू करने की अनुमति कब दी जाती है (अपवाद)

अगर इनमें से कोई एक शर्त पूरी होती है, तो कोई ऐप्लिकेशन बैकग्राउंड से ऐक्टिविटी शुरू कर सकता है:

  • ऐप्लिकेशन में दिखने वाली कोई विंडो हो. जैसे, फ़ोरग्राउंड में कोई ऐक्टिविटी.
  • ऐप्लिकेशन, मौजूदा इनपुट के तरीके का एडिटर (IME) हो.
  • ऐक्टिविटी, सिस्टम से भेजे गए PendingIntent से शुरू की गई हो. उदाहरण के लिए, सूचना पर टैप करने से.
  • ऐप्लिकेशन को, उपयोगकर्ता ने SYSTEM_ALERT_WINDOW की अनुमति दी हो.
  • ऐप्लिकेशन को, START_ACTIVITIES_FROM_BACKGROUND की अनुमति दी गई हो.
  • ऐप्लिकेशन, ऐसी सेवा से जुड़ा हो जिसे बैकग्राउंड में ऐक्टिविटी शुरू करने की अनुमति दी गई हो.
  • लॉन्च, डिवाइस के लॉन्चर ऐप्लिकेशन से शुरू किया गया हो. जैसे, जब कोई उपयोगकर्ता किसी ऐप्लिकेशन के आइकॉन पर टैप करता है या किसी विजेट के साथ इंटरैक्ट करता है.
  • लॉन्च, ऑपरेटिंग सिस्टम के किसी ऐसे अहम हिस्से से किया गया हो जो हर समय चलता रहना चाहिए. जैसे, टेलीफ़ोनी सेवा से इनकमिंग कॉल स्क्रीन शुरू करना.

सुरक्षा के लिए नई ज़रूरी शर्तें और ऑप्ट-इन करने की ज़रूरी शर्तें

सुरक्षा को और बेहतर बनाने के लिए, Android ने ज़्यादा सख्त नियम लागू किए हैं. इनके तहत, PendingIntent और IntentSender का इस्तेमाल करके ऐक्टिविटी लॉन्च करने वाले ऐप्लिकेशन के लिए, साफ़ तौर पर ऑप्ट-इन करना ज़रूरी है. लॉन्च की अनुमति सिर्फ़ तब दी जाती है, जब PendingIntent बनाने वाला ऐप्लिकेशन या उसे भेजने वाला ऐप्लिकेशन, बैकग्राउंड में लॉन्च करने के अपने खास अधिकारों को अनुमति देने के लिए ऑप्ट-इन करता है.

ज़्यादातर मामलों में, PendingIntent भेजने वाले ऐप्लिकेशन को ऑप्ट-इन करना चाहिए, क्योंकि आम तौर पर यह वही ऐप्लिकेशन होता है जिससे उपयोगकर्ता सीधे इंटरैक्ट कर रहा होता है. उदाहरण के लिए, किसी बटन पर टैप करना.

PendingIntent के लिए, भेजने वाले को ऑप्ट-इन करना होगा

जब आपका ऐप्लिकेशन, Android 14 (एपीआई लेवल 34) या इसके बाद के वर्शन को टारगेट करता है, तो PendingIntent भेजते समय, यह डिफ़ॉल्ट रूप से बीएएल के अपने खास अधिकार नहीं देता. अगर आपने साफ़ तौर पर ऑप्ट-इन नहीं किया है, तो ऐक्टिविटी लॉन्च ब्लॉक किया जा सकता है. हालांकि, ऐसा तब नहीं होगा, जब PendingIntent बनाने वाले ने पहले ही अपने खास अधिकार दे दिए हों.

लॉन्च को सफल बनाने के लिए, भेजने वाले को अपने खास अधिकार देने के लिए ऑप्ट-इन करना चाहिए. इसके लिए, उसे ActivityOptions.setPendingIntentBackgroundActivityStartMode() को कॉल करना चाहिए. साथ ही, सुझाया गया मोड ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE (जो एसडीके 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 के लिए, बनाने वाले को ऑप्ट-इन करना होगा

जब आपका ऐप्लिकेशन, Android 15 (एपीआई लेवल 35) या इसके बाद के वर्शन को टारगेट करता है, तो PendingIntent बनाने वाला कोई ऐप्लिकेशन, डिफ़ॉल्ट रूप से बैकग्राउंड में लॉन्च करने के अपने खास अधिकार नहीं देता. भेजने वाले को आपके ऐप्लिकेशन के बीएएल के खास अधिकार इस्तेमाल करने की अनुमति देने के लिए, आपको साफ़ तौर पर ऑप्ट-इन करना होगा.

खास अधिकार देने के लिए, 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 का इस्तेमाल करके ऐक्टिविटी लॉन्च करने पर भी, बीएएल पर लगी वही पाबंदियां लागू होती हैं. IntentSender को PendingIntent.getIntentSender के ज़रिए मिलता है. इसलिए, इस पर भी ऑप्ट-इन करने की ज़रूरी शर्तें लागू होती हैं.

  • Android 14 (एपीआई 34) से, 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())
  • Android 17 (एपीआई 37+) से, 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())

सीक्वेंस डायग्राम: बीएएल पर लगी पाबंदियां

अनुरोधों की मंज़ूरी बाकी है टेबल
दूसरी इमेज: PendingIntent का इस्तेमाल करके, किसी ऐक्टिविटी को सुरक्षित तरीके से लॉन्च करने की प्रोसेस

इस डायग्राम में, PendingIntent का इस्तेमाल करके, किसी ऐक्टिविटी को सुरक्षित तरीके से लॉन्च करने की प्रोसेस दिखाई गई है. लॉन्च तभी सफल होता है, जब खास अधिकारों की मान्य चेन हो. इसमें, हिस्सा लेने वाले कम से कम एक ऐप्लिकेशन, अपने खास अधिकार देता हो और उसके पास बैकग्राउंड से ऐक्टिविटी लॉन्च करने की क्षमता हो

  1. बनाना और सौंपना (ऐप्लिकेशन A - बनाने वाला)
    1. बनाने वाला ऐप्लिकेशन, PendingIntent बनाता है
    2. अगर टारगेट एसडीके 35 या इसके बाद का वर्शन है, तो बनाने वाले को बीएएल के अपने खास अधिकार साफ़ तौर पर सौंपने होंगे. इसके लिए, उसे setPendingIntentCreatorBackgroundActivityStartMode() का इस्तेमाल करना होगा. ऐसा तब करना होगा, जब वह अपने खास अधिकारों का इस्तेमाल करना चाहता हो. डिफ़ॉल्ट रूप से, कोई खास अधिकार नहीं सौंपा जाता.
    3. इसके बाद, PendingIntent को किसी दूसरे ऐप्लिकेशन (ऐप्लिकेशन B) को भेजा जाता है
  2. लॉन्च करना और योगदान देना (ऐप्लिकेशन B - भेजने वाला)
    1. कुछ समय बाद, भेजने वाला ऐप्लिकेशन, PendingIntent.send() को कॉल करके लॉन्च शुरू करता है.
    2. अगर टारगेट एसडीके 34 या इसके बाद का वर्शन है, तो भेजने वाले को अपने खास अधिकार साफ़ तौर पर देने होंगे. इसके लिए, उसे setPendingIntentBackgroundActivityStartMode() का इस्तेमाल करना होगा. ऐसा तब करना होगा, जब वह अपने खास अधिकारों का इस्तेमाल करना चाहता हो. डिफ़ॉल्ट रूप से, कोई खास अधिकार नहीं सौंपा जाता.
  3. Android सिस्टम की सुरक्षा से जुड़ी पुष्टि
    1. Android सिस्टम, लॉन्च के अनुरोध को इंटरसेप्ट करता है और सुरक्षा की जांच करता है.
    2. यह दो शर्तों का आकलन करता है:
    3. क्या बनाने वाले ने अपने खास अधिकार सौंपे हैं और क्या बनाने वाला ऐप्लिकेशन फ़िलहाल बीएएल के सामान्य अपवादों में से किसी एक को पूरा करता है?
    4. क्या भेजने वाले ने अपने खास अधिकार दिए हैं और क्या भेजने वाला ऐप्लिकेशन फ़िलहाल बीएएल के सामान्य अपवादों में से किसी एक को पूरा करता है?
  4. नतीजा
    1. अनुमति मिली: अगर तीसरे चरण में दी गई दोनों शर्तों में से कम से कम एक पूरी होती है, तो खास अधिकारों की चेन की पुष्टि हो जाती है. Android सिस्टम, टारगेट ऐक्टिविटी शुरू करता है. साथ ही, भेजने वाले को सफलता का नतीजा मिलता है.
    2. ब्लॉक किया गया: अगर कोई भी शर्त पूरी नहीं होती है, तो सिस्टम लॉन्च को ब्लॉक कर देता है. भेजने वाले ऐप्लिकेशन को, सीधे तौर पर कोई रिटर्न वैल्यू या गड़बड़ी का मैसेज नहीं मिलता, जिससे यह पता चले कि लॉन्च नहीं हो पाया. इसके बजाय, Android सिस्टम, Logcat में "Background activity launch blocked!" मैसेज को इंटरनल तौर पर लॉग करता है. डेवलपर को डीबग करने के लिए, इसकी जांच करनी होगी.

टास्क हाइजैकिंग को रोकना

टास्क हाइजैकिंग के हमलों (जैसे, "ऐक्टिविटी सैंडविच") को रोकने के लिए, Android 15 में एपीआई लेवल 37 या इसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए नए नियम लागू किए गए हैं.

  • पहला नियम: किसी एक टास्क में, कोई ऐक्टिविटी सिर्फ़ किसी दूसरी ऐक्टिविटी से लॉन्च की जा सकती है. यह दूसरी ऐक्टिविटी, उसी ऐप्लिकेशन की होनी चाहिए (यानी, उसका यूआईडी वही होना चाहिए) जो टास्क में फ़िलहाल सबसे ऊपर मौजूद ऐक्टिविटी का है.
  • दूसरा नियम: सिर्फ़ फ़ोरग्राउंड टास्क में मौजूद कोई ऐक्टिविटी, नया टास्क बना सकती है या किसी दूसरे, मौजूदा टास्क को फ़ोरग्राउंड में ला सकती है. हालांकि, इसके लिए ज़रूरी है कि उस ऐक्टिविटी का यूआईडी, सबसे ऊपर मौजूद ऐक्टिविटी के यूआईडी से मेल खाता हो.

टास्क में सुरक्षा के लिए, डेवलपर को ऑप्ट-इन करना होगा

इस सुविधा को टारगेट एसडीके 37 से चालू किया जा सकता है. इसे चालू करने के लिए, आपको साफ़ तौर पर ऑप्ट-इन करना होगा. इसे टास्क हाइजैकिंग (या ऐक्टिविटी सैंडविचिंग) को रोकने के लिए डिज़ाइन किया गया है. इसमें, नुकसान पहुंचाने वाला कोई ऐप्लिकेशन, आपके ऐप्लिकेशन के टास्क में कोई ऐक्टिविटी लॉन्च करके, उसकी नकल कर सकता है और उपयोगकर्ता का डेटा चुरा सकता है.

सुरक्षा सुविधाओं को चालू करना

अपने ऐप्लिकेशन के लिए एएसएम को ऑप्ट-इन करने और चालू करने के लिए, अपनी AndroidManifest.xml फ़ाइल में android:allowCrossUidActivitySwitchFromBelow एट्रिब्यूट को 'false' पर सेट करें. यह ऐप्लिकेशन-लेवल की सेटिंग है, जो डिफ़ॉल्ट रूप से आपके ऐप्लिकेशन की सभी ऐक्टिविटी को सुरक्षित रखती है.

खास ऐक्टिविटी के लिए अपवाद बनाना

अगर आपने अपने ऐप्लिकेशन के लिए इसे चालू किया है, लेकिन आपको किसी खास और भरोसेमंद ऐक्टिविटी को दूसरे ऐप्लिकेशन से लॉन्च करने की अनुमति देनी है, तो आपके पास टारगेट किया गया अपवाद बनाने का विकल्प है. किसी एक ऐक्टिविटी को इस सुरक्षा से छूट देने के लिए, उस ऐक्टिविटी के onCreate() तरीके में setAllowCrossUidActivitySwitchFromBelow(true) को कॉल करें. इससे उस एक ऐक्टिविटी को लॉन्च किया जा सकेगा, जबकि आपके ऐप्लिकेशन के बाकी हिस्से सुरक्षित रहेंगे.

समस्या का हल

रेगुलर एक्सप्रेशन का इस्तेमाल करके, काम के मैसेज ढूंढने के लिए Logcat को फ़िल्टर करें. अक्सर ActivityTaskManager टैग का इस्तेमाल किया जाता है. ActivityTaskManager के हिसाब से फ़िल्टर करने पर, लॉग को अलग करने में मदद मिल सकती है.

लॉग के अहम मैसेज के बारे में जानकारी

लॉन्च ब्लॉक किया गया (गड़बड़ी): इस मैसेज से पता चलता है कि ऐक्टिविटी लॉन्च को ब्लॉक किया गया है.

लॉग का विश्लेषण करते समय, इन फ़ील्ड की जांच करें:

  • realCallingPackage: वह ऐप्लिकेशन जिसने PendingIntent भेजा है. यह भेजने वाला है.
  • callingPackage: वह ऐप्लिकेशन जिसने PendingIntent बनाया है. यह बनाने वाला है.

स्ट्रिक्ट मोड

Android 16 से, ऐप्लिकेशन डेवलपर, स्ट्रिक्ट मोड को चालू कर सकता है. इससे उसे तब सूचना मिलेगी, जब ऐक्टिविटी लॉन्च को ब्लॉक किया जाएगा. इसके अलावा, उसे तब भी सूचना मिलेगी, जब ऐप्लिकेशन के टारगेट एसडीके को बढ़ाने पर, ऐक्टिविटी लॉन्च ब्लॉक होने का खतरा होगा.

अपने ऐप्लिकेशन, ऐक्टिविटी या ऐप्लिकेशन के अन्य कॉम्पोनेंट के Application.onCreate() तरीके में, स्ट्रिक्ट मोड को शुरू से ही चालू करने के लिए, कोड का उदाहरण:

override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     StrictMode.setVmPolicy(
         StrictMode.VmPolicy.Builder()
         .detectBlockedBackgroundActivityLaunch()
         .penaltyLog()
         .build());
     )
 }