Android闹钟
在编写闹钟之前首先说一下Android中的广播机制,BroadCast是一种广泛应用的在应用程序之间传输信息的机制,例如在现实生活中人们听收音机,许许多多不同的广播电台发送特定频率的信号,当人们的收音机调成与广播电台频率相同时就可以收听广播内容了,Android中的广播机制差不多就是这个意思。
注: 1、在Android中我们所发送的广播内容是在一个Intent对象中的。
2、在Android中要想接收广播内容则需要注册一个BroadCastReceiver进行接收,只有发送广播的action与接收广播的action相同时才可以接收广播内容。
接下来开始编写闹钟代码:
1、首先我们要写一个闹钟响的时候给用户的提示信息的类,这个类继承自Activity
public class AlarmMessageActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new AlertDialog.Builder(this).setTitle("该起床了").setMessage("现在得时间是:" +
new SimpleDateFormat("yyyy年MM月dd日mm分ss秒").format(new Date())).setPositiveButton("关闭", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
AlarmMessageActivity.this.finish();
}
}).show();
}
}
2、接下来就是布局文件。
<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:orientation="vertical"
tools:context=".MainActivity">
<!--
定义一个时间选择器,和两个按钮
-->
<TimePicker
android:id="@+id/tp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</TimePicker>
<TextView
android:id="@+id/text1"
android:text="当前未设置闹钟"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置闹钟"/>
<Button
android:id="@+id/delet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消闹钟"
/>
</LinearLayout>
3、编写一个广播接收类
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/*
定义一个广播接收器
*/
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent it = new Intent(context, AlarmMessageActivity.class);
//Context中有一个startActivity方法,Activity继承自Context,
//重载了startActivity方法。如果使用Activity的 startActivity
// 方法,不会有任何限制,而如果使用Context的startActivity方法的话,就需要开启一个新的task.
it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(it);
}
}
4、编写MainActivity.java文件代码
package com.example.dell.broadcastproject;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import java.util.Calendar;
import java.util.Timer;
public class MainActivity extends AppCompatActivity {
//闹钟服务
private AlarmManager alarm;
private Button setAlarm, deletAlarm;
private TextView text1;
private TimePicker tp;
//由于无法取得时间,所以设置两个整型值记录
private int hourOfDay = 0;
private int minute = 0;
//根据默认的时区实例化对象
private Calendar calendar = Calendar.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setAlarm = (Button)findViewById(R.id.set);
deletAlarm = (Button)findViewById(R.id.delet);
text1 = (TextView)findViewById(R.id.text1);
tp = (TimePicker)findViewById(R.id.tp);
tp.setIs24HourView(true);
//取得闹钟服务
alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
setAlarm.setOnClickListener(new OnSetClickListenerImpl());
deletAlarm.setOnClickListener(new OnDeleteClickListenerImpl());
tp.setOnTimeChangedListener(new OnTimeChangedListenerImpl());
}
private class OnTimeChangedListenerImpl implements TimePicker.OnTimeChangedListener {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
//给calendar设置为当前的时间
MainActivity.this.calendar.setTimeInMillis(System.currentTimeMillis());
//设置小时数
MainActivity.this.calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
//设置分钟数
MainActivity.this.calendar.set(Calendar.MINUTE, minute);
//设置秒数,由于设置闹钟时大部分都不使用秒和毫秒所以这里设置为0
MainActivity.this.calendar.set(Calendar.SECOND, 0);
//设置毫秒数
MainActivity.this.calendar.set(Calendar.MILLISECOND, 0);
MainActivity.this.hourOfDay = hourOfDay;
MainActivity.this.minute = minute;
}
}
private class OnSetClickListenerImpl implements View.OnClickListener {
@Override
public void onClick(View v) {
//启动AlarmReceiver这个类
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
//设置一个动作,就好比是在设置一个特有的频率,在后边配置AndroidManifest.xml文件时
//再设置一个过滤器就把名字为"org.lxh.action.setalarm"的Intent给过滤出来了。
intent.setAction("org.lxh.action.setalarm");
//PendingIntent不是立刻执行某个动作,而是当满足一定条件或触发某个事件时才执行指定的操作
PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
/*
参数解释:
第一个参数:表示闹钟类型。
第二个参数:表示闹钟的执行时间(闹钟什么时候响)。
第三个参数:表示闹钟响的时候该去干什么
AlarmManager.RTC_WAKEUP:硬件闹钟,当闹钟响时唤醒手机休眠
AlarmManager.ELAPSED_REALTIME_WAKEUP,真实时间流逝闹钟,当闹钟响时唤醒手机休眠
*/
MainActivity.this.alarm.set(AlarmManager.RTC_WAKEUP,MainActivity.this.calendar.getTimeInMillis(),sender);
//在文本组件上显示闹钟响起的时间
MainActivity.this.text1.setText("闹钟响起的时间是:" + MainActivity.this.hourOfDay + " 点 " + MainActivity.this.minute + " 分");
//设置一个消息提示框
Toast.makeText(MainActivity.this,"闹钟设置成功", Toast.LENGTH_LONG).show();
}
}
private class OnDeleteClickListenerImpl implements View.OnClickListener {
@Override
public void onClick(View v) {
if (MainActivity.this.alarm != null) {
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
intent.setAction("org.lxh.action.setalarm");
PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
//取消闹钟
MainActivity.this.alarm.cancel(sender);
MainActivity.this.text1.setText("您已成功删除当前闹钟");
Toast.makeText(MainActivity.this,"闹钟删除成功", Toast.LENGTH_LONG).show();
}
}
}
}
5、对AndroidManifest.xml文件进行配置,以下是配置代码。
<receiver android:name="AlarmReceiver"
android:enabled="true"
android:process=":remote"
>
//过滤出名字为org.lxh.action.setalarm的Intent
//如若匹配则会调用AlarmReceiver.java中的onReceive()方法
<intent-filter>
<action android:name="org.lxh.action.setalarm"></action>
</intent-filter>
</receiver>