有点不太明白大伙说的不能设置多个闹铃,为什么非要计算闹铃和当前时间的差值呢...android闹铃给了我们个误区啊!
上一篇的闹铃多个是可以的哇,这不就设置了多个呢
接着上一篇内容直接改的:安卓系统没有塞班那么牛K,关机是没有闹铃的,而且开机后闹铃也是需要重新设置的,我们需要做的事就是设置闹铃的时候存起来,开机之后取出来.
下面来分析下我们该怎么去完成这个功能:
1.首先要准备好一个数据库.
2.开机广播监听,重新设置即可
简单吧,现在来看下:
开机广播类AlarmInitReceiver:
package com.glacier.demo;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import com.glacier.db.DbHelper;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
/**
* 开机重新设置闹铃广播
* @author wangyubin
*
*/
public class AlarmInitReceiver extends BroadcastReceiver {
Cursor cursor;
private Calendar calendar;
@Override
public void onReceive(Context context, Intent intent1) {
// TODO Auto-generated method stub
String action = intent1.getAction();
//如果是开机广播的话就重新设计闹铃
if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
setAlarmTime(context);
}
}
/**
* 重新设置内容
* @param context 上下文
*/
private void setAlarmTime(Context context) {
calendar = Calendar.getInstance();
// 得到当前时间并设置到日历里面
calendar.setTimeInMillis(System.currentTimeMillis());
DbHelper dbHelper = new DbHelper(context);
Date date = new Date();
//查询数据库存储的闹铃
cursor = dbHelper.query();
while (cursor.moveToNext()) {
String timer = cursor.getString(0);
System.out.println(timer);
try {
if (ConverToDate(timer).getTime() > date.getTime()) {
System.out.println(timer.split(" ")[0].split("-")[0] + "/"
+ timer.split(" ")[0].split("-")[1] + "/"
+ timer.split(" ")[0].split("-")[2] + " "
+ timer.split(" ")[1].split(":")[0] + ":"
+ timer.split(" ")[1].split(":")[1]);
//这边读取年月日时分,也可以读取存进来的long值
calendar.set(
Integer.valueOf(timer.split(" ")[0].split("-")[0]),
Integer.valueOf(timer.split(" ")[0].split("-")[1])-1,
Integer.valueOf(timer.split(" ")[0].split("-")[2]),
Integer.valueOf(timer.split(" ")[1].split(":")[0]),
Integer.valueOf(timer.split(" ")[1].split(":")[1]),
0);
Intent intent = new Intent(context, AlamrReceiver.class);
// 设置intent的动作,识别当前设置的是哪一个闹铃,有利于管理闹铃的关闭
intent.setAction(timer);
// 用广播管理闹铃
PendingIntent pi = PendingIntent.getBroadcast(context, 0,
intent, 0);
// 获取闹铃管理
AlarmManager am = (AlarmManager) context
.getSystemService(Activity.ALARM_SERVICE);
// 设置闹钟
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
pi);
// 设置闹钟重复时间
am.setRepeating(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), 10 * 1000, pi);
} else {
//过期的闹铃将不进行设置(可以重数据库中删除)
dbHelper.delete(timer);
System.out.println("当前这个闹铃已过期");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(null!=cursor){
cursor.close();
}
if(null!=dbHelper){
dbHelper.close();
}
}
public static Date ConverToDate(String strDate) throws Exception {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
return df.parse(strDate);
}
}
闹铃储存帮助类DbHelper:
package com.glacier.db;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* 闹铃储存帮助类
* @author wangyubin
*
*/
public class DbHelper extends SQLiteOpenHelper {
private final static String DB_NAME = "alarm.db";
private final static int DB_VERSION = 1;
private SQLiteDatabase database;
private Cursor cursor;
/**
* 主数据库
*
* @param context
*/
public DbHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE IF NOT EXISTS " + "ALARM" + "("
+ "ID VARCHAR(20)," + "DATE TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
/**
* 判断是否存在
*
* @param id
* @return
*/
public boolean isExist(String id) {
database = getReadableDatabase();
cursor = database.query("ALARM", new String[] { "ID" }, "ID like ?",
new String[] { id }, null, null, null);
return cursor.moveToNext();
}
/**
* 查询所有数据
*
* @return
*/
public Cursor query() {
database = getReadableDatabase();
cursor = database.query("ALARM", null, null, null, null, null, null);
return cursor;
}
/**
* 删除数据
*
* @param id
*/
public void delete(String id) {
database = getWritableDatabase();
database.delete("ALARM", "ID like ?", new String[] { id });
}
/**
* 更新数据
*
* @param id
* @param date
*/
public void update(String id, String date) {
database = getWritableDatabase();
ContentValues cv = new ContentValues();
if (isExist(id)) {
cv.put("DATE", date);
database.update("ALARM", cv, "ID like ?", new String[] { id });
} else {
cv.put("ID", id);
cv.put("DATE", date);
database.insert("ALARM", null, cv);
}
}
public void closeCursor() {
if (null != cursor) {
cursor.close();
}
}
public void closeDatabase() {
if (null != database) {
this.database.close();
}
}
}
闹铃管理(提示:设置过去的时间会一直提示:大家在把时间设置成闹铃的时间取消即可)AlarmActivity:
package com.glacier.demo;
import java.util.Calendar;
import com.glacier.db.DbHelper;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;
/***
* 闹铃管理(提示:设置过去的时间会一直提示:大家在把时间设置成闹铃的时间取消即可)
*
* @author wangyubin
*
*/
public class AlarmActivity extends Activity implements OnClickListener {
private TextView mTitleTv, mDatePickerTv, mTimePickerTv;
private DatePicker mDatePicker;
private TimePicker mTimePicker;
private Button mInstallBtn, mCancelBtn;
private Calendar calendar;
private int year, month, day, hour, minute;
private DbHelper dbHelper;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alarm);
dbHelper = new DbHelper(this);
init();
}
private void init() {
mTitleTv = (TextView) findViewById(R.id.tv_title);
mDatePicker = (DatePicker) findViewById(R.id.datePicker);
mTimePicker = (TimePicker) findViewById(R.id.timePicker);
mDatePickerTv = (TextView) findViewById(R.id.tv_datepicker);
mTimePickerTv = (TextView) findViewById(R.id.tv_timepicker);
mInstallBtn = (Button) findViewById(R.id.btn_install);
mCancelBtn = (Button) findViewById(R.id.btn_cancel);
calendar = Calendar.getInstance();
// 得到当前时间并设置到日历里面
calendar.setTimeInMillis(System.currentTimeMillis());
// 获取到当前的时间
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH);
day = calendar.get(Calendar.DATE);
hour = calendar.get(Calendar.HOUR_OF_DAY);
minute = calendar.get(Calendar.MINUTE);
// 设置date控件的初始化以及监听
mDatePicker.init(year, month, day, new OnDateChangedListener() {
public void onDateChanged(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
mDatePickerTv.setText("您选择的日期是:" + year + "年"
+ (monthOfYear + 1) + "月" + dayOfMonth + "日");
AlarmActivity.this.year = year;
AlarmActivity.this.month = monthOfYear;
AlarmActivity.this.day = dayOfMonth;
}
});
// 设置24小时制
mTimePicker.setIs24HourView(true);
mTimePicker.setOnTimeChangedListener(new OnTimeChangedListener() {
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
mTimePickerTv.setText("您选择的时间是:" + hourOfDay + "时" + minute
+ "分");
AlarmActivity.this.hour = hourOfDay;
AlarmActivity.this.minute = minute;
}
});
// 设置闹铃按钮监听
mInstallBtn.setOnClickListener(this);
mCancelBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
// 这里讲一个我们遇到的命名的问题:仔细看case后面都带一个大括号,这样里面的switch里面的局部变量就变成了单独的case里面的局部变量,防止命名冲突
case R.id.btn_install: {
// 设置闹铃的时间(年,月,日,时,分,秒)
calendar.set(year, month, day, hour, minute, 0);
int newMonth = month + 1;
Intent intent = new Intent(this, AlamrReceiver.class);
String time = year + "-" + newMonth + "-" + day + " " + hour + ":"
+ minute;
// 设置intent的动作,识别当前设置的是哪一个闹铃,有利于管理闹铃的关闭
intent.setAction(time);
dbHelper.update(time, calendar.getTimeInMillis()+"");
// 用广播管理闹铃
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);
// 获取闹铃管理
AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
// 设置闹钟
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);
// 设置闹钟重复时间
am.setRepeating(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), 10 * 1000, pi);
// 获取到的月份是0~11,所以要加1
mTitleTv.setText("您选择的闹铃为:" + year + "年" + newMonth + "月" + day
+ "日" + hour + "时" + minute + "分");
break;
}
case R.id.btn_cancel: {
int newMonth = month + 1;
Intent intent = new Intent(this, AlamrReceiver.class);
// 找出当前控件选择的闹铃时间,并关闭当前选择的闹铃
String time = year + "-" + newMonth + "-" + day + " " + hour + ":"
+ minute;
intent.setAction(time);
dbHelper.delete(time);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
am.cancel(pi);
mTitleTv.setText("您取消了" + year + "年" + newMonth + "月" + day + "日"
+ hour + "时" + minute + "分" + "的闹铃!!!");
break;
}
}
}
}
闹铃接受器AlamrReceiver:
package com.glacier.demo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
/**
* 闹铃接受器
* @author wangyubin
*
*/
public class AlamrReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(context, "闹钟时间到:"+intent.getAction(), Toast.LENGTH_LONG).show();
Intent intent1=new Intent(context,AlarmActivity.class);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
}
}
配置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.glacier.demo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".AlarmActivity"
android:label="@string/title_activity_alarm" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".AlamrReceiver"
android:process=":remote" >
</receiver>
<receiver android:name=".AlarmInitReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.TIME_SET" />
<action android:name="android.intent.action.TIMEZONE_CHANGED" />
<action android:name="android.intent.action.LOCALE_CHANGED" />
</intent-filter>
</receiver>
</application>
</manifest>
至此完成!
猿码:点击打开下载