के दौरान शेड्यूल अधिसूचना करने के लिए अलार्म प्रबंधक और सेवा का उपयोग करें, मैं एक ऐप बना रहा हूं जो उपयोगकर्ताओं के घंटों के दौरान विशिष्ट समय-अंतराल पर अधिसूचनाएं ट्रिगर करेगा।विशिष्ट समय अवधि
मेरे पास एक अलार्म प्रबंधक है जो किसी सेवा के अंदर चल रहा है। सेवा मुख्य गतिविधि पर बटन क्लिक के माध्यम से स्पष्ट रूप से शुरू की गई है और अलार्ममेनगर विशिष्ट समय 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 ने इस दैनिक सूचनाओं के लिए एक टाइमर का उपयोग करने के लिए इच्छुक भर आता है:
एक टाइमर जो एक सेवा के अंदर चलाता है जब डिवाइस क्रम से रोक दिया जाएगा सोया जाता है (यानी ... उपयोगकर्ता फोन को स्टैंडबाय में रखता है)। इसके लिए, विशिष्ट समय अंतराल पर सूचनाओं को आग लगाने के लिए टाइमर का उपयोग करना किसी सेवा के भीतर सही ढंग से काम नहीं करेगा क्योंकि जब एंड्रॉइड सेवा को रोक देता है, तो यह टाइमर को रोकता है, जो अंतराल को फेंक देता है।
ऐसा करने का सही तरीका दिन के दौरान विशिष्ट समय पर अलार्म सेट करने के लिए लंबित इरादों की एक सरणी के साथ अलार्ममेनगर का उपयोग करना है। यह सुनिश्चित करता है कि भले ही फोन स्टैंडबाय में रखा गया हो, अधिसूचनाएं (या जो भी आप उस समय घटित करना चाहते हैं) अभी भी निष्पादित की जाएगी।
'mySharedPreferences.getBoolean' गायब था -' // TODO: सेवा बनाने के दौरान क्रियाएं करने की क्रियाएं 'की आवश्यकता है? (कम से कम प्रश्न में - अन्य TODO ठीक है) इसके अलावा एक (लंबी चल रही) सेवा का उपयोग क्यों करें? –
@Mr_and_Mrs_D - मैं इसे करने के लिए लंबित इरादे की एक सरणी के साथ अलार्ममेनगर क्लास का उपयोग कर समाप्त हुआ। – dell116