سؤال

لقد بحثت في الكثير من الأماكن ولكن لم أتمكن من العثور على شرح متسلسل واضح لكيفية بدء خدمة (أو إذا لم يكن ذلك ممكنًا، ثم نشاط) في وقت محدد يوميًا باستخدام AlarmManager؟؟

أرغب في تسجيل العديد من هذه الإنذارات ومن المفترض أن يؤدي تشغيلها إلى بدء الخدمة.سأحصل على جزء صغير من التعليمات البرمجية في الخدمة والذي يمكن تنفيذه بعد ذلك ويمكنني إنهاء الخدمة للأبد....

Calendar cal = Calendar.getInstance();
Calendar cur_cal = Calendar.getInstance();
cur_cal.setTimeInMillis(System.currentTimeMillis());
Date date = new Date(cur_cal.get(Calendar.YEAR), cur_cal.get(Calendar.MONTH), cur_cal.get(Calendar.DATE), 16, 45);
cal.setTime(date);
Intent intent = new Intent(ProfileList.this, ActivateOnTime.class);
intent.putExtra("profile_id", 2);
PendingIntent pintent = PendingIntent.getService(ProfileList.this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pintent);
System.out.println("The alarm set!!");

لقد قمت بتجربة هذا الكود لتفعيل المنبه الساعة 4.45...ولكن لا يتم طرد الخدمة ...هل يجب علي أن أبقي العملية مستمرة؟؟هل أفعل شيئا خاطئا؟؟؟

شيء آخر، يتم تنفيذ خدمتي بشكل مثالي في حالة استخدام الكود التالي:

long firstTime = SystemClock.elapsedRealtime();
alarm.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 30*1000,pintent);
هل كانت مفيدة؟

المحلول

مرحبًا أيها الأصدقاء ، بعد الكثير من البحث والرجوع من سؤال "Pentium10" حول نفس الموضوع الذي تمكنت من عمله. على الرغم من أنني ما زلت لا أستطيع أن أفهم لماذا لا يعمل مفهوم "التاريخ" والتقويم (غير الغريغوريانكالندر) الذي ذكرته في السؤال بشكل صحيح.

Calendar cur_cal = new GregorianCalendar();
cur_cal.setTimeInMillis(System.currentTimeMillis());//set the current time and date for this calendar

Calendar cal = new GregorianCalendar();
cal.add(Calendar.DAY_OF_YEAR, cur_cal.get(Calendar.DAY_OF_YEAR));
cal.set(Calendar.HOUR_OF_DAY, 18);
cal.set(Calendar.MINUTE, 32);
cal.set(Calendar.SECOND, cur_cal.get(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cur_cal.get(Calendar.MILLISECOND));
cal.set(Calendar.DATE, cur_cal.get(Calendar.DATE));
cal.set(Calendar.MONTH, cur_cal.get(Calendar.MONTH));
Intent intent = new Intent(ProfileList.this, IntentBroadcastedReceiver.class);
PendingIntent pintent = PendingIntent.getService(ProfileList.this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent);

نصائح أخرى

//Create alarm manager
AlarmManager alarmMgr0 = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

//Create pending intent & register it to your alarm notifier class
Intent intent0 = new Intent(this, AlarmReciever.class);
PendingIntent pendingIntent0 = PendingIntent.getBroadcast(this, 0, intent0, 0);

//set timer you want alarm to work (here I have set it to 7.20pm)
Intent intent0 = new Intent(this, OldEntryRemover.class);
Calendar timeOff9 = Calendar.getInstance();
timeOff9.set(Calendar.HOUR_OF_DAY, 19);
timeOff9.set(Calendar.MINUTE, 20);
timeOff9.set(Calendar.SECOND, 0);

//set that timer as a RTC Wakeup to alarm manager object
alarmMgr0.set(AlarmManager.RTC_WAKEUP, timeOff0.getTimeInMillis(), pendingIntent0);

ثم في فئة AlarmReciever الخاصة بك ، وهو عبارة عن برودكاسستيروس ، ضمن طريقة OnRecieve ، ضع منطقك. سيؤدي هذا إلى الاهتمام بالمنطق الذي تريد التعامل معه عندما يحين الوقت إلى الساعة 7.20 مساءً.

إذا كنت بحاجة إلى تعيين أجهزة إنذار متعددة ، فقم بإنشاء مثيل تقويم آخر وضبط قيم الوقت بشكل مناسب. تحتاج أيضًا إلى إنشاء مثيل آخر لـ PendingIntent وإلا فإن أجهزة ضبط الوقت سوف تتداخل. ثم قم بتعيينه على نفس المنبه مع Timer و PendingIntent الجديد.

يمكنك قراءة المستند من https://developer.android.com/training/scheduling/alarms.html

private AlarmManager alarmMgr;
private PendingIntent alarmIntent;

alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

// اضبط المنبه للبدء في الساعة 8:30 صباحًا

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 30);

// setRepeating () يتيح لك تحديد فاصل مخصص دقيق-في هذه الحالة ، // 20 دقيقة.

alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
        1000 * 60 * 20, alarmIntent);

يجب أن يعمل الرمز التالي بشكل جيد ويبدأ الخدمة @ 7:40 مساءً كل يوم. أيضًا ، إذا تم إيقاف الجهاز ، فسيتم إلغاء جميع الإنذارات الخاصة بك.

تأكد من إعداد جميع الإنذارات بعد اكتمال التمهيد.

Intent slIntent = new Intent(this, x.class);

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 19);
calendar.set(Calendar.MINUTE, 40);
calendar.set(Calendar.SECOND, 0);

PendingIntent slPendingIntent = PendingIntent.getService(this, 1, slIntent, PendingIntent.FLAG_ONE_SHOT);

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

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                          AlarmManager.INTERVAL_DAY, slPendingIntent);

حاولت الكثير لبدء الخدمة في الوقت المحدد ، لذلك لدي حل واحد مثل

  1. حساب فرق ما بين الوقت الحالي والوقت المحددمن منتقي التاريخ "العودة طويلة Timemilesec = الفرق "الفرق

  2. بعد هذا ، قم بإنشاء معالج بداخله ونوم إذا كان "ميلي ثانية" ثانية

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            CreateService();
            getActivity().startService(intentServiceObj);
        }
    }, timeMileSec);
    
    
    // Below is the service Methods.
    private void CreateService() {
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(System.currentTimeMillis());
    
        cal.add(Calendar.DAY_OF_YEAR, year);
        cal.set(Calendar.HOUR_OF_DAY, hourScreen);
        cal.set(Calendar.MINUTE, minuteScreen);
    
        // cal.setTimeInMillis(timeselectedmillisecond);
    
        Intent intent = new Intent(getActivity(),
            ServiceDailyLocationUpdate.class);
        pintent = PendingIntent.getService(getActivity(), 0, intent, 0);
    
        alarm = (AlarmManager) getActivity().getSystemService(
            Context.ALARM_SERVICE);
    
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.HOUR, 86000 * 1000,
            pintent);
    
    }
    
    // Return Differnce between two date
    private long calculateDateDiffSecond(String firstDate, String secondDate) {
    
        long numberOfDays = 0;
    
        String dateStart = firstDate;
        String dateStop = secondDate;
    
        Date d1 = null;
        Date d2 = null;
    
        try {
            d1 = sdfTime.parse(dateStart);
            d2 = sdfTime.parse(dateStop);
    
            // in milliseconds
            long diff = d2.getTime() - d1.getTime();
    
            long diffSeconds = diff / 1000 % 60;
            long diffMinutes = diff / (60 * 1000) % 60;
            long diffHours = diff / (60 * 60 * 1000) % 24;
            long diffDays = diff / (24 * 60 * 60 * 1000);
    
            System.out.print(diffDays + " days, ");
            System.out.print("Hours::" + diffHours + " hours, ");
            System.out.print("HoursMinute::" + diffMinutes + " minutes, ");
            System.out.print(diffSeconds + " seconds.");
            numberOfDays = diffDays;
            numberOfDays = diff;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return numberOfDays;
    
    }
    

لم تنجح الرموز أعلاه والرمز أدناه يعمل معي.

انخفاض الشهر 1.والساعات 0-11.

int day = ff.getGregorianDay() ;
int month = ff.getGregorianMonth() ;
int year = ff.getGregorianYear();
int hour = TimePicker1.getCurrentHour();
int minute = TimePicker1.getCurrentMinute();

Calendar cal_alarm = Calendar.getInstance(); 
cal_alarm.setTimeInMillis(System.currentTimeMillis() );
cal_alarm.set(Calendar.YEAR, year);
cal_alarm.set(Calendar.MONTH, month-1);
cal_alarm.set(Calendar.DAY_OF_MONTH, day);


cal_alarm.set(Calendar.AM_PM, Calendar.AM );
cal_alarm.set(Calendar.HOUR, hour);

if( hour >= 12){
    cal_alarm.set(Calendar.AM_PM, Calendar.PM );
    cal_alarm.set(Calendar.HOUR, hour-12);
} 
cal_alarm.set(Calendar.MINUTE, minute );
cal_alarm.set(Calendar.SECOND, 0 );

Intent myIntent = new Intent(YadavariNewActivity.this, Alarm_Sag.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(YadavariNewActivity.this, 0, myIntent,0);

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set( AlarmManager.RTC_WAKEUP, cal_alarm.getTimeInMillis(),  pendingIntent);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top