android 在一基础上增加闹铃存储和开机重新设置(二)

有点不太明白大伙说的不能设置多个闹铃,为什么非要计算闹铃和当前时间的差值呢...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>

至此完成!


猿码:点击打开下载


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值