android डाउनलोड - अलार्म को रीसेट करने के लिए मेरे एंड्रॉइड एप्लिकेशन को कैसे अपग्रेड किया गया है?




सेटिंग चाहिए (5)

मैंने कभी यह कोशिश नहीं की है, लेकिन BroadcastReceiver ACTION_PACKAGE_REPLACED बनाने के बारे में क्या है जो ACTION_PACKAGE_REPLACED इरादे को सुनता है?

मैंने पहले यह कोशिश करने के बारे में सोचा है, लेकिन मुझे यकीन नहीं है कि इसमें चिकन-एंड-अंडे की समस्या है या नहीं (उदाहरण के लिए, नए अपग्रेड किए गए एप्लिकेशन को प्राप्त करने से पहले इरादा भेजा जा सकता है?)। हालांकि, कोशिश करने के लायक है।

मैंने देखा कि अलार्म अक्षम है जब इस अलार्म को सेट करने वाला एप्लिकेशन अपग्रेड कर दिया गया है। क्या यह सच है ?

अब तक, मैंने यह जानने के लिए कि यह मेरे आवेदन का पहला भाग है या नहीं, मैंने FIRST_RUN कुंजी के साथ SharedPreferences किए गए SharedPreferences उपयोग किया था। अगर मुझे यह कुंजी नहीं मिलती है, तो मैं अलार्म को सक्षम करता हूं और FIRST_RUN को गलत पर सेट करता FIRST_RUN , अन्यथा मैं कुछ नहीं करता हूं।

लेकिन मैंने यह भी देखा कि ऐप अपग्रेड के बीच ये वरीयताएं बरकरार रहती हैं!

तो अपग्रेड के बाद, FIRST_RUN कुंजी पहले से ही गलत है, इसलिए मेरे अलार्म को सक्षम होने की आवश्यकता होने पर मैं कुछ भी नहीं करता।

ऐसे मामले को कैसे संभालें?

अग्रिम में धन्यवाद


डैनियल लुई द्वारा समाधान:

मेनिफेस्ट में निम्न पंक्तियों के साथ एक रिसीवर की आवश्यकता है:

<receiver android:name=".OnUpgradeReceiver">
  <intent-filter>
    <action android:name="android.intent.action.PACKAGE_REPLACED" />
    <data android:scheme="package" android:path="your.app.package" />
  </intent-filter>
</receiver>

android:path किसी भी एप्लिकेशन के किसी भी अपग्रेड द्वारा OnUpgradeReceiver अपग्रेड OnUpgradeReceiver को ट्रिगर करने के लिए android:path का उपयोग किया जाता है।



बस, android.intent.action.MY_PACKAGE_REPLACED को सुनें ... यह INTENT आपको सूचित करेगा यदि आपके आवेदन का एक नया संस्करण मौजूदा पर स्थापित किया गया है

नोट: यह इरादा एपीआई 12 से शुरू हो सकता है


मैं एक गतिविधि के अंदर से निम्नलिखित का उपयोग करता हूं:

private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

और मैं इसका उपयोग कर कॉल करता हूं:

isMyServiceRunning(MyService.class)

यह विश्वसनीय रूप से काम करता है, क्योंकि यह ActivityManager#getRunningServices माध्यम से एंड्रॉइड ऑपरेटिंग सिस्टम द्वारा प्रदान की जाने वाली सेवाओं के बारे में जानकारी पर आधारित है।

ऑनस्ट्रोय या ऑनमेटिंग इवेंट्स या बाइंडर्स या स्टेटिक वेरिएबल्स का उपयोग करने वाले सभी दृष्टिकोण विश्वसनीय रूप से काम नहीं करेंगे क्योंकि एक डेवलपर के रूप में आप कभी नहीं जानते हैं, जब एंड्रॉइड आपकी प्रक्रिया को मारने का फैसला करता है या उल्लिखित कॉलबैक कहलाता है या नहीं। एंड्रॉइड दस्तावेज में लाइफसाइकिल इवेंट टेबल में "मारने योग्य" कॉलम पर ध्यान दें।





android