في هذه الدرس سوف نقدم كود تعليمي لإنشاء ساعة منبّه بسيطة.
تستند ساعات المنبهات إلى الوقت المحدد وغير الدقيق ، وتكرارها وعدم تكرارها. بدءًا من الإصدار 19 من واجهة برمجة تطبيقات (Android) ، تكون جميع أجهزة الإنذار المتكررة غير دقيقة. في مثالنا ، لدينا اثنين من زر البدء والتوقف. عند نقرة البداية، سيتم عرض منتقي الوقت وبعد تحديد الوقت، سيتم جدولة التنبيه. قبل التنفيذ إذا نقرنا على التوقف، فسيتم إلغاء التنبيه الذي تمت جدولته.

كما العادة إنشاء مشروع جديد و إنشاء الملفات الناقصة و المذكورة في المثال أدناه.

  • الخطوة الأولى: 

إضافة الكود التالي في ملف (MainActivity.java)

package com.concretepage.android;
import java.util.Calendar;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends FragmentActivity{
	private static int timeHour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
	private static int timeMinute = Calendar.getInstance().get(Calendar.MINUTE);
	TextView textView1;
	private static TextView textView2;
	public static TextView getTextView2() {
		return textView2;
	}
	AlarmManager alarmManager;
	private PendingIntent pendingIntent;
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.mylayout);
		textView1 = (TextView)findViewById(R.id.msg1);
		textView1.setText(timeHour + ":" + timeMinute);
		textView2 = (TextView)findViewById(R.id.msg2);
		
		alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                Intent myIntent = new Intent(MainActivity.this, AlarmReceiver.class);
                pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, 0);
        
                OnClickListener listener1 = new OnClickListener() {
			public void onClick(View view) {
				textView2.setText("");
				Bundle bundle = new Bundle();
				bundle.putInt(MyConstants.HOUR, timeHour);
				bundle.putInt(MyConstants.MINUTE, timeMinute);
				MyDialogFragment fragment = new MyDialogFragment(new MyHandler());
				fragment.setArguments(bundle);
                                FragmentManager manager = getSupportFragmentManager();
                                FragmentTransaction transaction = manager.beginTransaction();
                                transaction.add(fragment, MyConstants.TIME_PICKER);
                                transaction.commit();
			}
               };
        
               Button btn1 = (Button)findViewById(R.id.button1);
               btn1.setOnClickListener(listener1);
               OnClickListener listener2 = new OnClickListener() {
			public void onClick(View view) {
				textView2.setText("");
				cancelAlarm();
			}
              };
              Button btn2 = (Button)findViewById(R.id.button2);
              btn2.setOnClickListener(listener2);
        }
        class MyHandler extends Handler {
    	   @Override
    	   public void handleMessage (Message msg){
    		Bundle bundle = msg.getData();
    		timeHour = bundle.getInt(MyConstants.HOUR);
    		timeMinute = bundle.getInt(MyConstants.MINUTE);
    		textView1.setText(timeHour + ":" + timeMinute);
    		setAlarm();
    	  }
        }
        private void setAlarm(){
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, timeHour);
	        calendar.set(Calendar.MINUTE, timeMinute);
                alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        }
        private void cancelAlarm() {
               if (alarmManager!= null) {
        	   alarmManager.cancel(pendingIntent);
               }
        }
}
  • الخطوة الثانية:

إنشاء ملف (AlarmReceiver.java)

package com.concretepage.android;
import android.content.Context;
import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.content.WakefulBroadcastReceiver;
public class AlarmReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(final Context context, Intent intent) {
        MainActivity.getTextView2().setText("Enough Rest. Do Work Now!");
        Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        Ringtone ringtone = RingtoneManager.getRingtone(context, uri);
        ringtone.play();
    }
}
  • الخطوة الثالثة:

إنشاء ملف (MyDialogFragment.java)

package com.concretepage.android;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.DialogFragment;
import android.widget.TimePicker;
public class MyDialogFragment extends DialogFragment {
	private int timeHour;
	private int timeMinute;
	private Handler handler;
	public MyDialogFragment(Handler handler){
		this.handler = handler;
	}
	@Override
	public Dialog onCreateDialog(Bundle savedInstanceState) {
            Bundle bundle = getArguments();
            timeHour = bundle.getInt(MyConstants.HOUR);
            timeMinute = bundle.getInt(MyConstants.MINUTE);
            TimePickerDialog.OnTimeSetListener listener = new TimePickerDialog.OnTimeSetListener() {
			public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
				timeHour = hourOfDay;
				timeMinute = minute;
				Bundle b = new Bundle();
				b.putInt(MyConstants.HOUR, timeHour);
				b.putInt(MyConstants.MINUTE, timeMinute);
				Message msg = new Message();
				msg.setData(b);
				handler.sendMessage(msg);
			}
	    };
	    return new TimePickerDialog(getActivity(), listener, timeHour, timeMinute, false);
	}
  • الخطوة الرابعة:

إنشاء ملف (MyConstants.java)

package com.concretepage.android;
public abstract class MyConstants {
	public static final String HOUR = "time_hour";
	public static final String MINUTE = "time_minute";
	public static final String TIME_PICKER = "time_picker";
}
  • الخطوة الخامسة:

ضع الكود التالي في ملف (AndroidManifest.xml)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.concretepage.android"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="19" />
    <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
    <application
        android:allowBackup ="false"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity  android:name=".MainActivity" android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".AlarmReceiver"/>
    </application>
</manifest>
  • الخطوة السادسة:

ضع الكود التالي في ملف (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#D1C4E9"
    android:orientation="vertical" >
    <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_start"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
	android:layout_gravity="center"
	android:textColor="#FF8A80"
	android:textSize="100sp"
	android:id="@+id/msg1"/>
    <Button
        android:id="@+id/button2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_stop"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
	android:layout_gravity="center"
	android:textColor="#4CAF50"
	android:textSize="50sp"
	android:id="@+id/msg2"/>
</LinearLayout>
  • الخطوة الأخيرة:

ضع الكود التالي في ملف (strings.xml)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Concrete Page</string>
    <string name="btn_start"> Start </string>
    <string name="btn_stop"> Stop </string>
</resources>

الان قم بتجربة التطبيق.