2011-01-19 19 views
11

के दौरान शेड्यूल अधिसूचना करने के लिए अलार्म प्रबंधक और सेवा का उपयोग करें, मैं एक ऐप बना रहा हूं जो उपयोगकर्ताओं के घंटों के दौरान विशिष्ट समय-अंतराल पर अधिसूचनाएं ट्रिगर करेगा।विशिष्ट समय अवधि

मेरे पास एक अलार्म प्रबंधक है जो किसी सेवा के अंदर चल रहा है। सेवा मुख्य गतिविधि पर बटन क्लिक के माध्यम से स्पष्ट रूप से शुरू की गई है और अलार्ममेनगर विशिष्ट समय invervals के दौरान अधिसूचना निष्पादित करता है। दिन के कुछ घंटों के दौरान अधिसूचनाओं को रोकने के बारे में मैं कैसे जाउंगा? मैं नहीं चाहता कि ये अधिसूचना निकाल दी जाए, उदाहरण के लिए, उपयोगकर्ता सो रहा है।

मेरे कोड है कि वर्तमान में जो उपयोगकर्ता द्वारा सेट अंतराल पर सूचनाएं फायरिंग कर रहा है नीचे है (आयात हटा दिया .... यह काफी लंबे समय पहले से ही है):

public class FartSmackinChunks extends Service { 
    public Notification scheduleNotification; 
    public AlarmManager alarmScheduleManager; 
    public PendingIntent alarmScheduleIntent; 
    private Boolean autoUpdateBoolean = true; 
    private int intervalsGoneByInt = 0; 
    private Notification notification; 
    public static final int NOTIFICATION_ID = 1; 

    @Override 
    public void onCreate() { 
     // TODO: Actions to perform when service is created. 
     int icon = R.drawable.icon; 
     String tickerText = "INTERVAL FIRED"; 
     long when = System.currentTimeMillis(); 
     scheduleNotification = new Notification(icon, tickerText, when); 

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

     String ALARM_ACTION; 
     ALARM_ACTION = ScheduleAlarmReceiver.ACTION_REFRESH_SCHEDULE_ALARM; 
     Intent intentToFire = new Intent(ALARM_ACTION); 
     alarmScheduleIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 
     0); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     SharedPreferences mySharedPreferences = 
     PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
     boolean autoUpdateBoolean = 
     mySharedPreferences.getBoolean("storedAutoUpdateBoolean", false); 
     String updateFreq = 
     mySharedPreferences.getString("storedInitialAverageTimeInterval", "00:00:00"); 

     SimpleDateFormat dfInterval = new SimpleDateFormat("hh:mm:ss"); 

     Date intervalTimeAsDateObject = null; 
     long updateFreqMilliLong; 
     try { 
      intervalTimeAsDateObject = dfInterval.parse(updateFreq); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     updateFreqMilliLong = intervalTimeAsDateObject.getTime() - 18000000; 

     if (autoUpdateBoolean) { 
      int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP; 
      long timetoRefresh = SystemClock.elapsedRealtime() + 
      updateFreqMilliLong; 
      alarmScheduleManager.setInexactRepeating(alarmType, 
      timetoRefresh, updateFreqMilliLong, alarmScheduleIntent); 
      notifications(); 
     } else alarmScheduleManager.cancel(alarmScheduleIntent); 

     return Service.START_NOT_STICKY; 
    }; 

    private void notifications() { 
     **notification stuff in here*** 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO: Replace with service binding implementation. 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
     this.alarmScheduleManager.cancel(alarmScheduleIntent); 
    } 
} 

..... और मेरे प्रसारण रिसीवर कार्यान्वयन यहाँ :

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class ScheduleAlarmReceiver extends BroadcastReceiver { 

    public static final String ACTION_REFRESH_SCHEDULE_ALARM 
    = "com.application.ACTION_REFRESH_SCHEDULE_ALARM"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent startIntent = new Intent(context, SmokerReducerService.class); 
     context.startService(startIntent); 
    } 
} 

मैं एक छोटे से कठिनाई के आसपास यह कैसे लागू किया जाना चाहिए मेरे मस्तिष्क लपेटकर आ रही है।

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

किसी भी इनपुट की सराहना की जाएगी। मैं अब अपने सिर में इस दिन काम करने की कोशिश कर रहा हूं।

धन्यवाद

संपादित करें: @anyone ने इस दैनिक सूचनाओं के लिए एक टाइमर का उपयोग करने के लिए इच्छुक भर आता है:

एक टाइमर जो एक सेवा के अंदर चलाता है जब डिवाइस क्रम से रोक दिया जाएगा सोया जाता है (यानी ... उपयोगकर्ता फोन को स्टैंडबाय में रखता है)। इसके लिए, विशिष्ट समय अंतराल पर सूचनाओं को आग लगाने के लिए टाइमर का उपयोग करना किसी सेवा के भीतर सही ढंग से काम नहीं करेगा क्योंकि जब एंड्रॉइड सेवा को रोक देता है, तो यह टाइमर को रोकता है, जो अंतराल को फेंक देता है।

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

+0

'mySharedPreferences.getBoolean' गायब था -' // TODO: सेवा बनाने के दौरान क्रियाएं करने की क्रियाएं 'की आवश्यकता है? (कम से कम प्रश्न में - अन्य TODO ठीक है) इसके अलावा एक (लंबी चल रही) सेवा का उपयोग क्यों करें? –

+1

@Mr_and_Mrs_D - मैं इसे करने के लिए लंबित इरादे की एक सरणी के साथ अलार्ममेनगर क्लास का उपयोग कर समाप्त हुआ। – dell116

उत्तर

3

मैं इतना है कि alarmManager waketime पर फायर किया और sleepTime में बंद कर दिया, यह सब करते हुए सेवा के अंदर एक टाइमर है कि विशिष्ट अंतराल पर सूचना विधि सक्रिय करता है है इस कोड को फिर से काम करने के लिए सोच रहा था? क्या ऐसा करने के लिए जाने का कोई बेहतर तरीका है?

मेरे दिमाग में, 'बेहतर' तरीके से सोचना भूल जाओ, ऐसा लगता है कि यह एकमात्र तरीका है। किसी अन्य टाइमर को नियंत्रित करने (सक्षम/अक्षम) करने के लिए टाइमर का उपयोग करना इतना अजीब नहीं है और मुझे पूर्ण ज्ञान देता है।

+0

उत्तर MisterSquonk के लिए धन्यवाद। मैंने पहले अलार्ममेनर के साथ काम नहीं किया है, इसलिए यह मेरे लिए नया है। विचार की मेरी ट्रेन को फिर से आश्वस्त करने के लिए धन्यवाद। मुझे लगता है कि आपने मेरा एक और धागा जवाब दिया है। सहायक होने के लिए धन्यवाद। आपके इनपुट की बहुत सराहना की गई है। – dell116

+0

@ dell116: कोई समस्या नहीं, मैं मदद कर सकता हूं जहां मैं कर सकता हूं। इस मुद्दे पर, चीजों को सरल बनाने के लिए, आप अपने कोड को शुरू/बंद करने के लिए और आंतरिक 'टाइमर' के रूप में काम करने के लिए अलार्ममेनगर का उपयोग करने के लिए अपने कोड को फिर से बढ़ा सकते हैं। अलार्ममेनगर, आखिरकार, सिस्टम/डिवाइस अलार्म सेवाओं के लिए एक एक्सेस पॉइंट है - वही अलार्म सेवाएं जो सुबह में जागती हैं, जन्मदिन अनुस्मारक आदि प्रदान करती हैं – Squonk

+0

मैंने मूल रूप से जो कहा आपने किया। अलार्म प्रबंधक सेवा के अंदर अधिसूचनाओं को ट्रिगर करने के बजाय, मैंने सेवा से अलार्ममेनगर को हटा दिया और उपयोगकर्ता द्वारा परिभाषित अंतराल पर सूचनाओं को आग लगाने के लिए सेवा के अंदर एक टाइमर का उपयोग किया। मेरी मुख्य सेटिंग्स गतिविधि में, मैं सेवा को आग लगाने और अलार्ममेनगर की शुरुआत के लिए एक बटन का उपयोग करता हूं। फिर, कैलंडर की मदद से, मेरे पास AlarmManager नींद के अगले कैलंडर दिवस के उदाहरण में सेवा बंद कर देता है और नींद में प्रवेश करें। यह ठीक उसी तरह काम कर रहा है जैसा मैं चाहता हूं। एक बार फिर, आपकी मदद के लिए धन्यवाद! – dell116

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