एंड्रॉइड: अलार्म मैनजर का उपयोग कैसे करें


89

मुझे AlarmManagerसेट होने के 20 मिनट बाद कोड के एक ब्लॉक को ट्रिगर करना होगा ।

क्या कोई मुझे someone AlarmManagerAndroid में उपयोग करने के लिए नमूना कोड दिखा सकता है?

मैं कुछ दिनों से कुछ कोड के साथ खेल रहा हूं और यह सिर्फ काम नहीं करेगा।

जवाबों:


109

"कुछ सैंपल कोड" इतना आसान नहीं है जब यह आता है AlarmManager

यहाँ एक स्निपेट दिखाया गया है AlarmManager:

AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);

mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), PERIOD, pi);

इस उदाहरण में, मैं उपयोग कर रहा हूं setRepeating()। यदि आप एक-शॉट अलार्म चाहते हैं, तो आप बस उपयोग करेंगे set()। जैसा कि आप प्रारंभिक पैरामीटर में उपयोग करते हैं उसी समय आधार में अलार्म शुरू करने के लिए समय देना सुनिश्चित करें set()। ऊपर मेरे उदाहरण में, मैं उपयोग कर रहा हूं AlarmManager.ELAPSED_REALTIME_WAKEUP, इसलिए मेरा समय आधार है SystemClock.elapsedRealtime()

यहां इस तकनीक को दिखाने वाला एक बड़ा नमूना प्रोजेक्ट है


2
फिर से हैलो। उत्तर के लिए धन्यवाद। अगर मैं आपकी पुस्तक खरीदता हूं तो क्या यह बताता है कि कैसे एक अलार्म मैनेजर को पूरी तरह से लागू किया जाए?
टॉम

7
उन्नत एंड्रॉइड पुस्तक (संस्करण 0.9) में अलार्म मैनजर, ​​वेक लोक्स और बाकी के उदाहरणों को कवर करने वाले ~ 9 पृष्ठ हैं। शायद संस्करण 1.0 में थोड़ा विस्तार होगा क्योंकि मैं ऊपर दिए गए उत्तर में मेरे द्वारा बताए गए सुधार को ठीक करता हूं। और यदि आपके पास पुस्तक या उसके नमूना कोड के बारे में प्रश्न हैं, तो समूहों पर जाएं। Googlegroup/cw - android और मुझे उनके उत्तर देने में खुशी होगी।
कॉमन्सवेअर

17
किसी भी एंड्रॉइड डेवलपर को मार्क की पुस्तकों की सदस्यता होनी चाहिए :) कम से कम एक बार
बॉस्सोन

1
@ मारियोग्लवन: जब आपका ऐप पहली बार और रिबूट पर चलाया जाता है, तो आपको इसे सेट करना होगा।
कॉमन्सवेअर

मुझे लगता है कि आपको अलार्म मैनर का उपयोग करना चाहिए। RTC_WAKEUP यदि आप चाहते हैं कि वह तुरंत आग लग जाए और फिर प्रत्येक PERIOD। आपके कोड में, यह SystemClock.elapsedRealtime () और फिर प्रत्येक PERIOD के बाद फायर करेगा।
डेमन युआन

66

Android नमूना कोड में कुछ अच्छे उदाहरण हैं

। \ Android-SDK \ नमूने \ एंड्रॉयड-10 \ ApiDemos \ src \ कॉम \ उदाहरण \ एंड्रॉयड \ apis \ एप्लिकेशन

जिन्हें जांचना है:

  • AlarmController.java
  • OneShotAlarm.java

सबसे पहले, आपको एक रिसीवर चाहिए, कुछ ऐसा जो आपके अलार्म को सुन सकता है जब इसे ट्रिगर किया जाता है। अपने AndroidManifest.xml फ़ाइल में निम्न जोड़ें

<receiver android:name=".MyAlarmReceiver" />

फिर, निम्न वर्ग बनाएं

public class MyAlarmReceiver extends BroadcastReceiver { 
     @Override
     public void onReceive(Context context, Intent intent) {
         Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
     }
}

फिर, अलार्म को ट्रिगर करने के लिए, निम्न का उपयोग करें (उदाहरण के लिए अपनी मुख्य गतिविधि में):

AlarmManager alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, MyAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
Calendar time = Calendar.getInstance();
time.setTimeInMillis(System.currentTimeMillis());
time.add(Calendar.SECOND, 30);
alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent);


या, बेहतर, अभी तक, एक वर्ग बनाएं जो इसे संभालता है और इसे इस तरह से उपयोग करता है

Bundle bundle = new Bundle();
// add extras here..
MyAlarm alarm = new MyAlarm(this, bundle, 30);

इस तरह, आपके पास यह सब एक जगह है (संपादित करना न भूलें AndroidManifest.xml)

public class MyAlarm extends BroadcastReceiver {
    private final String REMINDER_BUNDLE = "MyReminderBundle"; 

    // this constructor is called by the alarm manager.
    public MyAlarm(){ }

    // you can use this constructor to create the alarm. 
    //  Just pass in the main activity as the context, 
    //  any extras you'd like to get later when triggered 
    //  and the timeout
     public MyAlarm(Context context, Bundle extras, int timeoutInSeconds){
         AlarmManager alarmMgr = 
             (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         Intent intent = new Intent(context, MyAlarm.class);
         intent.putExtra(REMINDER_BUNDLE, extras);
         PendingIntent pendingIntent =
             PendingIntent.getBroadcast(context, 0, intent, 
             PendingIntent.FLAG_UPDATE_CURRENT);
         Calendar time = Calendar.getInstance();
         time.setTimeInMillis(System.currentTimeMillis());
         time.add(Calendar.SECOND, timeoutInSeconds);
         alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),
                      pendingIntent);
     }

      @Override
     public void onReceive(Context context, Intent intent) {
         // here you can get the extras you passed in when creating the alarm
         //intent.getBundleExtra(REMINDER_BUNDLE));

         Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
     }
}

2
नमस्ते! मैंने इस कोड का परीक्षण किया और यह ठीक है (+1)। लेकिन मैंने इसे कई अलार्मों के लिए आज़माया (जैसे 10 सेकंड के लिए, और दूसरा 15 के लिए, और केवल सेंकेंड को निकाल दिया जाता है। क्या मैं कुछ गलत कर रहा हूं, या क्या यह समस्या का कोई राजा है? EDIT: ठीक है, मुझे यहाँ समस्या मिली? : stackoverflow.com/questions/2844274/…
नूनो गोंकोलवेस

एफडब्ल्यूआईडब्ल्यू, मैं इसके लिए एक निर्माता के बजाय एक स्थिर विधि का उपयोग करूंगा।
एडवर्ड फॉक

9

आपको जो करने की आवश्यकता है वह पहले उस इरादे को बनाएं जिसे आपको शेड्यूल करना है। फिर उस इरादे के लंबित को प्राप्त करें। आप गतिविधियों, सेवाओं और प्रसारण अनुसूची कर सकते हैं। एक गतिविधि को निर्धारित करने के लिए जैसे MyActivity:

  Intent i = new Intent(getApplicationContext(), MyActivity.class);
  PendingIntent pi = PendingIntent.getActivity(getApplicationContext(),3333,i,
  PendingIntent.FLAG_CANCEL_CURRENT);

इस लंबित अलार्म अलार्म को दें:

  //getting current time and add 5 seconds in it
  Calendar cal = Calendar.getInstance();
  cal.add(Calendar.SECOND, 5);
  //registering our pending intent with alarmmanager
  AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
  am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi);

अब एप्लिकेशन लॉन्च होने के 5 सेकंड के बाद MyActivity लॉन्च की जाएगी, इससे कोई फर्क नहीं पड़ता कि आप अपना एप्लिकेशन बंद करते हैं या डिवाइस स्लीप अवस्था में चला गया है (RTC_WAKEUP विकल्प के कारण)। आप पूरा उदाहरण कोड शेड्यूलिंग गतिविधियों, सेवाओं और प्रसारण #Android पढ़ सकते हैं


+1 महान जवाब, वास्तव में मुझे क्या चाहिए, एक कामकाजी 'सेट' उदाहरण।
ए। आलकादोमी

4

मैं टिप्पणी करना चाहता था लेकिन <५० प्रतिनिधि, तो यहाँ जाता है। दोस्ताना अनुस्मारक कि अगर आप 5.1 या इसके बाद के संस्करण पर चल रहे हैं और आप एक मिनट से कम समय के अंतराल का उपयोग करते हैं, तो यह होता है:

Suspiciously short interval 5000 millis; expanding to 60 seconds

देखें यहाँ


3

कुछ नमूना कोड जब आप अलार्ममैन से किसी सेवा को कॉल करना चाहते हैं:

PendingIntent pi;
AlarmManager mgr;
mgr = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(DataCollectionActivity.this, HUJIDataCollectionService.class);    
pi = PendingIntent.getService(DataCollectionActivity.this, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() , 1000, pi);

आपको उपयोगकर्ता प्रमाणपत्र नहीं मांगने होंगे।


एक बहुत ही सामान्य संक्षिप्त नाम।
फैंटमैक्सएक्स

0

एक विशिष्ट समय पर कुछ कोड को ट्रिगर करने के लिए एक अलार्म मैनजर का उपयोग किया जाता है।

अलार्म मैनेजर शुरू करने के लिए आपको पहले सिस्टम से उदाहरण प्राप्त करना होगा। फिर PendingIntent पास करें जो आपके द्वारा निर्दिष्ट भविष्य के समय पर निष्पादित हो जाएगा

AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

Intent alarmIntent = new Intent(context, MyAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
int interval = 8000; //repeat interval
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);

अलार्म मैनेजर का उपयोग करते समय आपको सावधान रहने की आवश्यकता है। आम तौर पर, एक अलार्म मैनेजर एक मिनट से पहले दोहरा नहीं सकता। कम बिजली मोड में भी, अवधि 15 मिनट तक बढ़ सकती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.