Android项目小结---闹铃备忘录小开发知识点(附有:源码下载)
2012-08-22 15:00
302 查看
一、闹铃功能介绍:
1、为每条备忘添加闹铃
2、备忘内容和闹铃信息存在SQL中
3、可删除每天记录和闹铃或者删除所有
4、到点闹铃启动,包括锁屏时和重开机
5、在桌面的创建一个widget类似便签那样的东西显示记录
二、看下效果图:
三、关于SQL部分不再细写,可查看Android应用开发一栏:
添加闹铃和备忘:
1、设置日期:
2、设置时间:
3、广播闹铃:
4、广播接收BroadcastReceiver:
记得注册:
5、重启之后重写闹铃,BootReceiver:
6、开始重写:
这里有个很需要注意的:
若是PendingIntent.getBroadcas,则intent必须为启动的是BroadcastReceiver,不然重写不会成功的。
7、到点闹铃响,这是由AlarmReceiver(继承BroadcastReceiver)启动的:
锁屏时也启动闹铃:
9、点击listview可查看记录内容,长按可进行记录的删除,这里不再多写。
10、由于是闹铃,所以必须每一秒中进行更新一下倒计时,这个可以查看Android学习笔记一栏。
11、附:让title每秒显示时间:
------------------(修改版)----------------------
12、是否为记录添加闹铃:
13、阻止设置时间小于当前时间:
14、添加widget:
AppWidget.java
在其他修改了数据库数据的Activity或者其他地方发送一条广播来让AppWidget执行,如在NoteActivity.java中添加:
另,还需在AndroidManifest.xml中添加:
附源码下载地址:http://download.csdn.net/detail/moruna/7969393
1、为每条备忘添加闹铃
2、备忘内容和闹铃信息存在SQL中
3、可删除每天记录和闹铃或者删除所有
4、到点闹铃启动,包括锁屏时和重开机
5、在桌面的创建一个widget类似便签那样的东西显示记录
二、看下效果图:
三、关于SQL部分不再细写,可查看Android应用开发一栏:
添加闹铃和备忘:
1、设置日期:
dateBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mCalendar = Calendar.getInstance(); // TODO Auto-generated method stub new DatePickerDialog(EditTime.this, new DatePickerDialog.OnDateSetListener() { public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { mAlarmCalendar.set(Calendar.YEAR, year); mAlarmCalendar.set(Calendar.MONTH, monthOfYear); mAlarmCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); EditTime.this.year = year; EditTime.this.month = monthOfYear; EditTime.this.day = dayOfMonth; dateBtn.setText(year + "年" + (month + 1) + "月" + day + "日"); System.out.println(year+"年"+(monthOfYear+1)+"月"+dayOfMonth+"日"); } }, year, month, day).show(); } });
2、设置时间:
timeBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mCalendar = Calendar.getInstance(); new TimePickerDialog(EditTime.this, new TimePickerDialog.OnTimeSetListener() { public void onTimeSet(TimePicker view, int hourOfDay, int minute) { mAlarmCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay); mAlarmCalendar.set(Calendar.MINUTE, minute); mAlarmCalendar.set(Calendar.SECOND, 0); mAlarmCalendar.set(Calendar.MILLISECOND, 0); EditTime.this.hour = hourOfDay; EditTime.this.minute = minute; timeBtn.setText(hour + "时" + minute + "分"); System.out.println(hourOfDay+"时"+minute+"分"); } }, hour, minute, false).show(); } });
3、广播闹铃:
setBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //写进数据库 addData(); /* 获取闹钟管理的实例 */ mAlarm = (AlarmManager) getSystemService(Service.ALARM_SERVICE); Intent intent = new Intent(EditTime.this, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast( EditTime.this, AlarmIndex, intent, 0);// 第二个参数为区别不同闹铃的唯一标识 /* 设置闹钟 */ mAlarm.set(AlarmManager.RTC_WAKEUP, mAlarmCalendar.getTimeInMillis(), pendingIntent); finish(); } });
4、广播接收BroadcastReceiver:
public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Intent i = new Intent(context, Alarm.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//这一句很重要,不然会出错 context.startActivity(i); } }
记得注册:
<receiver android:name=".AlarmReceiver" android:process=":remote" />
5、重启之后重写闹铃,BootReceiver:
public class BootReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); if(action.equals(Intent.ACTION_BOOT_COMPLETED)){ Intent i = new Intent(context, BootAlarm.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//这一句很重要,不然会出错 context.startActivity(i); } } }同样需要注册:
<receiver android:name="BootReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
6、开始重写:
dbHelper = new DatabaseHelper(BootAlarm.this, "idea.sql"); SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = db.query("user", null, null, null, null, null, null); btAlarmCalendar = Calendar.getInstance(); while (cursor.moveToNext()) { btAlarmCalendar = Calendar.getInstance(); System.out.println("cursor.moveToNext()-->cursor.getInt(0)-->" + cursor.getInt(0)); time = cursor.getString(cursor.getColumnIndex("mtime")); year = time.substring(0, time.indexOf("年")); myear = Integer.valueOf(year).intValue(); month = time.substring(time.indexOf("年")+1, time.indexOf("月")); mmonth = Integer.valueOf(month).intValue()-1; day = time.substring(time.indexOf("月")+1, time.indexOf("日")); mday = Integer.valueOf(day).intValue(); hour = time.substring(time.indexOf("日")+1, time.indexOf("时")); mhour = Integer.valueOf(hour).intValue(); minute = time.substring(time.indexOf("时")+1, time.indexOf("分")); mminute = Integer.valueOf(minute).intValue(); System.out.println(myear + "年" + mmonth + "月" + mday + "日" + mhour + "时" + mminute); btAlarmCalendar.set(Calendar.YEAR, myear); btAlarmCalendar.set(Calendar.MONTH, mmonth); btAlarmCalendar.set(Calendar.DAY_OF_MONTH, mday); btAlarmCalendar.set(Calendar.HOUR_OF_DAY, mhour); btAlarmCalendar.set(Calendar.MINUTE, mminute); btAlarmCalendar.set(Calendar.SECOND, 0); btAlarmCalendar.set(Calendar.MILLISECOND, 0); mAlarm = (AlarmManager) getSystemService(Service.ALARM_SERVICE); intent = new Intent(BootAlarm.this, AlarmReceiver.class); pendingIntent= PendingIntent.getBroadcast( BootAlarm.this, cursor.getInt(0), intent, 0);// 第二个参数为区别不同闹铃的唯一标识 /* 设置闹钟 */ mAlarm.set(AlarmManager.RTC_WAKEUP, btAlarmCalendar.getTimeInMillis(), pendingIntent); }
这里有个很需要注意的:
intent = new Intent(BootAlarm.this, AlarmReceiver.class); pendingIntent= PendingIntent.getBroadcast( BootAlarm.this, cursor.getInt(0), intent, 0);
若是PendingIntent.getBroadcas,则intent必须为启动的是BroadcastReceiver,不然重写不会成功的。
7、到点闹铃响,这是由AlarmReceiver(继承BroadcastReceiver)启动的:
dbHelper = new DatabaseHelper(Alarm.this, "ideal.sql"); SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = db.query("user", null, "_id=?", new String[] { NoteActivity.Alarming_index + "" }, null, null, null); if (cursor.moveToFirst()) { mtime = cursor.getString(cursor.getColumnIndex("mtime")); mtext = cursor.getString(cursor.getColumnIndex("mtext")); } db.close(); addData();//写进历史记录表中 deleteData(NoteActivity.Alarming_index);//删除原来记录 new AlertDialog.Builder(Alarm.this) .setIcon(R.drawable.bell) .setTitle("It's time to do something.") .setMessage(mtext) .setPositiveButton("Done", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { deleteData(NoteActivity.Alarming_index);//再次删除确认 //关闭闹铃声 Intent intentSV = new Intent(Alarm.this, MyService.class); stopService(intentSV); Alarm.this.finish(); } }).show();
锁屏时也启动闹铃:
//下面是为了在锁屏时也能启动闹铃 getWindow().addFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); getWindow().addFlags( WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);8、置于闹铃音乐可以写一个Service,这个可查看Android学习笔记一栏
9、点击listview可查看记录内容,长按可进行记录的删除,这里不再多写。
10、由于是闹铃,所以必须每一秒中进行更新一下倒计时,这个可以查看Android学习笔记一栏。
11、附:让title每秒显示时间:
public class TimeThread extends Thread { @Override public void run() { do { try { Thread.sleep(1000); Message msg = new Message(); msg.what = 1; mHandler.sendMessage(msg); } catch (InterruptedException e) { e.printStackTrace(); } } while (true); } } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: currentTime = new Date(); // long sysTime = System.currentTimeMillis(); CharSequence sysTimeStr = DateFormat.format( "yyyy年MM月dd日hh:mm:ss", currentTime.getTime()); EditTime.this.setTitle(sysTimeStr); break; default: break; } } };
------------------(修改版)----------------------
12、是否为记录添加闹铃:
isAlarmBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub isAlarmNum++; if (isAlarmNum % 2 == 0) { isAlarmBtn.setBackgroundResource(R.drawable.checknull); isAlarm = 0; } else { isAlarmBtn.setBackgroundResource(R.drawable.check); isAlarm = 1; } } });
13、阻止设置时间小于当前时间:
currentTime = new Date(); if (beginTime.getTime() < currentTime.getTime()) { Toast.makeText(EditTime.this, "设置时间不能小于当前时间!", Toast.LENGTH_SHORT).show(); }
14、添加widget:
AppWidget.java
public class AppWidget extends AppWidgetProvider { private DatabaseHelper dbHelper; String[] desk_text; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // TODO Auto-generated method stub super.onUpdate(context, appWidgetManager, appWidgetIds); //读取数据库中的记录 dbHelper = new DatabaseHelper(context, "ideal.sql"); SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = db.query("user", null, null, null, null, null, null); int desk_num=0; //桌面的便签只显示6条记录 desk_text = new String[6]; while(cursor.moveToNext()){ if(desk_num == 6){ break; } String temp_text = cursor.getString(cursor.getColumnIndex("mtext")); //控制每条记录显示的长度 if(temp_text.length()>7){ temp_text=temp_text.substring(0, 7)+"..."; } desk_text[desk_num]=temp_text; System.out.println("desk_text[desk_num]"+desk_text[desk_num]); desk_num++; } db.close(); final int Num = appWidgetIds.length; for (int i = 0; i < Num; i++) { int[] mAppWidgetId = appWidgetIds; RemoteViews mRemoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); mRemoteViews.setTextViewText(R.id.desktop_text, array_to_string(desk_text)); Intent clickIntent = new Intent(context, NoteActivity.class); PendingIntent pdIntent = PendingIntent.getActivity(context, 0, clickIntent, 0); mRemoteViews.setOnClickPendingIntent(R.id.widget_layout, pdIntent); appWidgetManager.updateAppWidget(mAppWidgetId, mRemoteViews); } } //onReceive方法用来接收广播,以便更新桌面的便签 @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub super.onReceive(context, intent); if(intent.getAction().equals("com.ideal.note.widget")){ dbHelper = new DatabaseHelper(context, "ideal.sql"); SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = db.query("user", null, null, null, null, null, null); int desk_num=0; desk_text = new String[6]; while(cursor.moveToNext()){ if(desk_num == 6){ break; } String temp_text = cursor.getString(cursor.getColumnIndex("mtext")); if(temp_text.length()>7){ temp_text=temp_text.substring(0, 7)+"..."; } desk_text[desk_num]=temp_text; System.out.println("desk_text[desk_num]"+desk_text[desk_num]); desk_num++; } db.close(); } RemoteViews mRemoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); mRemoteViews.setTextViewText(R.id.desktop_text, array_to_string(desk_text)); AppWidgetManager.getInstance(context).updateAppWidget(new ComponentName(context, AppWidget.class), mRemoteViews); } //数组转化为字符显示 public String array_to_string(String[] array){ String temp_str = ""; for(int i=0;i<array.length;i++){ if(array[i]==null){ break; }else { temp_str = temp_str+"\n* "+array[i]; } } return temp_str; } }
在其他修改了数据库数据的Activity或者其他地方发送一条广播来让AppWidget执行,如在NoteActivity.java中添加:
Intent mWidgetIntent = new Intent(); mWidgetIntent.setAction("com.ideal.note.widget"); NoteActivity.this.sendBroadcast(mWidgetIntent);
另,还需在AndroidManifest.xml中添加:
<receiver android:name=".AppWidget"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> <action android:name="com.ideal.note.widget"/> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info"/> </receiver>
附源码下载地址:http://download.csdn.net/detail/moruna/7969393
相关文章推荐
- 覆盖Android开发各个领域的近百个源码项目下载
- android开发环境搭建:eclipse 下载--jdk环境变量配置--eclipse ide主题--genymotion下载--sdk源码关联--adb出错解决
- android开发常用知识点备忘录
- android开发--mp3播放器项目源代码(xml文件解析,.lrc,.mp3文件下载,同时显示歌词)
- Android资源代码 源码 整理 Github开源项目下载地址
- Android开发:andriod 源码下载
- Android开发之使用Handler封装下载图片工具类(源码分享)
- ASP.NET 3.5 新特性开发向导实践(附项目源码下载)- Part 1
- ASP.NET 3.5 新特性开发向导实践(附项目源码下载)- Part 2
- 学龄1年的android小白2个月独立开发资深项目,还上了何俊林的推荐榜,他是怎么做到的(附项目源码)
- mars老师[Android开发视频教学].01_18 文件下载 源码
- Android开发经典源码下载
- Android开源项目源码下载(不断更新中)
- 【持久化框架】SpringMVC+Spring4+Mybatis3集成,开发简单Web项目+源码下载
- Android开发进阶自定义控件之滑动开关实现方法【附demo源码下载】
- Android开发——导入github安卓项目源码
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- Android开发之ListView详解(带按钮布局)【免费提供源码下载】
- 【绝对给力】Android开发免豆资料(教程+工具+源码)下载地址汇总
- cocos2d-x游戏开发 跑酷(九) 源码下载及小结