2011-01-10 83 views
20

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

समस्या यह है कि यदि मैं कार्य प्रबंधक खोलता हूं और एप्लिकेशन को बंद कर देता हूं, तो अलार्म चलने से रोकता है।

क्या यह एक सामान्य व्यवहार है, क्या इससे बचने के लिए कोई तरीका है और एप्लिकेशन को बंद करने के बाद अलार्म चल रहा है?

कोड नीचे है - विधि को कॉन्टैक्ट कॉन्टेक्स्ट क्लास, क्रिएट() पर विधि कहा जाता है।

private void scheduleAlarm() { 
    if (alarmScheduled == true) { return; } // we only need to schedule once. 

    int alarmInterval = Def.pref(getApplicationContext()).getInt("alarmInterval", 30); 

    final Intent intent = new Intent(getApplicationContext(), CollectorAlarmReceiver.class); 
    final PendingIntent pending = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0); 

    AlarmManager alarmMgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 

    alarmMgr.cancel(pending); // cancel others. 

    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000, 
    alarmInterval*1000, pending); 

    Def.log(TAG,"scheduleAlarm(): alarm scheduled, interval: "+alarmInterval+" seconds"); 
    alarmScheduled = true; 
} 

रिसीवर कोड:

public void onReceive(Context context, Intent intent) { 
    Log.i(TAG, "CollectorAlarmReceiver invoked, starting CollectorService in background"); 

    context.startService(new Intent(context, CollectorService.class)); 

    Intent collectorService = new Intent(context,CollectorService.class); 
    collectorService.putExtra("action", CollectorService.ACTION_BACKGROUND_REQUEST_MESSAGES); 

    context.sendBroadcast(collectorService); 
} 

धन्यवाद!

+0

क्या आप अपना रिसीवर कोड पोस्ट कर सकते हैं और अलार्म अंतराल का एक उदाहरण क्या हो सकता है? – ninjasense

+0

मैंने रिसीवर के लिए कोड पोस्ट किया। अलार्म इंटरवल 30 सेकंड है। आप देख सकते हैं कि ऑन-रेसीव में लॉग इन है, इसलिए जब मैं रिसीवर का आह्वान करता हूं तो मैं ट्रैक कर सकता हूं। और ऐप चलाने के दौरान, यह ठीक काम करता है, समस्या तब बंद होती है जब यह बंद हो जाती है। –

+0

आप सिस्टम डिफ़ॉल्ट घड़ी में अलार्म घड़ी क्यों सेट नहीं करते हैं। फिर इसे टास्क मैनेजर द्वारा मार दें और देखें कि यह आपके ऐप की तरह व्यवहार करता है या नहीं। अगर यह आपको अलार्म भी नहीं कर सकता है। मुझे लगता है कि यह आपके ऐप के लिए ठीक है और आपको कुछ भी करने की ज़रूरत नहीं है। –

उत्तर

6

यह सामान्य व्यवहार है। यदि उपयोगकर्ता स्वेच्छा से आवेदक को रोकता है, तो इसे रोकना चाहिए। अन्यथा, आप एप्लिकेशन जैसे वायरस बना रहे हैं।

यदि आप वास्तव में चाहते हैं, तो आप एक और सेवा लिख ​​सकते हैं जो मॉनीटर करता है कि आपकी दूसरी सेवा चल रही है और यदि कोई नहीं चल रहा है तो सेवा चलाता है। लेकिन यह एक और एप्लीकेशन होगा और (आप उम्मीद करते हैं) उपयोगकर्ता कार्य प्रबंधक का उपयोग करके इस ऐप को मार नहीं पाएगा।

व्यक्तिगत रूप से, मुझे चिंता नहीं होगी। यदि उपयोगकर्ता ने इसे रोक दिया, तो वे इसे रोकना चाहते थे। उपयोगकर्ता को परेशान मत करो।

+18

मैं असहमत हूं क्योंकि कई ऐप्स हैं जो इसे सरल इरादे घड़ी जैसे दिमाग में अच्छे इरादे से करेंगे। एंड्रॉइड का मतलब एक कार्य हत्यारा के माध्यम से कार्यों को मारने के लिए नहीं है। – ninjasense

+0

हां, मेरे मामले में, मैं फोरस्क्वेयर "पिंग" सेवा के व्यवहार को पुन: उत्पन्न करना चाहता हूं, जहां आप फोरस्क्वेयर ऐप बंद करने के बाद भी अधिसूचनाएं प्राप्त कर सकते हैं। फेसबुक ऐप वही करता है लेकिन मुझे लगता है कि यह सी 2 डीएम का उपयोग करता है। सी 2 डीएम स्मृति में सेवा रखने के बिना ऐसा करने का एकमात्र तरीका है? –

+0

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

1

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

यह question कुछ मदद भी हो सकता है।

0

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

public class TestService extends Service { 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(this, "Ejecutando Servicio ...", Toast.LENGTH_SHORT).show(); 
    return Service.START_NOT_STICKY;  
    } 

@Override 
    public void onCreate() { 
     super.onCreate(); 
     Toast.makeText(this, "Iniciando Servicio ...", Toast.LENGTH_SHORT).show(); 
} 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(this, "Deteniendo Servicio ...", Toast.LENGTH_SHORT).show(); 
} 

ग्राहक गतिविधि पर निम्नलिखित कोड लिखने:

  Calendar cal = Calendar.getInstance(); 
     Intent intent = new Intent(this,TestService.class); 
     PendingIntent pIntent = PendingIntent.getService(this.getApplicationContext(), 0, intent, 0); 
     alarm= (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarm.setRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), 3*1000, pIntent); 

और प्रकट में सेवा की घोषणा:

 <service 
     android:name="TestService" 
     android:icon="@drawable/ic_launcher" 
     android:label="TestService" 
     > 
    </service>   
+0

सेवा @ इगोर जाने का तरीका है, मुझे अलार्म घड़ी बनाने वाली सेवा सामग्री पर आपके साथ और मदद की ज़रूरत है, मैंने इसका इस्तेमाल किया लेकिन अच्छा काम नहीं कर रहा है, क्या आप मेरी मदद कर सकते हैं और अपना कोड देख सकते हैं? –

+0

यह लिंक 1 है https://github.com/huxaiphaer/DiabeticsApp/blob/master/Droid/AlarmReceiver.cs link2। https://github.com/huxaiphaer/DiabeticsApp/blob/master/Droid/AppStickyService.cs –

+0

शायद यह लिंक मदद कर सकता है? http://www.truiton.com/2014/09/android-service-broadcastreceiver-example/ –

7

मेरा मानना ​​है कि @GSree गलत है यहाँ मेरे कोड है। इसे हासिल करने का एक आसान तरीका है। बस एक कस्टम कार्रवाई का उपयोग करें।

public static final String MY_ACTION = "com.sample.myaction" 

फिर एक BroadcastReceiver बनाने:

सबसे पहले, इस तरह के रूप में एक कस्टम क्रिया का नाम परिभाषित करते हैं, यहां तरीका देखें:

public class MyAlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(MY_ACTION)) { 
      // Do something here 
     } 
    }  
} 

अपने AndroidManifest पर रिसीवर रजिस्टर।xml:

<receiver android:name="com.sample.MyAlarmReceiver"> 
    <intent-filter> 
     <action android:name="com.sample.myaction"/> 
    </intent-filter> 
</receiver> 

फिर, सेटअप करने के लिए अलार्म, निम्नलिखित PendingIntent का उपयोग करें:

Intent i = new Intent(MY_ACTION); 
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0); 

वहाँ यह करने के लिए अन्य तरीकों से हो सकता है लेकिन मैं इस समाधान की कोशिश की और BroadcastReceiver कहा जाता हो जाता है, भले ही मैं खोल से मेरे ऐप को मजबूर करें।

ध्यान दें कि इस समाधान के लिए आपको सेवा बनाने की आवश्यकता नहीं है।

+4

ने कोशिश की, मेरे ऐप को मजबूर करने के बाद काम नहीं कर रहा, मैं एंड्रॉइड 4.2.1 का उपयोग कर रहा हूं। यह केवल तभी काम करता है जब मैं होम बटन टैप करता हूं (ऐप केवल रोका जाता है - नहीं मारा जाता है)। कोई विचार क्यों? –

+0

किसी को भी किटकैट और ओएस मंच पर समस्या मिली? यह समाधान वहाँ काम नहीं करता है कृपया – KOTIOS

+0

आदमी को कोई जवाब दें? –

1

मैंने इसे कुछ बार किया है, लेकिन आश्चर्य है कि आप अनुरोध क्यों कर रहे हैं 0 का कोड; मुझे लगता है कि आपके अलार्म को एक अद्वितीय संख्या देने से बहुत मदद मिलेगी।

1

मैनिफ़ेस्ट फ़ाइल में

<receiver android:name=".AlarmReceiver" android:process=":remote" />

जोड़ें। ऐप मरने पर भी अलार्म काम करेगा।

+6

स्टैक ओवरव्लो में आपका स्वागत है।कृपया कई अन्य प्रतिक्रियाओं के साथ पुराने धागे का उत्तर जोड़ते समय सावधान रहें, खासकर जब उनमें से एक स्वीकार कर लिया गया हो। आपको यह बताने की जरूरत है कि मौजूदा उत्तर किसी भी मौजूदा से बेहतर क्यों है। – APC

3

यह एक सामान्य व्यवहार है! जब आपका ऐप ऑनस्ट्राय() पर जाता है तो अलार्म काम करना बंद कर देगा।

+0

इसे टिप्पणी के रूप में जोड़ा जा सकता है –

+0

मैं कम प्रतिष्ठा पर टिप्पणी नहीं कर सकता! –

+0

वे एक कारण के लिए ऐसा करते हैं – quemeful

संबंधित मुद्दे

 संबंधित मुद्दे