जब भी मुझे फायरबेस से साइलेंट-पुश नोटिफिकेशन प्राप्त होता है, तो मुझे हर बार सर्वर पर अपना जीपीएस-लोकेशन भेजने में सक्षम होना चाहिए। सूचना भेजने का टाइमर वर्तमान में हर 10 मिनट पर सेट है। जब फोन चार्ज हो रहा हो तो यह कोई समस्या नहीं है, लेकिन जब यह निष्क्रिय होता है और एप्लिकेशन पृष्ठभूमि में होता है, तो FirebaseMessagingService से प्राप्त ऑनमैसेज केवल हर कुछ घंटों में कॉल किया जाता है। इससे मुझे विश्वास होता है कि एंड्रॉइड 9.0 के लिए नए पावर प्रबंधन नियमों के साथ इसका कुछ संबंध है। लेकिन मेरे आवेदन के काम करने के लिए मुझे हर 10 मिनट में अपना स्थान भेजने में सक्षम होना चाहिए। कभी-कभी ही नहीं।

मैंने Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS का उपयोग करके बैटरी अनुकूलन को 'अनुकूलित नहीं' पर सेट करने का प्रयास किया है
इसका कोई असर नहीं दिख रहा है।

मैंने फायरबेस अधिसूचना की प्राथमिकता को उच्च पर सेट करने का भी प्रयास किया। यह काम करता है, लेकिन प्रति दिन केवल 10 संदेशों के लिए, जिसका अर्थ है कि यह मेरे आवेदन का समाधान नहीं है। (स्रोत: पावर प्रबंधन प्रतिबंध)

अब मैं अग्रभूमि सेवा खोलकर हमेशा 'सक्रिय' बाल्टी में एप्लिकेशन रखने का प्रयास कर रहा हूं। यह सुनिश्चित करना चाहिए कि ऐप कभी भी किसी अन्य बकेट में न हो, जहाँ सूचनाओं को कुछ घंटों के लिए स्थगित किया जा सकता है।

यदि उपयोगकर्ता वर्तमान में ऐप का उपयोग कर रहा है, तो ऐप सक्रिय बकेट में है, उदाहरण के लिए:

  • ऐप ने एक गतिविधि शुरू की है
  • ऐप एक अग्रभूमि सेवा चला रहा है
  • ऐप में एक अग्रभूमि ऐप द्वारा उपयोग की जाने वाली सामग्री प्रदाता से संबद्ध एक सिंक एडेप्टर है
  • उपयोगकर्ता ऐप से अधिसूचना पर क्लिक करता है

यदि कोई ऐप सक्रिय बकेट में है, तो सिस्टम ऐप के जॉब, अलार्म या FCM संदेशों पर कोई प्रतिबंध नहीं लगाता है।

(Source: Power Buckets Android9)

यह एक समाधान की तरह प्रतीत नहीं होता है जो मुझे चाहिए, हालांकि, क्योंकि यह सर्वोत्तम अभ्यास नहीं हो सकता है। और यह वैसे भी काम नहीं करता प्रतीत होता है।

यह मेरा ऑनमैसेज रिसीव्ड फंक्शन है:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

        Map<String, String> params = remoteMessage.getData();
        JSONObject object = new JSONObject(params);

        PushNotificationManager.getInstance().handlePushNotification(object, getApplicationContext());
    }
}

अभी मैं इस बात से अनजान हूं कि फायरबेस संदेश ऑनमैसेज रिसीव्ड फ़ंक्शन में क्यों प्रवेश नहीं करते हैं।

3
Tim 1 1 जुलाई 2019, 13:31

2 जवाब

सबसे बढ़िया उत्तर

अलार्ममैनेजर का उपयोग करके फिक्स्ड। 10 मिनट में अलार्म शेड्यूल करें, और अलार्म के भीतर कोड पूरा करते समय, 10 मिनट में एक नया अलार्म शेड्यूल करें।

अलार्ममैनेजर फोन को जगा सकता है यदि वह डोज मोड में है, जिसका अर्थ है कि ट्रिगर के अंदर सभी कोड ठीक से निष्पादित होंगे।

0
Tim 1 22 अगस्त 2019, 15:41

टिम, मुझे लगता है कि मुख्य समस्या यह है कि आप पुश अधिसूचना कैसे भेजते हैं और इसकी सामग्री क्या है। अगर आप यहां देखें - https://firebase.google.com/docs/cloud -मैसेजिंग/एंड्रॉइड/प्राप्त करें आप देखेंगे कि अगर मैसेज में नोटिफिकेशन डेटा है और ऐप बैकग्राउंड में है तो पुश नोटिफिकेशन नोटिफिकेशन एरिया में चला जाता है। आपको एक पुश सूचना भेजनी होगी जिसमें केवल डेटा हो: (यहां आप विभिन्न प्रकारों के बारे में अधिक जानकारी प्राप्त कर सकते हैं - https:// firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages) यहां बताया गया है कि इसे कैसे ट्रिगर किया जाए- क्लाउड फ़ंक्शन या आपके ऐप सर्वर जैसे विश्वसनीय वातावरण में, व्यवस्थापक SDK या FCM सर्वर प्रोटोकॉल का उपयोग करें: केवल डेटा कुंजी सेट करें।

कृपया ध्यान दें कि यदि आपको लंबे समय तक चलने वाला ऑपरेशन करने की आवश्यकता है, तो आपको एक अलग सेवा शुरू करने की आवश्यकता होगी (सेवा को अधिसूचना क्षेत्र में एक अधिसूचना प्रस्तुत करनी चाहिए कि यह चल रहा है, अन्यथा आपको नए एंड्रॉइड संस्करणों पर क्रैश मिल जाएगा)

1
Yanislav Mihaylov 1 जुलाई 2019, 16:03