Alarm manager واستخدامه في برمجة تطبيقات اندرويد بشكل متطور

بسم الله الرحمن الرحيم

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

سنتكلم اليوم عن إنشاء منبه متطور باستخدام Date picker و Time picker وسنعتمد على أمرين :

  • التقويم Calendar .
  • مستقبل البث Broadcast Receiver .
  • Shared preference لتخزين الوقت ، سنحتاجه لاحقا .

بالإضافة لل Alarm manager لكننا لن نتحدث عنه كوننا ذكرناه في الدرس السابق .

مراجعة الدرس أو رؤيته من هنا (ضروري إن لم تكن تعرف ال Alarm manager ) : هنا

مكونات المشروع :

أكتيفيتي رئيسية واللياوت تحتوي على :

  • Date picker لضبط التاريخ .
  • Time picker لضبط الزمن .
  • Button لضبط المنبه .

وسنستخدم Shared preference .

Broadcast Receiver لتنفيذ كود ما عند انتهاء الوقت المحدد وهنا سنعرض توست .

Broadcast Receiver لإعادة ضبط المنبه في حال إعادة تشغيل الجهاز او الخروج من وضع التوفير الفائق للطاقة ، وهنا موقع استخدام ال Shared preference لتخزين الوقت عند ضبطه لأول مرة واستخدامه مجددا لإعادة ضبط المنبه .

أولا : التكلم عن Date picker و Time picker :

تعريفهم بالأكتيفيتي

    DatePicker d;
    TimePicker t;
    Button start;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        d = (DatePicker) findViewById(R.id.datePicker);
        t = (TimePicker) findViewById(R.id.timePicker);
        start = (Button) findViewById(R.id.start);

    }

وعند الضغط على الزر يتم جلب السنة والشهر واليوم والساعة والدقيقة من المؤقتين ووضبطهم إلى تقويم ( تقويم مضبوط للوقت الحالي ، اي أننا سنجمع معطياتنا من التاريخ والزمن ونضعه في التقويم ) لأننا سنستخدم الوقت المضبوط في التقويم للمنبه .

 start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Calendar c = Calendar.getInstance();
                c.set(d.getYear(), d.getMonth(), d.getDayOfMonth(),
                        t.getCurrentHour(), t.getCurrentMinute());
                long time = c.getTimeInMillis();
                SharedPreferences sh = getSharedPreferences("save", 0);
                SharedPreferences.Editor e = sh.edit();
                e.putLong("mills", time);
                e.putBoolean("state",true);
                e.commit();
                Intent intent = new Intent(MainActivity.this, Catcher.class);
                PendingIntent p = PendingIntent.getBroadcast(getApplicationContext(), 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                AlarmManager v3 = (AlarmManager) getSystemService(ALARM_SERVICE);
                v3.set(AlarmManager.RTC_WAKEUP, time, p);
                finish();
            }
        });

شرح الكود :

  • Calendar أي التقويم مع تعريفه للوقت الحالي .
  • جلب المعلومات والإدخالات من التاريخ والوقت وضبطهم للتقويم أي أن المعلومات هذه أصبحت ضمن التقويم .
  • تحويل المعطيات إلى long تمهيدا لوضعهم ضمن المنبه ( بواسطة دالة getTimeInMills الخاصة بالتقويم ) .
  • حفظهم احتياطيا إلى Shared preferences في حال إعادة تشغيل الجهاز , كما أننا وضعنا boolean في حال لم نضبط منبه لأول مرة فإنه لن يعمل .
  • كود Alarm manager طبيعي مع تغيير في ال pending intent من getActivity إلى getBroadcast كوننا سنبث ولن نذهب لأكتيفيتي .

ولنضع رسالة في Broadcast Receiver ولتكن تحمل رسالة “انتهى الوقت” .

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

public class Catcher extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "انتهى الوقت", Toast.LENGTH_SHORT).show();
    }
}

وفي ال Broadcast Receiver الأخرى سنستخدم قيمة ال long المخزنة عند ضبط المنبه لاول مرة واستخدامه مجددا عند اعادة الضبط .

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;

public class Rebooter extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        SharedPreferences sh = context.getSharedPreferences("save", 0);
        boolean state = sh.getBoolean("state", false);
        long time = sh.getLong("mills", System.currentTimeMillis());
        if (state) {
            Intent i = new Intent(context, Catcher.class);
            PendingIntent p = PendingIntent.getBroadcast(context, 1, i, PendingIntent.FLAG_UPDATE_CURRENT);
            AlarmManager v3 = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
            v3.set(AlarmManager.RTC_WAKEUP, time, p);
        }

    }
}

انتهت تدوينتا , دمتم في رعاية الله .

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

About مساهم

Check Also

التقنيات التي نستطيع برمجة تطبيقات والعاب الاندرويد بها

هل أنت محتار من أين تريد البدأ في مجال برمجة التطبيقات للهواتف الذكية أو الألعاب عالية الاداء ؟ تعرف في هذا المقال عن اللغات والتقنيات واختر منها ما يناسبك لدخول هذا المجال

تعلم برمجة تطبيق اندرويد لمدونتك البلوجر (1)

هل لديك تدوينة أو موقع إخباري ؟ أو معرض يعرض الكثير من البيانات من وسائط ؟ وبحاجة لعرضها في تطبيق اندرويد ؟ هذه فرصتك من هنا وللمبتدئين تعلم برمجة تطبيق لمدونتك

عرض صورة في التطبيق من فايربيس

بسم الله الرحمن الرحيم اليوم سيكون شرحنا عن كيفية عرض صورة  في التطبيق من قاعدة …

4 comments

  1. احمد بنكو

    شرح جميل جداً شكراً لكم

    بس لو سمحتوا
    انا عملتها جاهزة
    بس المشكلة انو لما امسح الـRecents تبعي المنبه ما بيشتغل
    يعني ما بيعمل بالخلفية
    يا ريت لو تساعدوني بهالنقطة

  2. السلام عليكم

    أخي لما أضبط الوقت واليوم واضغط على الزر بيخرج البرنامج للواجهة الرئيسية تبع الجهاز ، وبستناه لحد الوقت اللي اخترته بس مايصير أي شي ، يعني مايطلع المنبه

    +

    إذا في مجال تعطيني رابط للبرنامج كامل بكون شاكرة لك لأنه بحتاجه في مشروع التخرج للجامعة وماني قادرة اعمله

  3. لو سمحت عايز اضيف في تطبيقي التقويم الهجري

    مثلا 5من رجب 1424

ضع بصمتك بتعليق يعبر عن امتنانك

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.