80

का उपयोग कैसे करें AlarmManager सेट होने से मुझे 20 मिनट के बाद कोड का एक ब्लॉक ट्रिगर करने की आवश्यकता है।एंड्रॉइड: अलार्ममेनगर

कोई मुझे एंड्रॉइड में AlarmManager का उपयोग करने के तरीके पर नमूना कोड दिखा सकता है?

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

उत्तर

100

AlarmManager की बात आने पर "कुछ नमूना कोड" इतना आसान नहीं है। , मैं setRepeating() उपयोग कर रहा हूँ

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); 

इस उदाहरण में:

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

Here is a larger sample project इस तकनीक को दिखा रहा है।

+2

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

+7

उन्नत एंड्रॉइड पुस्तक (संस्करण 0.9) में ~ 9 पेज हैं जो अलार्ममेनगर, वेक लॉक, और बाकी के उदाहरण को कवर करते हैं। यह शायद संस्करण 1.0 में थोड़ा विस्तार करेगा क्योंकि मैं उपरोक्त मेरे उत्तर में जो फिक्स मैंने उल्लेख किया है उसे ठीक करता हूं। और यदि आपके पास पुस्तक या उसके नमूना कोड के बारे में कोई प्रश्न है, तो http://groups.google.com/group/cw-android पर जाएं और मुझे जवाब देने में खुशी होगी। – CommonsWare

+17

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

58

एंड्रॉयड नमूना कोड

में कुछ अच्छे उदाहरण हैं। \ 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(); 
    } 
} 
+1

हाय वहाँ! मैंने इस कोड का परीक्षण किया और यह ठीक है (+1)। लेकिन मैंने इसे कई अलार्म के लिए कोशिश की (जैसे 10 सेकेंड के लिए, और दूसरा 15 के लिए, और केवल सेन्कोन्ड को निकाल दिया गया है। क्या मैं कुछ गलत कर रहा हूं, या क्या यह समस्या का राजा है? संपादित करें: ठीक है, मुझे समस्या मिली यहां: http://stackoverflow.com/questions/2844274/multiple-calls-to-alarmmanager-setrepeating-deliver-the-same-intent-pendinginten –

+1

+1 एसडीके नमूने का संदर्भ देने के लिए +1 – Sundeep

+0

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

2

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

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

सीटीएक्स क्या है? – ssrp

+2

सीटीएक्स संदर्भ है :) – Duc

+0

एक बहुत ही आम संक्षिप्त नाम। –

7

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

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

alarmManager को यह pendingIntent दें: एक गतिविधि जैसे MyActivity शेड्यूल करने के लिए

//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); 

अब MyActivity आवेदन शुभारंभ के 5 सेकंड के बाद शुरू किया जाएगा, कोई फर्क नहीं पड़ता है कि आप अपने आवेदन को रोकने या डिवाइस नींद की स्थिति में चला गया (आरटीसी_WAKEUP विकल्प के कारण)। आप पूर्ण उदाहरण कोड पढ़ सकते हैं Scheduling activities, services and broadcasts #Android

+0

+1 अच्छा जवाब, बिल्कुल मुझे क्या चाहिए, एक कामकाजी 'सेट' उदाहरण। –

3

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

Suspiciously short interval 5000 millis; expanding to 60 seconds 

देखें here

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