एंड्रॉइड पर सभी नवीनतम प्रतिबंधों के बाद एक सटीक समय पर निर्धारित होने के लिए अलार्म कैसे सेट करें?


27

नोट: मैंने विभिन्न समाधानों की कोशिश की जो स्टैकऑवरफ़्लो (उदाहरण यहाँ ) पर यहाँ लिखे गए हैं । कृपया बिना जांचे इसे बंद कर दें कि आपके द्वारा लिखी गई परीक्षा का उपयोग करके आपके द्वारा किए गए कार्यों से आपका समाधान नीचे लिखा है।

पृष्ठभूमि

ऐप पर एक आवश्यकता है, कि उपयोगकर्ता एक विशिष्ट समय पर शेड्यूल किया जाने वाला रिमाइंडर सेट करता है, इसलिए जब ऐप इस समय चालू हो जाता है, तो यह पृष्ठभूमि में कुछ छोटा करता है (बस कुछ DB क्वेरी ऑपरेशन), और एक दिखाता है सरल अधिसूचना, अनुस्मारक के बारे में बताने के लिए।

अतीत में, मैंने अपेक्षाकृत विशिष्ट समय पर अनुसूचित होने के लिए कुछ सेट करने के लिए एक सरल कोड का उपयोग किया था:

            val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
            val pendingIntent = PendingIntent.getBroadcast(context, requestId, Intent(context, AlarmReceiver::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
            when {
                VERSION.SDK_INT >= VERSION_CODES.KITKAT -> alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
                else -> alarmManager.set(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
            }
class AlarmReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        Log.d("AppLog", "AlarmReceiver onReceive")
        //do something in the real app
    }
}

उपयोग:

            val timeToTrigger = System.currentTimeMillis() + java.util.concurrent.TimeUnit.MINUTES.toMillis(1)
            setAlarm(this, timeToTrigger, 1)

समस्या

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

मैंने अलार्म सेट करने के बारे में डॉक्स पर पढ़ा है , कि यह ऐप्स के लिए प्रतिबंधित हो गया है ताकि यह बहुत बार घटित न हो, लेकिन यह यह नहीं बताता है कि विशिष्ट समय पर अलार्म कैसे सेट किया जाए, और यह स्पष्ट नहीं करता है कैसे आता है Google का क्लॉक ऐप इसे करने में सफल होता है।

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

यह देखते हुए कि कई अलार्म क्लॉक ऐप अब काम नहीं करते हैं, जैसा कि वे करते थे, मुझे लगता है कि कुछ ऐसा है जो डॉक्स पर गायब है। ऐसे ऐप्स का उदाहरण लोकप्रिय टाइमली ऐप है जिसे Google द्वारा खरीदा गया था लेकिन नए प्रतिबंधों को संभालने के लिए कभी भी नए अपडेट नहीं मिले और अब उपयोगकर्ता इसे वापस चाहते हैं। । हालाँकि, कुछ लोकप्रिय ऐप ठीक काम करते हैं, जैसे कि यह

मैंने क्या कोशिश की है

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

  1. परीक्षण जब ऐप अग्रभूमि में होता है, तो उपयोगकर्ता को दिखाई देता है। - 1-2 मिनट लगे।
  2. जब ऐप को पृष्ठभूमि पर भेजा गया था (उदाहरण के लिए होम बटन का उपयोग करके) परीक्षण करें - लगभग 1 मिनट लग गया
  3. परीक्षण करें जब ऐप का कार्य हाल के कार्यों से हटा दिया गया था। - मैंने 20 मिनट से ज्यादा इंतजार किया और अलार्म बजने पर, लॉग से लिखते हुए नहीं देखा।
  4. # 3 की तरह, लेकिन स्क्रीन को भी बंद कर दें। यह शायद बदतर होगा ...

मैंने अगली चीजों का उपयोग करने की कोशिश की, सभी काम नहीं करते हैं:

  1. alarmManager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingIntent), pendingIntent)

  2. alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)

  3. AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)

  4. उपरोक्त में से किसी के साथ, का संयोजन:

    if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) alarmManager.setWindow(AlarmManager.RTC_WAKEUP, 0, 60 * 1000L, pendingIntent)

  5. ब्रॉडकास्टसीवर के बजाय एक सेवा का उपयोग करने की कोशिश की। एक अलग प्रक्रिया पर भी कोशिश की।

  6. एप्लिकेशन को बैटरी ऑप्टिमाइज़ेशन से अनदेखा करने की कोशिश की गई (मदद नहीं मिली), लेकिन चूंकि अन्य ऐप्स को इसकी आवश्यकता नहीं है, इसलिए मुझे इसका उपयोग नहीं करना चाहिए।

  7. इसका उपयोग करने की कोशिश की:

            if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP)
                alarmManager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingIntent), pendingIntent)
            AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
  1. ऐसी सेवा करने की कोशिश की जिसमें अलार्म को फिर से शेड्यूल करने के लिए onTaskRemoved का ट्रिगर होगा, लेकिन इससे भी मदद नहीं मिली (सेवा ने हालांकि ठीक काम किया)।

Google के क्लॉक ऐप के लिए, मुझे इसके बारे में कुछ विशेष नहीं दिखाई दिया, सिवाय इसके कि यह ट्रिगर होने से पहले एक सूचना दिखाता है, और मैं इसे बैटरी-ऑप्टिमाइज़ेशन सेटिंग स्क्रीन के "अनुकूलित नहीं" अनुभाग में भी नहीं देखता।

यह देखकर कि यह एक बग की तरह लगता है, मैंने इस बारे में यहां रिपोर्ट की , जिसमें नमूना परियोजना और मुद्दा दिखाने के लिए वीडियो भी शामिल है।

मैंने एमुलेटर के कई संस्करणों पर जांच की है, और ऐसा लगता है कि यह व्यवहार एपीआई 27 (एंड्रॉइड 8.1 - ओरेओ) से शुरू हुआ। डॉक्स को देखते हुए , मुझे अलार्म मैनजर का उल्लेख नहीं दिखता है, लेकिन इसके बजाय, यह विभिन्न पृष्ठभूमि के काम के बारे में लिखा गया था।

प्रश्न

  1. आजकल हम अपेक्षाकृत सटीक समय पर कैसे ट्रिगर होते हैं?

  2. उपरोक्त उपाय कैसे काम नहीं करते हैं? क्या मुझे कुछ याद आ रहा है? अनुमति? शायद मैं इसके बजाय एक कार्यकर्ता का उपयोग करने वाला हूं? लेकिन तब इसका मतलब यह नहीं होगा कि यह समय पर ट्रिगर नहीं हो सकता है?

  3. Google "क्लॉक" ऐप इस सब को कैसे दूर करता है, और वैसे भी सटीक समय पर ट्रिगर करता है, हमेशा, भले ही यह सिर्फ एक मिनट पहले ट्रिगर किया गया हो? क्या यह केवल इसलिए है क्योंकि यह एक सिस्टम ऐप है? क्या होगा यदि यह एक उपयोगकर्ता ऐप के रूप में स्थापित हो जाता है, एक डिवाइस पर जो कि इसमें अंतर्निहित नहीं है?

यदि आप कहते हैं कि यह इसलिए है क्योंकि यह एक सिस्टम ऐप है, तो मुझे एक और ऐप मिला है जो 2 मिनट में दो बार अलार्म को ट्रिगर कर सकता है , हालांकि, मुझे लगता है कि यह कभी-कभी एक अग्रभूमि सेवा का उपयोग कर सकता है।

संपादित करें: यहाँ पर विचारों की कोशिश करने के लिए एक छोटा गथुब भंडार बनाया गया ।


संपादित करें: अंत में एक नमूना मिला जो दोनों खुले-खट्टे हैं और इसमें यह समस्या नहीं है। अफसोस की बात है कि यह बहुत जटिल है और मैं अभी भी यह पता लगाने की कोशिश करता हूं कि यह क्या अलग है (और क्या न्यूनतम कोड है जो मुझे अपने पीओसी में जोड़ना चाहिए) जो हाल के कार्यों से ऐप को हटाने के बाद इसके अलार्म को निर्धारित करने देता है।


इसका एक लंबा समय है जब मैंने सेवा पर काम किया है (मैं सुझाव देने के लिए प्रो डेवलपर भी नहीं हूं), लेकिन मैं सुझाव दे सकता हूं कि आप 5 मिनट से नीचे अलार्म सेट करने जैसे मामलों से बचने के लिए अलार्म मैन से बचें, एक समय सेवा चलने के बाद एंड्रॉइड प्रतिबंधों के कारण क्यूज बैकएंड इसे हर 5 मिनट के बाद या 5 मिनट से कम नहीं होने पर बुलाया जाता है। इसके बजाय, मैंने हैंडलर का इस्तेमाल किया। और मेरी सेवा चलाने के लिए मैं पृष्ठभूमि में जारी [ github.com/fabcira/neverEndingAndroidService]
ब्लू

तो सटीक प्रतिबंध क्या हैं? न्यूनतम समय क्या है जो गारंटी देता है कि ट्रिगर अपेक्षाकृत सटीक समय में काम करेगा?
एंड्रॉयड डेवलपर

मैं सटीक प्रतिबंधों को याद नहीं कर सकता, लेकिन जब मैं इस पर काम कर रहा था तो मैं पृष्ठभूमि की सेवा से दूर होने के लिए दिनों की तरह खुद को मार रहा था। और व्यक्तिगत अवलोकन से मैंने सैमसंग, श्याओमी, आदि पर ध्यान दिया, आप 5 मिनट के अंतराल के बीच अलार्म कॉल करने वाले को कॉल कर सकते हैं, मेरे पास एक डेटा अपलोड सेवा लागू की गई थी जो कि अलार्मएमेंजर का उपयोग करके प्राप्त होती है, जो हर 1 मिनट में चालू हो जाती है, लेकिन इसने हमारे ग्राहक को निराश किया, जिन्होंने सेवा की शिकायत की बिल्कुल नहीं चल रहा है। एमुलेटर के लिए यह अच्छी तरह से काम करता है।
ब्लू

मुझे पता है कि आप एंड्रॉइड क्यू में पृष्ठभूमि से गतिविधि शुरू नहीं कर सकते हैं, लेकिन यह आपके मामले की तरह नहीं दिखता है।
marcinj

@ greeble31 मैंने अब कोशिश की। आप वहां कौन सा समाधान काम करते हुए देखते हैं? किसी कारण से मैं अभी भी काम करने के लिए नहीं मिलता। मैं अलार्म सेट करता हूं, मैं ऐप को हाल के कार्यों से हटा देता हूं, और मुझे अलार्म चालू नहीं होता है, भले ही स्क्रीन चालू हो और डिवाइस एक चार्जर से जुड़ा हो। यह एक वास्तविक डिवाइस (एंड्रॉइड 10 के साथ पिक्सेल 4) और एमुलेटर (उदाहरण के लिए एपीआई 27) दोनों पर होता है। क्या यह आपके लिए काम करता है? क्या आप कृपया पूरा कोड साझा कर सकते हैं? शायद गितुब में?
एंड्रॉयड डेवलपर

जवाबों:


4

हमारे पास करने के लिए कुछ भी नहीं है।

एक बार जब आपका ऐप श्वेत नहीं किया जाता है, तो इसे हाल के ऐप्स से हटाकर हमेशा मार दिया जाएगा।

क्योंकि मूल उपकरण निर्माता (OME) लगातार Android अनुपालन का उल्लंघन कर रहा है

तो यदि आपका ऐप डिवाइस से श्वेत नहीं किया गया है, तो यह किसी भी पृष्ठभूमि के काम को भी अलार्म नहीं बजाएगा - यदि आपका ऐप हाल के ऐप्स से हटा दिया गया है।

आपको लगता है कि व्यवहार के साथ उपकरणों की एक सूची प्राप्त कर सकते यहाँ भी आप एक पक्ष समाधान खोजने सकता है, हालांकि, यह अच्छी तरह से काम नहीं करेगा।


मैं चीनी ओईएम के इस मुद्दे से अच्छी तरह वाकिफ हूं। लेकिन जैसा कि मैंने लिखा, यह एमुलेटर और पिक्सेल 4 डिवाइस पर भी होता है। यह कुछ चीनी ओईएम नहीं है जिसने इसे ऐसा बनाया है। कृपया एमुलेटर और / या पिक्सेल डिवाइस पर जांच करें। मुद्दा वहां भी मौजूद है। अलार्म सेट करें, ऐप को हाल के कार्यों से हटा दें, और देखें कि अलार्म चालू नहीं हुआ है। मैं इसे एक बग के रूप में देखता हूं, और यहां रिपोर्ट किया गया है (यदि आप प्रयास करना चाहते हैं तो इसमें एक वीडियो और एक नमूना परियोजना शामिल है): जारी करने वाला। मैंने अपने प्रश्न को स्पष्ट करने के लिए अद्यतन किया है। सवाल यह है कि कुछ ऐप कैसे सफल हुए।
Android डेवलपर

@androiddeveloper मेरा मानना ​​है कि इसे एमुलेटर पर काम करना चाहिए .. आपके पास कौन सा एमुलेटर है?
इब्राहिम अली

मैंने भी तब तक विश्वास किया, जब तक मैंने कोशिश नहीं की। उदाहरण के लिए, Android स्टूडियो को क्या पेशकश करनी है, उदाहरण के लिए एपीआई 29 पर इसे आज़माएं। मुझे यकीन है कि वही पुराने संस्करणों में भी होगा।
Android डेवलपर

4

एक अजीब सा हल मिला ( यहाँ नमूना ) जो सभी संस्करणों के लिए काम करता है, यहाँ तक कि Android R सहित:

  1. मेनिफेस्ट में घोषित SAW की अनुमति है:
      <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Android R पर आपको इसे भी देना होगा। इससे पहले, ऐसा नहीं लगता कि इसे प्रदान करने की आवश्यकता है, बस घोषित किया गया है। यकीन नहीं कि यह आर पर क्यों बदल गया, लेकिन मैं कह सकता हूं कि पृष्ठभूमि में चीजों को शुरू करने के लिए संभव समाधान के रूप में एसएडब्ल्यू की आवश्यकता हो सकती है, जैसा कि एंड्रॉइड 10 के लिए यहां लिखा गया है

  1. एक सेवा करें जो यह पता लगाएगी कि कार्यों को कब हटा दिया गया था, और जब यह होता है, तो एक नकली गतिविधि खोलें जो यह करता है कि यह अपने आप बंद हो जाए:
class OnTaskRemovedDetectorService : Service() {
    override fun onBind(intent: Intent?) = null

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int) = START_STICKY

    override fun onTaskRemoved(rootIntent: Intent?) {
        super.onTaskRemoved(rootIntent)
        Log.e("AppLog", "onTaskRemoved")
        applicationContext.startActivity(Intent(this, FakeActivity::class.java).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
        stopSelf()
    }

}

FakeActivity.kt

class FakeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("AppLog", "FakeActivity")
        finish()
    }
}

आप इस विषय का उपयोग करके उपयोगकर्ता के लिए इस गतिविधि को लगभग अदृश्य बना सकते हैं:

    <style name="AppTheme.Translucent" parent="@style/Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

अफसोस की बात है, यह एक अजीब काम है। मैं इस के लिए एक अच्छा समाधान खोजने की उम्मीद है।

प्रतिबंध गतिविधि शुरू करने के बारे में बात करता है, इसलिए मेरा वर्तमान विचार यह है कि शायद अगर मैं एक दूसरे के विभाजन के लिए एक अग्रभूमि सेवा शुरू करता हूं तो यह भी मदद करेगा, और इसके लिए मुझे SAW की अनुमति की भी आवश्यकता नहीं होगी।

संपादित करें: ठीक है मैंने एक अग्रभूमि सेवा ( यहां नमूना ) के साथ कोशिश की , और यह काम नहीं किया। पता नहीं क्यों एक गतिविधि काम कर रही है लेकिन एक सेवा नहीं। मैंने वहां के अलार्म को फिर से शेड्यूल करने की भी कोशिश की और फिर से शेड्यूल के बाद भी इस सर्विस को थोड़ा और रुकने देने की कोशिश की। एक सामान्य सेवा की भी कोशिश की लेकिन निश्चित रूप से यह तुरंत बंद हो गया, क्योंकि कार्य को हटा दिया गया था, और यह बिल्कुल भी काम नहीं करता था (भले ही मैंने पृष्ठभूमि में चलने के लिए एक धागा बनाया हो)।

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

EDIT: ऐप के कार्य को हटाने से पहले और बाद में थोड़ी देर के लिए अग्रभूमि सेवा चलाने की कोशिश की, और अलार्म अभी भी काम किया है। इस सेवा को टास्क-रिमूव इवेंट के प्रभारी होने के लिए, और जब यह होता है, तब स्वयं को बंद करने की कोशिश की जाती है, और यह अभी भी काम करता है ( यहाँ नमूना )। इस समाधान का लाभ यह है कि आपके पास SAW की अनुमति बिल्कुल नहीं है। नुकसान यह है कि आपके पास एक अधिसूचना के साथ एक सेवा है जबकि ऐप पहले से ही उपयोगकर्ता को दिखाई देता है। मुझे आश्चर्य है कि यदि एप्लिकेशन पहले से ही गतिविधि के माध्यम से अग्रभूमि में अधिसूचना को छिपाना संभव है।


संपादित करें: लगता है कि यह एंड्रॉइड स्टूडियो पर एक बग है ( यहां रिपोर्ट की गई है , जिसमें संस्करणों की तुलना करने वाले वीडियो भी शामिल हैं)। जब आप समस्याग्रस्त संस्करण से ऐप लॉन्च करते हैं तो मैंने कोशिश की, इससे अलार्म साफ हो सकता है।

अगर आप लॉन्चर से ऐप लॉन्च करते हैं, तो यह ठीक काम करता है।

यह अलार्म सेट करने के लिए वर्तमान कोड है:

        val timeToTrigger = System.currentTimeMillis() + 10 * 1000
        val pendingShowList = PendingIntent.getActivity(this, 1, Intent(this, SomeActivity::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
        val pendingIntent = PendingIntent.getBroadcast(this, 1, Intent(this, AlarmReceiver::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
        manager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingShowList), pendingIntent)

मैं भी "लंबितShowList" का उपयोग करने की जरूरत नहीं है। नल का उपयोग करना भी ठीक है।


मैं सिर्फ AndroidQ पर एक गतिविधि onReceive () को शुरू करना चाहता हूं। क्या इसके लिए कोई SYSTEM_ALERT_WINDOWअनुमति के बिना कोई वर्कअराउंड है ?
डॉक्टरराम

2
Google हमेशा एंड्रॉइड डेवलपर्स के जीवन को साधारण सामानों पर जीवित नरक क्यों बनाता है ?!
डॉक्टरराम

@doctorram हां, यह डॉक्स पर विभिन्न अपवादों के बारे में लिखा गया है: developer.android.com/guide/compords/activities/… । मैंने सिर्फ SYSTEM_ALERT_WINDOW को चुना क्योंकि यह इसका परीक्षण करना सबसे आसान है।
Android डेवलपर

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

मैं हर दिन सुबह 6 से 7 बजे के बीच कोड का एक टुकड़ा चलाना चाहता हूं, भले ही ऐप को हाल की सूची से हटा दिया गया हो। मुझे WorkManager या AlarmManager का उपयोग करना चाहिए ?? मेरे usecase के लिए निम्न कोड की कोशिश की और यह काम नहीं किया। नीचे दिए गए कोड के साथ समस्या क्या है? calendar.setTimeInMillis (System.currentTimeMillis ()); Calendar.set (Calendar.HOUR_OF_DAY, 6); AlarmManager.setInexactRepeating (AlarmManager.RTC_WAKEUP, Calendar.getTimeInMillis (), AlarmManager.INTERVAL_DAY, लंबित);
प्रदीपकुमार रेड्डी

1
  1. सुनिश्चित करें कि आपके द्वारा प्रसारित इरादा स्पष्ट है और उसके पास Intent.FLAG_RECEIVER_FOREGROUNDध्वज है।

https://developer.android.com/about/versions/oreo/background#broadcasts

Intent intent = new Intent(context, Receiver.class);
intent.setAction(action);
...
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);

PendingIntent operation = PendingIntent.getBroadcast(context, 0, intent, flags);
  1. setExactAndAllowWhileIdle()एपीआई 23+ को लक्षित करते समय उपयोग करें ।
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, operation);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, operation);
} else {
    alarmManager.set(AlarmManager.RTC_WAKEUP, time, operation);
}
  1. एक अग्रभूमि सेवा के रूप में अपना अलार्म शुरू करें:

https://developer.android.com/about/versions/oreo/background#migration

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(intent);
} else {
    context.startService(intent);
}
  1. और अनुमतियाँ मत भूलना:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

यह सेवा के बारे में क्यों मायने रखता है, अगर खुद ब्रॉडकास्टर को इंटेंट बिल्कुल नहीं मिलता है (या समय के पास)? यह पहला कदम है ... इसके अलावा, AlarmManagerCompat पहले से ही समान कोड प्रदान नहीं करता है? क्या आपने हाल ही में किए गए कार्यों से ऐप हटाने सहित मेरे द्वारा लिखे गए परीक्षणों का उपयोग करके यह कोशिश की है? क्या आप कृपया पूरा कोड दिखा सकते हैं? शायद गितुब पर साझा करें?
एंड्रॉयड डेवलपर

@androiddeveloper ने उत्तर को अपडेट किया।
मकसिम इवानोव

अभी भी काम करने के लिए प्रतीत नहीं होता है। यहाँ एक नमूना परियोजना है: ufile.io/6qrsor7o । कृपया एंड्रॉइड 10 पर प्रयास करें (एमुलेटर भी ठीक है), अलार्म सेट करें और हाल के कार्यों से ऐप को हटा दें। यदि आप हाल के कार्यों से नहीं हटाते हैं, तो यह ठीक काम करता है और 10 सेकंड के बाद चालू हो जाता है।
Android डेवलपर

मैंने एक बग रिपोर्ट की लिंक के लिए प्रश्न को भी अपडेट किया है जिसमें एक नमूना परियोजना और वीडियो शामिल है, क्योंकि मुझे लगता है कि यह एक बग है क्योंकि मुझे इसके होने का कोई अन्य कारण नहीं दिखता है।
एंड्रॉयड डेवलपर

0

मुझे पता है कि यह कुशल नहीं है, लेकिन 60 सेकंड की सटीकता के साथ अधिक सुसंगत हो सकता है।

https://developer.android.com/reference/android/content/Intent#ACTION_TIME_TICK

यदि इस प्रसारण रिसीवर का उपयोग एक अग्रभूमि सेवा के अंदर किया जाता है, तो आप हर मिनट के समय की जांच कर सकते हैं और कार्रवाई करने पर निर्णय ले सकते हैं।


यदि मेरे पास अग्रभूमि सेवा है, तो मुझे इसकी आवश्यकता क्यों होगी? अगर मैं चाहूं तो मैं बस एक हैंडलर.पोस्टडायलेड या किसी अन्य समान समाधान का उपयोग कर सकता हूं ...
एंड्रॉइड डेवलपर

0

मुझे लगता है कि आप उपयोगकर्ता को अनुमति देने के लिए कह सकते हैं ताकि यह ऊर्जा-बचत मोड को निष्क्रिय कर दे, और उपयोगकर्ता को चेतावनी दे कि यदि वह इसका उपयोग नहीं करता है, तो सटीक समय प्राप्त नहीं होगा।

यहाँ यह अनुरोध करने के लिए कोड है:

PowerManager powerManager = (PowerManager) getApplicationContext().getSystemService(POWER_SERVICE);
            String packageName = "your Package name";
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                Intent i = new Intent();
                if (!powerManager.isIgnoringBatteryOptimizations(packageName)) {
                    i.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                    i.setData(Uri.parse("package:" + packageName));
                    startActivity(i);

पहले से ही यह कोशिश कर चुका हूं क्योंकि मैंने देखा है कि कोई अन्य ऐप ऐसा नहीं करता है और अगर यह मदद कर सकता है तो वह उत्सुक था। काम नहीं किया। अद्यतन प्रश्न।
Android डेवलपर

0

मैं आपके द्वारा अपने प्रश्न ( सरल अलार्म घड़ी) में उल्लिखित ओपन सोर्स प्रोजेक्ट का लेखक हूं ।

मुझे आश्चर्य है कि AlarmManager.setAlarmClock का उपयोग करने से आपके लिए काम नहीं किया गया, क्योंकि मेरा ऐप ठीक यही करता है। कोड अलार्म अलार्मसेट में है। यहाँ एक स्निपेट है:

  val pendingAlarm = Intent(ACTION_FIRED)
                .apply {
                    setClass(mContext, AlarmsReceiver::class.java)
                    putExtra(EXTRA_ID, id)
                    putExtra(EXTRA_TYPE, typeName)
                }
                .let { PendingIntent.getBroadcast(mContext, pendingAlarmRequestCode, it, PendingIntent.FLAG_UPDATE_CURRENT) }

            val pendingShowList = PendingIntent.getActivity(
                    mContext,
                    100500,
                    Intent(mContext, AlarmsListActivity::class.java),
                    PendingIntent.FLAG_UPDATE_CURRENT
            )

            am.setAlarmClock(AlarmManager.AlarmClockInfo(calendar.timeInMillis, pendingShowList), pendingAlarm)

मूल रूप से यह कुछ खास नहीं है, बस यह सुनिश्चित कर लें कि इरादे में एक कार्रवाई और एक लक्ष्य वर्ग है, जो मेरे मामले में एक प्रसारण रिसीवर है।


दुख की बात है काम नहीं किया। यही मैंने कोशिश की। यहाँ फ़ाइलें देखें: github.com/yuriykulikov/AlarmClock/issues/…
Android डेवलपर

मैंने GitHub पर आपका कोड देख लिया है। Moto Z2 Play पर ऐप को हटाए जाने के बाद ब्रॉडकास्ट रिसीवर काम करता है। मैं इसे एक पिक्सेल पर आज़मा सकता हूं, लेकिन कोड मुझे ठीक लगता है। एप्लिकेशन को रोकने के लिए बल निर्धारित अलार्म को हटा देता है, लेकिन यह किसी भी ऐप के साथ होता है जो बल रोक दिया जाता है।
यूरी कुलिकोव

मैंने पहले ही कई बार दिखाया है: शेड्यूलिंग के बाद सभी मैं हाल के कार्यों से हटा रहा हूं। और मैंने इसे एमुलेटर और पिक्सेल 4 दोनों पर किया
Android डेवलपर

कृपया देखें कि क्या लंबन का उपयोग करने से समस्या का समाधान होता है और यदि हां, तो मैं उत्तर को अपडेट करूंगा। शायद यह किसी के लिए उपयोगी होगा।
युरी कुलिकोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.