طرق استخدام الـ Alarm Manager

Mohammad Laifمنذ 5 سنوات

بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

 

في الدرس السابق تعرفنا على الـ Alarm Manager, في هذا الدرس سنرى طرق استخدامه مع الوقت النسبي المنصرم ومع الوقت الحقيقي في نظام الاندرويد.

 

طريقة استخدام الـ Alarm Manager مع الوقت النسبي او مايسمى بالـ Elapsed Real Time

الخطوات:

  • انشاء كلاس Broadcast.
  • انشاء كلاس Service تعمل في خيط حاسوبي مختلف او استخدام الـ IntentService.
  • انشاء Intent تقوم وظيفتها بتشغيل كلاس الـ Broadcast عندما يحين الوقت.
  • انشاء Pending Intent كنوع العملية التي ستقوم بتشغيل تلك الـ Intent.
  • تجهيز نوع الـ Alarm و الوقت المطلوب.
  • واخيراً ضبط الـ Alarm.

 

مناسب لتنبيهات التي تكون كل ٣٠ ثانية وما الى ذلك التي لا تتاثر بالمنطقة الزمنية للمستخدم.

 

انشاء كلاس Broadcast:

كما جاء في الدرس: انشاء الـ Broadcast Receiver بشكل ثابت.

public class BroadcastForAlarm extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // Extract data from the intent
        String name = intent.getStringExtra("NAME_KEY");

        // Create an Intent to run our IntentService
        Intent intentForService = new Intent(context, IntentServiceForAlarm.class);
        intentForService.putExtra("NAME_KEY", name);

        // Trigger our service to be run (e.g. a service that runs sounds or shows notification).
        context.startService(intentForService);
    }

}

لاحظ التالي:

  • لاحظ طريقة استقبال البيانات ثم ارسالها الى كلاس الـ Service.

 

انشاء كلاس Service تعمل في خيط حاسوبي مختلف او استخدام الـ IntentService:

كما جاء في الدرس: انشاء الـ Intent Service.

public class IntentServiceForAlarm extends IntentService {

    private static final String TAG = "IntentServiceForAlarm";

    /**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     *
     * @param name Used to name the worker thread, important only for debugging.
     */
    public IntentServiceForAlarm(String name) {
        super(name);
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Log.d(TAG, "onHandleIntent: " + intent.getStringExtra("NAME_KEY"));
    }
}

 

انشاء Intent تقوم وظيفتها بتشغيل كلاس الـ Broadcast عندما يحين الوقت:

Intent intent = new Intent(Main9Activity.this, BroadcastForAlarm.class);
intent.putExtra("NAME_KEY", "Mohammad");

 

انشاء Pending Intent كنوع العملية التي ستقوم بتشغيل تلك الـ Intent:

PendingIntent alarmOperation = PendingIntent.getBroadcast(
        Main9Activity.this,
        0,  // to determine alarms if you have many.
        intent,
        PendingIntent.FLAG_UPDATE_CURRENT);

لاحظ التالي:

  • القيمة 0 هي المسؤلة عن تحديد الـ Alarm, بمعنى اخر اذا تريد صنع اكثر من Alarm واحد فعليك بإختيار قيمة فريده لكل واحد منهم.
  • الـ FLAG_UPDATE_CURRENT والمعنى من ذلك انه اذا كان هذا الـ Alarm مجدول في النظام فقم بتحديثه.

 

تجهيز نوع الـ Alarm و الوقت المطلوب:

int AlarmType = AlarmManager.ELAPSED_REALTIME;
long alarmTime = SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_FIFTEEN_MINUTES;

لاحظ التالي:

  • بالنسبة لنوع الـ Alarm يوجد نوعان وهما:
    • ELAPSED_REALTIME: النوع الاول من الوقت النسبي, لايستطيع تنبيه المستخدم عندما تكون شاشة هاتفه مغلقه.
    • ELAPSED_REALTIME_WAKEUP: النوع الثاني من الوقت النسبي, يستطيع تنبيه المستخدم عندما تكون شاشة هاتفه مغلقه.
  • بالنسبة للوقت فيكون بالملي ثانية زائداً على وقت تشغيل الهاتف. هنا قمنا بإستخدام اوقات موجودة مسبقاً INTERVAL_FIFTEEN_MINUTES في كلاس الـ AlarmManager.

 

واخيراً ضبط الـ Alarm:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmType, alarmTime, alarmOperation);

لاحظ التالي:

  • قما بالحصول على عنصر من الـ AlarmManager من النظام بإستخدام الدالة getSystemService.
  • ثم قمنا بعمل جدولة له بإستخدام دالة الـ set وتزويدها بنوع الـ Alarm والوقت والعملية المراد تشغيلها.
  • توجد بعض الدوال تناسب اوضاع مختلفه افضل من الـ set كـ:
    • setAndAllowWhileIdle: لضبط الـ Alarm والتأكد من تشغيله في الوضع الخامل.
    • setExactAndAllowWhileIdle: لضبط الـ Alarm بشكل دقيق والتأكد من تشغيله حتى في الوضع الخامل (يستعمل للـ Alarm الضروريه).

 

الدالة set تقوم بضبط المنبه ولكن عندما يحين التشغيل فالنظام يتحكم بالوقت بعض الشئ, اذا اردت ان تؤكد تشغيل الـ Alarm بالوقت الدقيق استخدام الدالة: setExactAndAllowWhileIdle وايضاً النوع ELAPSED_REALTIME_WAKEUP.

 

في حالة اردت ان يتكرر الـ Alarm يكون الضبط على هذا الشكل:

long alarmRepeatTime = SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_DAY;
alarmManager.setRepeating(AlarmType, alarmTime, alarmRepeatTime, alarmOperation);

لاحظ التالي:

  • ستقوم الدالة setRepeating بإعادة جدولة الـ Alarm كل يوم بعد انطلاقه من ١٥ دقيقه.

 

 طريقة استخدام الـ Alarm Manager مع الوقت الحقيقي او مايسمى بالـ Real Time Clock اختصارً RTC

مشابه للسابق, ولكن الفرق في الخطوة: تجهيز نوع الـ Alarm والوقت المطلوب.

الخطوات:

  • انشاء كلاس Broadcast.
  • انشاء كلاس Service تعمل في خيط حاسوبي مختلف او استخدام الـ IntentService.
  • انشاء Intent تقوم وظيفتها بتشغيل كلاس الـ Broadcast عندما يحين الوقت.
  • انشاء Pending Intent كنوع العملية التي ستقوم بتشغيل تلك الـ Intent.
  • تجهيز نوع الـ Alarm و الوقت المطلوب.
  • واخيراً ضبط الـ Alarm.

 

مناسب للتنبيهات التي تتأثر بالمنطقة الزمنية للمستخدم, مثلاً تريد تنبيهه الساعة ٦ صباحاً من كل يوم دراسة.

 

تجهيز نوع الـ Alarm والوقت المطلوب:

int AlarmType2 = AlarmManager.RTC;

Calendar calendar =  Calendar.getInstance();
calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 3);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 6);
calendar.set(Calendar.MINUTE, 30);

لاحظ التالي:

  • بالنسبة لنوع الـ Alarm يوجد نوعان وهما:
    • RTC: النوع الاول من الوقت الحقيقي, لايستطيع تنبيه المستخدم عندما تكون شاشة هاتفه مغلقه.
    • RTC_WAKEUP: النوع الثاني من الوقت الحقيقي, يستطيع تنبيه المستخدم عندما تكون شاشة هاتفه مغلقه.
  • بالنسبة للوقت فيكون بالملي ثانية واستخدمنا عنصر الـ Calender لتحديده.

 

ضبط الـ Alarm:

alarmManager.set(AlarmType2, calendar.getTimeInMillis(), alarmOperation);

لاحظ التالي:

  • قمنا بالحصول على الوقت بالملي ثانية من عنصر الـ Calendar.

 

إلغاء الـ Alarm

لإلغاء الـ Alarm فقط قم بإعادة تكوين العمليه (الـ Pending Intent) واستخدم دالة الالغاء cancel من العنصر AlarmManager كالتالي:

Intent intent = new Intent(Main9Activity.this, BroadcastForAlarm.class);
intent.putExtra("NAME_KEY", "Mohammad");

// The Pending Intent (Watch the Request Code if you have multiple alarms).
PendingIntent alarmOperation = PendingIntent.getBroadcast(
        Main9Activity.this,
        0,  // to determine alarms if you have many.
        intent,
        PendingIntent.FLAG_UPDATE_CURRENT);

// Get Alarm Manager from the system.
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(alarmOperation);

لاحظ التالي:

القيمة 0 هي المسؤلة عن تحديد الـ Alarm المراد الغائه.

 

اعادة جدولة الـ Alarm

عندما يقوم المستخدم بإعادة تشغيل هاتفه فجميع الـ Alarms بتطبيقك سوف تمحى من النظام.

الحل؟
استخدام الـ Broadcast Receive للـ Boot الذي يبثه النظام حتى نعيد جدولة اوقات جميع الـ Alarm الخاصة بالتطبيق.

الخطوات:

  • وضع التصريح في ملف الـ Manifext.xml.
  • انشاء Broadcast Receiver ثابت كما جاء في الدرس.
  • انشاء كلاس للـ Broadcast Receiver كما جاء في الدرس.

 

وضع التصريح في ملف الـ Manifest.xml:

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


انشاء كلاس Broadcast Receiver:

public class SampleBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
            // Set the alarm here.
        }
    }
}

لاحظ التالي:

  • في هذه الكلاس تقوم بإعادة ضبط جميع الـ Alarms التي قام بضبطها المستخدم.


اضافة هذه الكلاس في ملف الـ Manifest.xml مع حدث التشغيل للهاتف:

<receiver android:name=".SampleBootReceiver"
        android:enabled="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>

 

في هذا الدرس راينا طرق استخدام الـ Alarm Manager. في الدروس القادمة سنرى الاشياء المتاحه الاخرى الذي يوفرها نظام الاندرويد Android SDK في انشاء وتنفيذ المهام كالـ JobSchedualer و الـ JobDispatcher و الـ WorkManager.

 

رابط الكلاسات المستخدمه في هذا الدرس

 

المصادر والمراجع

للمزيد راجع درس المقدمة.
 

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

المحاضر

Mohammad Laif

محتوى الدورة

تمهيد
1 مقدمة
2 تعرف على التزامن (الـ Concurrency)
3 اخطاء التزامن (الـ Concurrency) الشائعة
العمليات Processes
1 الهيكلة الهندسية لبيئة نظام الاندرويد
2 طبقة الـ Android Runtime و العمليات Processes
3 انواع العمليات (Processes)
الخيوط الحاسوبية Threads
1 الخيوط الحاسوبية (Threads)
2 مكونات الخيوط الحاسوبية (Thread)
3 انشاء الخيط الحاسوبي
أنماط التصميم للخيوط الحاسوبية
1 انشاء نمط الـ Handler و Looper و Thread
2 انشاء نمط الـ HandlerThreads
3 ماهو نمط الـ Thread Pools (الـ Executors)
4 استخدام نمط الـ Thread Pools كـ Singleton
5 استخدام الـ Callable مع نمط الـ Thread Pools
6 انشاء بركة خيوط حاسوبية Thread Pools لتسريع قاعدة البيانات
7 انشاء نمط الـ AsyncTask
8 انشاء نمط الـ Loader
الـ Broadcasts
1 تعرف على الـ Broadcast Receiver
2 انشاء الـ Broadcast Receiver بشكل ثابت
3 انشاء الـ Broadcast Receiver بشكل ديناميكي
4 استخدام الـ Local Broadcast للتخاطب بين المكونات
الـ Services
1 تعرف على الـ Services
2 انشاء الـ Started Service
3 انشاء الـ Intent Service
4 انشاء الـ Bound Service
5 استخدام الـ ResultReceiver للتخاطب مع الـ Intent Service
6 استخدام الـ Broadcast للتخاطب مع الـ Started Service
الـ Alarm Manager
1 تعرف على الـ Alarm Manager
2 طرق استخدام الـ Alarm Manager الدرس الحالي
الـ Jobs
1 استخدام الـ Android JobSchedualer
2 استخدام الـ Firebase JobDispatcher
3 استخدام الـ WorkManager من حزمة JetPack

الكلمات الدليلية

عن الدرس

1 إعجاب
1 متابع
0 مشاركة
3550 مشاهدات
منذ 5 سنوات

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !