2011-10-21 16 views
14

पर मेरे ऐप में मेरे पास SQLite डेटाबेस है जिसमें मिलीसेकंड में दिनांक पंक्तियों वाली एक तालिका है। मैं हर दिन आईएफ दिखाता हूं कि मेरे डेटाबेस में संग्रहीत अंतिम दिनांक मान के 30 दिनों बाद से एक अधिसूचना दिखाई देगी। एक सेवा इस चेक अप को पूरा करने का एक अच्छा तरीका प्रतीत होता है।दोपहर में हर दिन एक सेवा कैसे चलाएं, और प्रत्येक बूट

मैं कॉमन्सवेयर के WakefulIntentService में भाग गया और सोचा कि यह जवाब हो सकता है लेकिन मुझे नहीं पता कि मुझे इसे कैसे कार्यान्वित करना चाहिए। डेमो में यह बूट होने के 5 मिनट बाद सेवा शुरू करता है जो कि ठीक है, लेकिन मुझे दोपहर में भी शुरू करने के लिए जोड़ने की क्या ज़रूरत है। (... लेकिन केवल एक अधिसूचना/दिन दिखाने के लिए, दोनों बूट और नियमित दैनिक जांच के रूप में नहीं)

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

धन्यवाद

उत्तर

36

एंड्रॉयड alarmmanager अपने जवाब है। इसे एक प्रसारण रिसीवर के साथ उपयोग करें जो फोन के जागने पर अलार्म को रीसेट करता है।

कोड उदाहरण के साथ

अब: अलार्म रीसेट करने के लिए जब भी फोन बंद किया गया है के लिए

public class AlarmReceiver extends BroadcastReceiver { 
private final String SOMEACTION = "packagename.ACTION"; //packagename is com.whatever.www 
@Override 
public void onReceive(Context context, Intent intent) { 
    Time now = new Time(); 
    now.setToNow(); 
    String time = FileHandler.timeFormat(now); 

    String action = intent.getAction(); 
    if(SOMEACTION.equals(action)) { 
     // here you call a service etc. 
    } 

रिसीवर: अपने अंतराल के लिए

Intent intent = new Intent(context, AlarmReceiver.class); 
intent.setAction("packagename.ACTION"); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
      0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
     AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
alarm.cancel(pendingIntent); 
alarm.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 

रिसीवर: एक विधि के अंदर अलार्म सेट।

public class AlarmSetter extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // get preferences 
     SharedPreferences preferences = context.getSharedPreferences("name_of_your_pref", 0); 
     Map<String, ?> scheduleData = preferences.getAll(); 

     // set the schedule time 
     if(scheduleData.containsKey("fromHour") && scheduleData.containsKey("toHour")) { 
      int fromHour = (Integer) scheduleData.get("fromHour"); 
      int fromMinute = (Integer) scheduleData.get("fromMinute"); 

      int toHour = (Integer) scheduleData.get("toHour"); 
      int toMinute = (Integer) scheduleData.get("toMinute"); 

      //Do some action 
     } 
    } 

} 

प्रकट बहुत महत्वपूर्ण है, इस आवेदन के तहत जोड़ा जाता है:

 <receiver android:name="AlarmReceiver"> 
     <intent-filter> 
      <action android:name="packagename.ACTION"/> 
      <action android:name="packagename.ACTION2"/> 
     </intent-filter> 
    </receiver> 

    <receiver android:name="AlarmSetter" > 
     <intent-filter> 
      <action 
       android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 
इसके अलावा इस के लिए काम करने के लिए आप निम्न लाइन के साथ प्रकट में बूट प्रसारण प्राप्त करने के लिए अनुमति जोड़नी होगी में

:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

उम्मीद है कि यह स्पष्ट चीजें ऊपर हों, अगर कोई त्रुटि बताती है।

संपादित (उदाहरण के alarmsetter जोड़ा):

public class AlarmSetter extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Do your stuff 
    } 
} 
+0

मेरे प्रश्न को थोड़ा खराब करने के लिए खेद है, लेकिन मुझे पहले से ही अलार्ममैनगर पता था, लेकिन समस्या को हल करने के लिए इसका उपयोग कैसे नहीं किया जाए ... और न ही इसे कैसे जगाया जाए। तो मुझे लगता है कि मुझे वही सेवा शुरू करने की ज़रूरत है जैसे कि कॉमन्सवेयर वेकफुलइन्टेंट सेवा डेमो (https://github.com/commonsguy/cwac-wakeful), लेकिन विभिन्न रिसीवर से ...? ऐप चलाने के बिना, रोज़ाना और/या प्रत्येक बूट पर सेवा कैसे चलाएं। – micadelli

+0

अलार्ममेनेट्स के बारे में बहुत सरल पढ़ें। या इसे गूगल करें :) आज रात कुछ कोड दे सकते हैं यदि आपका अभी भी – Warpzit

+0

अटक गया है कुछ दिनों पहले ही अटक गया है :) तो हाँ, कोड उदाहरणों की अत्यधिक सराहना की जाएगी। – micadelli

2

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

setRepeating() कॉल के प्रारंभिक समय को बदलें। उदाहरण अब से एक मिनट दिखाता है - आपको यह निर्धारित करने के लिए गणना करने की आवश्यकता होगी कि अगला दोपहर कब होगा।

आप एक अलग नमूना परियोजना से this OnBootReceiver में उस तरह की गणना का एक उदाहरण देख सकते हैं। यहां, मैं उपयोगकर्ता द्वारा निर्दिष्ट समय पर हर दिन जाने के लिए अलार्म सेट अप कर रहा हूं।

4

यह उत्तर बहुत पुराना लगता है। अब, मैं पूरी तरह से Google द्वारा प्रदान किए गए सिंकएडाप्टर ढांचे को देखने के लिए लोगों की अनुशंसा करता हूं। यह ऐसी चीजों के लिए कस्टम है। यहां लिंक है: https://developer.android.com/training/sync-adapters/index.html

+0

अधिक लोगों को इसके बारे में पता होना चाहिए। मेरे जैसा। धन्यवाद! –

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