Android闹钟【复杂版】
最近做闹钟,所以自己写了个Demo版本,这个程序是用listview单独的类来实现的,和activity类分开来实现的!这个是用数据库进行更新的,当闹钟设置后,闹钟图片变成闹钟的样子,闹钟取消后,图片变成灰色的闹钟,这个是用ListView来实现数据库更新数据的!然后弹对话框来实现时间的设置和周几重复的功能,这个功能能实现,我测试了!正确无误!需要注意的地方有两个:listview每次滑动的时候,记得设置背景为透明,mAlarmListView.setCacheColorHint(0);另一个是利用Intent传递广播的Intent的时候,传参数的时候,记得设置PendingIntent sender=PendingIntent.getBroadcast(context,0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);的PendingIntent.FLAG_UPDATE_CURRENT,为了让每次启动PendingIntent进行更新!这两点要注意一下,我在编写的时候就是遇到这两个问题了!另外就是算法的判断!感觉好可以赞一个,支持我的原创!
有问题的可以留言,想要源码的可以留言,或者在我的csdn资源上下载:
http://download.csdn.net/source/3572215
转载请标明出处:
http://blog.csdn.net/wdaming1986/article/details/6745655
程序进入的开始界面: 点击每个闹钟后弹出的dialog界面:
点击设置时间后弹出的dialog界面: 点击设置重复后弹出的界面:
闹钟时间到了,会弹出提醒Dialog: 点击是否开启闹钟按钮,不选中确定的界面:
下面看代码:
一、MainActivity。java类,程序入口类:
package com.cn.daming;
import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
public class MainActivity extends Activity {
private LinearLayout mLinearLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
mLinearLayout = (LinearLayout)findViewById(R.id.box);
new AlarmClockView(this,this,mLinearLayout);
}
}
二、AlarmClockView。java类,listview的类:
package com.cn.daming;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import android.app.AlarmManager;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
public class AlarmClockView extends View{
private MainActivity activity;
private LinearLayout mLinearLayout;
private Context context;
private DataBaseHelper dbHelper;
private Cursor cursor;
private ListView mAlarmListView;
private List<String> ids;
private List<String> times;
private List<String> repeats;
private List<String> isopens;
private List<String> kinds;
private AlarmClockAdapter alarmAdapter;
Calendar c=Calendar.getInstance();
TextView time1TextView = null;
TextView time2TextView = null;
Button setTimeButton1 = null;
Button setTimeButton2 = null;
TextView repeat1TextView = null;
TextView repeat2TextView = null;
Button repeatButton1 = null;
Button repeatButton2 = null;
CheckBox time1CheckBox = null;
CheckBox time2CheckBox = null;
String tmpS1 = "目前无设置";
String repeatString1 = "目前无设置";
String tmpS2 = "目前无设置";
String repeatString2 = "目前无设置";
boolean isOpenInt1 = false;
boolean isOpenInt2 = false;
String isOpentime1 = null;
String isOpentime2 = null;
boolean isOpenAlarm = false;
CheckBox isOpenCheckBox;
int[] repeatArray1 = {0,0,0,0,0,0,0};
int[] repeatArray2 = {0,0,0,0,0,0,0};
boolean repeat_1_1 = false;
boolean repeat_1_2 = false;
boolean repeat_1_3 = false;
boolean repeat_1_4 = false;
boolean repeat_1_5 = false;
boolean repeat_1_6 = false;
boolean repeat_1_7 = false;
boolean repeat_2_1 = false;
boolean repeat_2_2 = false;
boolean repeat_2_3 = false;
boolean repeat_2_4 = false;
boolean repeat_2_5 = false;
boolean repeat_2_6 = false;
boolean repeat_2_7 = false;
public AlarmClockView(final Context context,MainActivity activity, LinearLayout linearLayout) {
super(context);
this.context = context;
this.activity = activity;
this.mLinearLayout = linearLayout;
View alarmView = View.inflate(context, R.layout.alarm_listview, null);
mLinearLayout.addView(alarmView);
mAlarmListView = (ListView)alarmView.findViewById(R.id.alarm_list);
mAlarmListView.setCacheColorHint(0);
dbHelper = new DataBaseHelper(context);
refreshDBHelper();
mAlarmListView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View v, int position,
long arg3) {
showAlarmDialog(position);
}
});
}
public void refreshDBHelper()
{
cursor = dbHelper.selectAlarmColock();
ids = new ArrayList<String>();
times = new ArrayList<String>();
repeats = new ArrayList<String>();
isopens = new ArrayList<String>();
kinds = new ArrayList<String>();
int count = cursor.getCount();
if(count==0){
String[] tempStr = new String[4];
for(int i=1;i<=2;i++){
dbHelper.insertAlarmColock(tempStr);
}
int count2 = cursor.getCount();
if(count2>0){
for(int i=0;i<count2;i++){
cursor.moveToPosition(i);
ids.add(cursor.getString(0));
times.add(cursor.getString(1));
repeats.add(cursor.getString(2));
isopens.add(cursor.getString(3));
kinds.add(cursor.getString(4));
}
}
cursor.close();
dbHelper.close();
refreshDBHelper();
Toast.makeText(context, R.string.not_dbcursor_values, Toast.LENGTH_SHORT).show();
}
else if(count>0){
for(int i=0;i<count;i++){
cursor.moveToPosition(i);
ids.add(cursor.getString(0));
times.add(cursor.getString(1));
repeats.add(cursor.getString(2));
isopens.add(cursor.getString(3));
kinds.add(cursor.getString(4));
}
}
alarmAdapter = new AlarmClockAdapter(context,ids,times,repeats,isopens,kinds);
mAlarmListView.setAdapter(alarmAdapter);
cursor.close();
dbHelper.close();
}
public void showAlarmDialog(int position){
dbHelper = new DataBaseHelper(context);
cursor = dbHelper.selectAlarmColock();
int count = cursor.getCount();
if(position == 0){
LayoutInflater factory = LayoutInflater.from(context);
final View alarm1View = factory.inflate(R.layout.time_repeat_dialog, null);
time1TextView = (TextView)alarm1View.findViewById(R.id.text);
setTimeButton1 = (Button)alarm1View.findViewById(R.id.mButton);
repeat1TextView = (TextView)alarm1View.findViewById(R.id.repeattext);
repeatButton1 = (Button)alarm1View.findViewById(R.id.repeatButton);
time1CheckBox = (CheckBox)alarm1View.findViewById(R.id.isopen_check);
String isOpen1 = "关";
if(count==2){
for(int i=0;i<count;i++){
if(i == 0){
cursor.moveToPosition(i);
if(cursor.getString(1)==null){
time1TextView.setText(tmpS1);
}else{
time1TextView.setText(cursor.getString(1));
tmpS1 = cursor.getString(1);
}
if((cursor.getString(2))==null){
repeat1TextView.setText(repeatString1);
}else{
repeat1TextView.setText(cursor.getString(2));
repeatString1 = cursor.getString(2);
}
isOpen1 = cursor.getString(3);
if(isOpen1!=null){
if(isOpen1.equals("开")){
time1CheckBox.setChecked(true);
isOpenInt1 = true;
}else{
time1CheckBox.setChecked(false);
isOpenInt1 = false;
}
}
}
}
}
time1CheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
if(arg0.isChecked()){
isOpenInt1 = true;
}else{
isOpenInt1 = false;
}
}
});
setTimeButton1.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
c.setTimeInMillis(System.currentTimeMillis());
int mHour=c.get(Calendar.HOUR_OF_DAY);
int mMinute=c.get(Calendar.MINUTE);
int mDay=c.get(Calendar.DAY_OF_WEEK);
new TimePickerDialog(context,
new TimePickerDialog.OnTimeSetListener()
{
public void onTimeSet(TimePicker view,int hourOfDay,
int minute)
{
c.setTimeInMillis(System.currentTimeMillis());
c.set(Calendar.HOUR_OF_DAY,hourOfDay);
c.set(Calendar.MINUTE,minute);
c.set(Calendar.SECOND,0);
c.set(Calendar.MILLISECOND,0);
tmpS1=format(hourOfDay)+":"+format(minute);
time1TextView.setText(tmpS1);
Toast.makeText(context,
"设置闹钟时间为" + tmpS1,
Toast.LENGTH_SHORT).show();
}
},mHour,mMinute,true).show();
}
});
repeatButton1.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
// TODO Auto-generated method stub
repeatString1 = "";
new AlertDialog.Builder(context)
.setTitle(R.string.alert_dialog_multi_choice)
.setMultiChoiceItems(R.array.select_dialog_items,
new boolean[]{false, false, false, false, false, false, false},
new DialogInterface.OnMultiChoiceClickListener() {
public void onClick(DialogInterface dialog, int whichButton,
boolean isChecked) {
/* User clicked on a check box do some stuff */
switch(whichButton){
case 0: if(isChecked){
repeatArray1[0] = 1;
}else{
repeatArray1[0] = 0;
}
break;
case 1:if(isChecked){
repeatArray1[1] = 1;
}else{
repeatArray1[1] = 0;
}
break;
case 2:if(isChecked){
repeatArray1[2] = 1;
}else{
repeatArray1[2] = 0;
}
break;
case 3:if(isChecked){
repeatArray1[3] = 1;
}else{
repeatArray1[3] = 0;
}
break;
case 4:if(isChecked){
repeatArray1[4] = 1;
}else{
repeatArray1[4] = 0;
}
break;
case 5:if(isChecked){
repeatArray1[5] = 1;
}else{
repeatArray1[5] = 0;
}
break;
case 6:if(isChecked){
repeatArray1[6] = 1;
}else{
repeatArray1[6] = 0;
}
break;
default: break;
}
}
})
.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
if(repeatArray1[0] == 1){
repeatString1 += "周一"+",";
repeat_1_1 = true;
}else{
repeat_1_1 = false;
}
if(repeatArray1[1] == 1){
repeatString1 += "周二"+",";
repeat_1_2 = true;
}else{
repeat_1_2 = false;
}
if(repeatArray1[2] == 1){
repeatString1 += "周三"+",";
repeat_1_3 = true;
}else{
repeat_1_3 = false;
}
if(repeatArray1[3] == 1){
repeatString1 += "周四"+",";
repeat_1_4 = true;
}else{
repeat_1_4 = false;
}
if(repeatArray1[4] == 1){
repeatString1 += "周五"+",";
repeat_1_5 = true;
}else{
repeat_1_5 = false;
}
if(repeatArray1[5] == 1){
repeatString1 += "周六"+",";
repeat_1_6 = true;
}else{
repeat_1_6 = false;
}
if(repeatArray1[6] == 1){
repeatString1 += "周日";
repeat_1_7 = true;
}else{
repeat_1_7 = false;
}
if(!(repeat_1_1 || repeat_1_2 || repeat_1_3 || repeat_1_4 ||
repeat_1_5 || repeat_1_6 || repeat_1_7)){
repeatString1 = ("无重复");
}
repeat1TextView.setText(repeatString1);
for(int i=0;i<repeatArray1.length;i++){
repeatArray1[i] = 0;
}
}
})
.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* User clicked No so do some stuff */
}
})
.show();
}
});
//show AlertDialog
new AlertDialog.Builder(context)
.setIcon(R.drawable.alarm_dialog)
.setTitle(R.string.alarm_dialog_title)
.setView(alarm1View)
.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
if(isOpenInt1){
isOpentime1 = "开";
Intent intent1 = new Intent(context, CallAlarm.class);
intent1.putExtra("RESULT", "alarm1");
PendingIntent sender=PendingIntent.getBroadcast(
context,0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am;
am = (AlarmManager)activity.getSystemService(context.ALARM_SERVICE);
int nowDay = Contants.getNowWeek();
int setDay = 0;
if(repeatString1.equals("目前无设置"))
{
if(Contants.differSetTimeAndNowTime(c.getTimeInMillis())){
am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),sender);
}
else{
Toast.makeText(context, R.string.not_time_right, Toast.LENGTH_SHORT);
}
}
if(!(repeatString1.equals("目前无设置"))){
String[] setStr = repeatString1.split(",");
int[] dayOfNum = Contants.getDayOfNum(setStr);
setDay = Contants.getResultDifferDay(dayOfNum, nowDay);
int differDay = Contants.compareDayNowToNext(nowDay, setDay);
if(differDay == 0){
if(Contants.differSetTimeAndNowTime(c.getTimeInMillis())){
am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),sender);
}else{
am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis() + Contants.getDifferMillis(7),sender);
}
}else{
am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis() + Contants.getDifferMillis(differDay),sender);
}
}
}else{
isOpentime1 = "关";
Intent intent = new Intent(context, CallAlarm.class);
PendingIntent sender=PendingIntent.getBroadcast(
context,0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am;
am =(AlarmManager)activity.getSystemService(context.ALARM_SERVICE);
am.cancel(sender);
Toast.makeText(context,R.string.alarm_delete1,
Toast.LENGTH_SHORT).show();
}
String[] temStr = new String[7];
temStr[0] = tmpS1;
temStr[1] = repeatString1;
temStr[2] = isOpentime1;
dbHelper.updateAlarmColock(1+"", temStr);
refreshDBHelper(); www.2cto.com
}
})
.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
refreshDBHelper();
}
})
.create().show();
Log.v("wangxianming", "this is click Item1");
}
else if(position == 1){
LayoutInflater factory = LayoutInflater.from(context);
final View alarm1View = factory.inflate(R.layout.time_repeat_dialog, null);
time2TextView = (TextView)alarm1View.findViewById(R.id.text);
setTimeButton2 = (Button)alarm1View.findViewById(R.id.mButton);
repeat2TextView = (TextView)alarm1View.findViewById(R.id.repeattext);
repeatButton2 = (Button)alarm1View.findViewById(R.id.repeatButton);
time2CheckBox = (CheckBox)alarm1View.findViewById(R.id.isopen_check);
String isOpen2 = "关";
if(count==2){
for(int i=0;i<count;i++){
if(i == 1){
cursor.moveToPosition(i);
if(cursor.getString(1)==null){
time2TextView.setText(tmpS2);
}else{
time2TextView.setText(cursor.getString(1));
tmpS2 = cursor.getString(1);
}
if((cursor.getString(2))==null){
repeat2TextView.setText(repeatString2);
}else{
repeat2TextView.setText(cursor.getString(2));
repeatString2 = cursor.getString(2);
}
isOpen2 = cursor.getString(3);
if(isOpen2!=null){
if(isOpen2.equals("开")){
time2CheckBox.setChecked(true);
isOpenInt2 = true;
}else{
time2CheckBox.setChecked(false);
isOpenInt2 = false;
}
}
}
}
}
time2CheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
// TODO Auto-generated method stub
if(arg0.isChecked()){
isOpenInt2 = true;
}else{
isOpenInt2 = false;
}
}
});
setTimeButton2.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
// TODO Auto-generated method stub
c.setTimeInMillis(System.currentTimeMillis());
int mHour=c.get(Calendar.HOUR_OF_DAY);
int mMinute=c.get(Calendar.MINUTE);
int mDay=c.get(Calendar.DAY_OF_WEEK);
new TimePickerDialog(context,
new TimePickerDialog.OnTimeSetListener()
{
public void onTimeSet(TimePicker view,int hourOfDay,
int minute)
{
c.setTimeInMillis(System.currentTimeMillis());
c.set(Calendar.HOUR_OF_DAY,hourOfDay);
c.set(Calendar.MINUTE,minute);
c.set(Calendar.SECOND,0);
c.set(Calendar.MILLISECOND,0);
tmpS2=format(hourOfDay)+":"+format(minute);
time2TextView.setText(tmpS2);
Toast.makeText(context,R.string.alarm_set2+tmpS2,Toast.LENGTH_SHORT).show();
}
},mHour,mMinute,true).show();
}
});
repeatButton2.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
repeatString2 = "";
new AlertDialog.Builder(context)
.setTitle(R.string.alert_dialog_multi_choice)
.setMultiChoiceItems(R.array.select_dialog_items,
new boolean[]{false, false, false, false, false, false, false},
new DialogInterface.OnMultiChoiceClickListener() {
public void onClick(DialogInterface dialog, int whichButton,
boolean isChecked) {
/* User clicked on a check box do some stuff */
switch(whichButton){
case 0: if(isChecked){
repeatArray2[0] = 1;
}else{
repeatArray2[0] = 0;
}
break;
case 1:if(isChecked){
repeatArray2[1] = 1;
}else{
repeatArray2[1] = 0;
}
break;
case 2:if(isChecked){
repeatArray2[2] = 1;
}else{
repeatArray2[2] = 0;
}
break;
case 3:if(isChecked){
repeatArray2[3] = 1;
}else{
repeatArray2[3] = 0;
}
break;
case 4:if(isChecked){
repeatArray2[4] = 1;
}else{
repeatArray2[4] = 0;
}
break;
case 5:if(isChecked){
repeatArray2[5] = 1;
}else{
repeatArray2[5] = 0;
}
break;
case 6:if(isChecked){
repeatArray2[6] = 1;
}else{
repeatArray2[6] = 0;
}
break;
default: break;
}
}
})
.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
if(repeatArray2[0] == 1){
repeatString2 += "周一"+",";
repeat_2_1 = true;
}else{
repeat_2_1 = false;
}
if(repeatArray2[1] == 1){
repeatString2 += "周二"+",";
repeat_2_2 = true;
}else{
repeat_2_2 = false;
}
if(repeatArray2[2] == 1){
repeatString2 += "周三"+",";
repeat_2_3 = true;
}else{
repeat_2_3 = false;
}
if(repeatArray2[3] == 1){
repeatString2 += "周四"+",";
repeat_2_4 = true;
}else{
repeat_2_4 = false;
}
if(repeatArray2[4] == 1){
repeatString2 += "周五"+",";
repeat_2_5 = true;
}else{
repeat_1_5 = false;
}
if(repeatArray2[5] == 1){
repeatString2 += "周六"+",";
repeat_2_6 = true;
}else{
repeat_2_6 = false;
}
if(repeatArray2[6] == 1){
repeatString2 += "周日";
repeat_2_7 = true;
}else{
repeat_2_7 = false;
}
if(!(repeat_2_1 || repeat_2_2 || repeat_2_3 || repeat_2_4 ||
repeat_2_5 || repeat_2_6 || repeat_2_7)){
repeatString2 = ("无设置");
}
repeat2TextView.setText(repeatString2);
for(int i=0;i<repeatArray1.length;i++){
repeatArray2[i] = 0;
}
}
})
.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* User clicked No so do some stuff */
}
})
.show();
}
});
// show Dialog
new AlertDialog.Builder(context)
.setIcon(R.drawable.alarm_dialog)
.setTitle(R.string.alarm_dialog_title)
.setView(alarm1View)
.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
if(isOpenInt2){
isOpentime2 = "开";
Intent intent2 = new Intent(context, CallAlarm.class);
intent2.putExtra("RESULT", "alarm2");
PendingIntent sender=PendingIntent.getBroadcast(
context,1, intent2, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am;
am = (AlarmManager)activity.getSystemService(context.ALARM_SERVICE);
int nowDay = Contants.getNowWeek();
int setDay = 0;
if(repeatString2.equals("目前无设置"))
{
if(Contants.differSetTimeAndNowTime(c.getTimeInMillis())){
am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),sender);
}
else{
Toast.makeText(context, R.string.not_time_right, Toast.LENGTH_SHORT);
}
}
if(!(repeatString2.equals("目前无设置"))){
String[] setStr = repeatString2.split(",");
int[] dayOfNum = Contants.getDayOfNum(setStr);
setDay = Contants.getResultDifferDay(dayOfNum, nowDay);
int differDay = Contants.compareDayNowToNext(nowDay, setDay);
if(differDay == 0){
if(Contants.differSetTimeAndNowTime(c.getTimeInMillis())){
am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),sender);
}else{
am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis() + Contants.getDifferMillis(7),sender);
}
}else{
am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis() + Contants.getDifferMillis(differDay),sender);
}
}
}else{
isOpentime2 = "关";
Intent intent = new Intent(context, CallAlarm.class);
intent.putExtra("RESULT", "cancel");
PendingIntent sender=PendingIntent.getBroadcast(
context,1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am;
am =(AlarmManager)activity.getSystemService(context.ALARM_SERVICE);
am.cancel(sender);
Toast.makeText(context,R.string.alarm_delete2,
Toast.LENGTH_SHORT).show();
}
String[] temStr = new String[7];
temStr[0] = tmpS2;
temStr[1] = repeatString2;
temStr[2] = isOpentime2;
dbHelper.updateAlarmColock(2+"", temStr);
refreshDBHelper();
}
})
.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
refreshDBHelper();
}
})
.create().show();
}
cursor.close();
dbHelper.close();
}
private String format(int x)
{
String s=""+x;
if(s.length()==1) s="0"+s;
return s;
}
}
三、AlarmClockAdapter。java类,适配器的类:
package com.cn.daming;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class AlarmClockAdapter extends BaseAdapter{
private LayoutInflater layoutInflater;
private Context context;
private List<String> alarm_ids;
private List<String> alarm_times;
private List<String> alarm_repeats;
private List<String> alarm_isopens;
private List<String> alarm_kinds;
ZuJian zuJian;
public AlarmClockAdapter(Context context,List<String> ids,List<String> times,List<String> repeats,
List<String> isopens,List<String> kinds) {
this.context = context;
this.alarm_ids = ids;
this.alarm_times = times;
this.alarm_repeats = repeats;
this.alarm_isopens = isopens;
this.alarm_kinds = kinds;
this.layoutInflater = LayoutInflater.from(context);
}
public int getCount() {
return alarm_times.size();
}
public Object getItem(int position) {
return alarm_times.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
zuJian = new ZuJian();
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.alarm_clock, null);
zuJian.alarmTitle = (TextView) convertView.findViewById(R.id.alarm_title);
zuJian.alarmTimeView = (TextView) convertView.findViewById(R.id.alarm_time);
zuJian.repeatAlarmView = (TextView) convertView.findViewById(R.id.alarm_repeat_time);
zuJian.showISOpenView = (ImageView) convertView.findViewById(R.id.show_open_close);
convertView.setTag(zuJian);
} else {
zuJian = (ZuJian) convertView.getTag();
}
if (alarm_kinds.get(position) == null || alarm_kinds.get(position) == "") {
if(position == 0){
zuJian.alarmTitle.setText("大明闹钟一");
}
if(position == 1){
zuJian.alarmTitle.setText("大明闹钟二");
}
} else {
zuJian.alarmTitle.setText(alarm_kinds.get(position));
}
if (alarm_times.get(position) == null || alarm_times.get(position) == "") {
zuJian.alarmTimeView.setText("目前无设置");
} else {
zuJian.alarmTimeView.setText(alarm_times.get(position));
}
if (alarm_repeats.get(position) == null || alarm_repeats.get(position) == "") {
zuJian.repeatAlarmView.setText("目前无设置");
} else {
zuJian.repeatAlarmView.setText(alarm_repeats.get(position));
}
if (alarm_isopens.get(position) == null || alarm_isopens.get(position) == "") {
((ImageView) zuJian.showISOpenView).setBackgroundResource(R.drawable.alarm_dialog);
} else {
if(alarm_isopens.get(position).equals("开")){
((ImageView) zuJian.showISOpenView).setBackgroundResource(R.drawable.clock);
}
if(alarm_isopens.get(position).equals("关")){
((ImageView) zuJian.showISOpenView).setBackgroundResource(R.drawable.alarm_dialog);
}
}
return convertView;
}
final class ZuJian {
public TextView alarmTitle;
public TextView alarmTimeView;
public TextView repeatAlarmView;
public ImageView showISOpenView;
}
}
四、CallAlarm。java类,接受广播BroadcastReceiver的类:
package com.cn.daming;
/* import class */
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
/*AlarmReceiver */
public class CallAlarm extends BroadcastReceiver
{
@Override
public void onReceive(final Context context, Intent intent)
{
String getStr = intent.getExtras().getString("RESULT");
Log.v("wangxianming", "RESULT = "+getStr);
Intent alaramIntent = new Intent(context, AlarmAgainSetting.class);
Bundle bundleRet = new Bundle();
bundleRet.putString("STR_RESULT", getStr);
alaramIntent.putExtras(bundleRet);
alaramIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(alaramIntent);
}
}
五、Contants。java类,工具类:
package com.cn.daming;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class Contants {
//repeated day of week define
public static Map<String, Integer> mapWeek = new HashMap<String,Integer>();
public static void addMapWeek(){
mapWeek.put("周一", 1);
mapWeek.put("周二", 2);
mapWeek.put("周三", 3);
mapWeek.put("周四", 4);
mapWeek.put("周五", 5);
mapWeek.put("周六", 6);
mapWeek.put("周日", 7);
mapWeek.put("无重复", 0);
}
public static int getMapWeek(String str){
Contants.addMapWeek();
int dayOfMapWeek = 0;
if(str != null){
dayOfMapWeek = mapWeek.get(str);
}
return dayOfMapWeek;
}
public static String[] getDatetimeString(){
Date date = new Date();
String[] tempStr = new String[2];
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = format.format(date);
tempStr[0] = str.substring(0, 10);
tempStr[1] = str.substring(11, str.length());
return tempStr;
}
public static long getNowTimeMinuties()
{
return System.currentTimeMillis();
}
public static boolean differSetTimeAndNowTime(long setTime)
{
if(setTime >= getNowTimeMinuties()){
return true;
}else{
return false;
}
}
public static long getDifferMillis(int differDays)
{
return differDays * 24 * 60 * 60 * 1000;
}
//compare nowDay to nextDay
public static int compareDayNowToNext(int nowDay,int nextDay){
if(nextDay > nowDay){
return (nextDay-nowDay);
}else if(nextDay == nowDay){
return 0;
}else{
return (7-(nowDay-nextDay));
}
}
//turn the nowday to China`s day of Week
public static Map<String, Integer> nowWeek = new HashMap<String,Integer>();
public static void addNowWeek()
{
nowWeek.put("1", 7);
nowWeek.put("2", 1);
nowWeek.put("3", 2);
nowWeek.put("4", 3);
nowWeek.put("5", 4);
nowWeek.put("6", 5);
nowWeek.put("7", 6);
}
public static int getNowWeek()
{
Calendar nowCal = Calendar.getInstance();
Date nowDate = new Date(System.currentTimeMillis());
nowCal.setTime(nowDate);
int nowNum = nowCal.get(nowCal.DAY_OF_WEEK);
String nowNumStr = String.valueOf(nowNum);
Contants.addNowWeek();
int nowDayOfWeek = 0;
if(nowNumStr != null){
nowDayOfWeek = nowWeek.get(nowNumStr);
}
return nowDayOfWeek;
}
public static int getSetDay(String str)
{
if(str.equals("周一")){
return 1;
}
if(str.equals("周二")){
return 2;
}
if(str.equals("周三")){
return 3;
}
if(str.equals("周四")){
return 4;
}
if(str.equals("周五")){
return 5;
}
if(str.equals("周六")){
return 6;
}
if(str.equals("周日")){
return 7;
}
return 0;
}
public static int[] getDayOfNum(String[] str)
{
int[] dayOfInt = new int[str.length];
for(int i=0;i<str.length;i++){
dayOfInt[i] = getSetDay(str[i]);
}
return dayOfInt;
}
public static int getResultDifferDay(int[] in,int nowDay)
{
int result = 0;
for(int i=0;i<in.length;i++){
if(in[i] >= nowDay){
result = in[i];
break;
}
}
if(result == 0){
result = in[0];
}
return result;
}
public static int getResultDifferDay1(int[] in,int nowDay)
{
int result = 0;
for(int i=0;i<in.length;i++){
if(in[i] > nowDay){
result = in[i];
break;
}
}
if(result == 0){
result = in[0];
}
return result;
}
}
六、DataBaseHelper。java类,数据库sqlite类:
package com.cn.daming;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DataBaseHelper extends SQLiteOpenHelper {
private final static String DATABASE_NAME = "alarm_db";
private final static int DATABASE_VERSION = 1;
private final static String ALARM_COLOCK_TABLE = "alarmcolock";
public final static String ALARM_ID = "_id";
public final static String ALARM_TIME = "alarmtime"; //alarm time
public final static String ALARM_REPEAT = "alarmrepeat";//alarm repeate is or not
public final static String ALARM_ISOPEN = "alarmisopen";//alarm open is 0r not
public final static String ALARM_KIND = "alarmkind"; //alarm is kind(1 is shuangseqiu ,2 is da le tou )
public final static String ALARM_SPARE1 = "alarmspare1";//spare1
public final static String ALARM_SPARE2 = "alarmspare2";//spare2
public final static String ALARM_SPARE3 = "alarmspare3";//spare3
public DataBaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table "+ALARM_COLOCK_TABLE+" ("
+ALARM_ID+" integer primary key autoincrement, "
+ALARM_TIME+" text, "
+ALARM_REPEAT+" text, "
+ALARM_ISOPEN+" text, "
+ALARM_KIND+" text, "
+ALARM_SPARE1+" text, "
+ALARM_SPARE2+" text, "
+ALARM_SPARE3+" text )";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
String sql = "drop table if exists "+ALARM_COLOCK_TABLE;
db.execSQL(sql);
}
//the action in AlarmColock table
public long insertAlarmColock(String[] strArray)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues conv = new ContentValues();
conv.put(ALARM_TIME, strArray[0]);
conv.put(ALARM_REPEAT, strArray[1]);
conv.put(ALARM_ISOPEN, strArray[2]);
conv.put(ALARM_KIND, strArray[3]);
return db.insert(ALARM_COLOCK_TABLE, null, conv);
}
public Cursor selectAlarmColock(){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(ALARM_COLOCK_TABLE, null, null, null, null, null, null);
return cursor;
}
public Cursor getAlarmColock(String id){
SQLiteDatabase db = this.getReadableDatabase();
String where = ALARM_ID+"=?";
String[] whereValues = {id};
Cursor cursor = db.query(ALARM_COLOCK_TABLE, null, where, whereValues, null, null, null);
return cursor;
}
public void deleteAlarmColock(String id){
SQLiteDatabase db = this.getWritableDatabase();
String where = ALARM_ID+"=?";
String[] whereValues = {id};
db.delete(ALARM_COLOCK_TABLE, where, whereValues);
}
public int updateAlarmColock(String id,String[] strArray){
SQLiteDatabase db = this.getWritableDatabase();
String where = ALARM_ID+"=?";
String[] whereValues = {id};
ContentValues cv = new ContentValues();
cv.put(ALARM_TIME, strArray[0]);
cv.put(ALARM_REPEAT, strArray[1]);
cv.put(ALARM_ISOPEN, strArray[2]);
cv.put(ALARM_KIND, strArray[3]);
Log.v("wangxianming", "cv : "+cv.get("ALARM_TIME")+cv.get("ALARM_REPEAT")+cv.get("ALARM_ISOPEN")+cv.get("ALARM_KIND"));
return db.update(ALARM_COLOCK_TABLE, cv, where, whereValues);
}
}
七、AlarmAgainSetting。java类,闹钟重复设置的类:
package com.cn.daming;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.Toast;
public class AlarmAgainSetting extends Activity{
private DataBaseHelper dbHelper;
private Cursor cursor;
Intent getAlarmAgainSetting;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getAlarmAgainSetting = AlarmAgainSetting.this.getIntent();
String getAlarmAgainSettingStr = getAlarmAgainSetting.getExtras().getString("STR_RESULT");
dbHelper = new DataBaseHelper(this);
if(getAlarmAgainSettingStr.equals("alarm1")){
Intent againIntent = new Intent(AlarmAgainSetting.this, CallAlarm.class);
againIntent.putExtra("RESULT", "alarm1");
PendingIntent sender=PendingIntent.getBroadcast(
AlarmAgainSetting.this,0, againIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am;
am = (AlarmManager)getSystemService(ALARM_SERVICE);
int nowDay = Contants.getNowWeek();
int setDay = 0;
cursor = dbHelper.selectAlarmColock();
String str1 = null;
int count1 = cursor.getCount();
if(count1 > 0){
for(int i=0;i<count1;i++){
if(i == 0){
cursor.moveToPosition(i);
str1 = cursor.getString(2);
}
}
}
if(!(str1.equals("目前无设置"))){
String[] setStr = str1.split(",");
int[] dayOfNum = Contants.getDayOfNum(setStr);
setDay = Contants.getResultDifferDay1(dayOfNum, nowDay);
int differDay = Contants.compareDayNowToNext(nowDay, setDay);
if(differDay == 0){
am.set(AlarmManager.RTC_WAKEUP,Contants.getNowTimeMinuties() + Contants.getDifferMillis(7),sender);
}else{
am.set(AlarmManager.RTC_WAKEUP,Contants.getNowTimeMinuties() + Contants.getDifferMillis(differDay),sender);
}
}
}
if(getAlarmAgainSettingStr.equals("alarm2")){
/* allAlarm.class */
Intent againIntent = new Intent(AlarmAgainSetting.this, CallAlarm.class);
againIntent.putExtra("RESULT", "alarm2");
/* PendingIntent */
PendingIntent sender=PendingIntent.getBroadcast(
AlarmAgainSetting.this,1, againIntent, PendingIntent.FLAG_UPDATE_CURRENT);
/* AlarmManager.RTC_WAKEUP
* */
AlarmManager am;
am = (AlarmManager)getSystemService(ALARM_SERVICE);
int nowDay = Contants.getNowWeek();
int setDay = 0;
cursor = dbHelper.selectAlarmColock();
String str2 = null;
int count2 = cursor.getCount();
if(count2 > 0){
for(int i=0;i<count2;i++){
if(i == 1){
cursor.moveToPosition(i);
str2 = cursor.getString(2);
}
}
}
if(!(str2.equals("目前无设置"))){
String[] setStr = str2.split(",");
int[] dayOfNum = Contants.getDayOfNum(setStr);
setDay = Contants.getResultDifferDay1(dayOfNum, nowDay);
int differDay = Contants.compareDayNowToNext(nowDay, setDay);
if(differDay == 0){
am.set(AlarmManager.RTC_WAKEUP,Contants.getNowTimeMinuties() + Contants.getDifferMillis(7),sender);
}else{
am.set(AlarmManager.RTC_WAKEUP,Contants.getNowTimeMinuties() + Contants.getDifferMillis(differDay),sender);
}
}
}
cursor.close();
dbHelper.close();
Toast.makeText(this, R.string.alarm_time_come, Toast.LENGTH_SHORT).show();
new AlertDialog.Builder(this)
.setIcon(R.drawable.clock)
.setTitle("大明闹钟时间到了!!")
.setMessage("你使用大明闹钟时间到了!!!")
.setPositiveButton("确定",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton)
{
/*AlarmAlertActivity */
finish();
}
}).setNegativeButton("取消",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton)
{
/*AlarmAlertActivity */
finish();
}
}).show();
}
}
布局文件
一、main。xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/alarm_bg"
>
<LinearLayout android:id="@+id/box"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
</LinearLayout>
</LinearLayout>
二、alarm_clock.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="320dip"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/alarm_title"
android:layout_width="320dip"
android:layout_height="wrap_content"
android:textColor="#FF000000"
android:textSize="23px"
android:layout_margin="5px"
/>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="320dip"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="250dip"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/alarm_image"
android:scaleType="centerCrop"
android:layout_width="20dip"
android:layout_height="wrap_content"
android:layout_margin="8px"
/>
<LinearLayout
android:layout_width="222dip"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:id="@+id/alarm_time"
android:layout_width="222dip"
android:layout_height="wrap_content"
android:paddingLeft="8dip"
android:layout_marginBottom="3dip"
android:textColor="#FF000000"
android:textSize="18px"
/>
<TextView
android:id="@+id/alarm_repeat_time"
android:layout_width="222dip"
android:layout_height="wrap_content"
android:paddingLeft="8dip"
android:layout_gravity="left"
android:textColor="#FF000000"
android:textSize="10px"
/>
</LinearLayout>
</LinearLayout>
<View
android:layout_width="2dip"
android:layout_height="match_parent"
android:textColor="#FF000000"
/>
<ImageView
android:id="@+id/show_open_close"
android:layout_width="38dip"
android:layout_height="wrap_content"
android:paddingTop="35dip"
android:scaleType="centerCrop"
android:layout_gravity="bottom"
android:gravity="bottom"
android:textColor="#FF000000"
/>
<TextView
android:layout_width="30dip"
android:layout_height="wrap_content"
/>
</LinearLayout>
</LinearLayout>
三、alarm_listview.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/note_textview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|center_vertical"
android:gravity="center_horizontal|center_vertical"
android:paddingLeft="10dip"
android:text="@string/alarm_list"
android:textColor="#FF000000"
android:textSize="30dip"
android:textStyle="bold"
android:paddingTop="6dip"
android:paddingBottom="6dip"
/>
<ListView
android:id="@+id/alarm_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
四、time_repeat_dialog.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<AbsoluteLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/white"
>
<DigitalClock
android:id="@+id/dClock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40sp"
android:textColor="@drawable/blue"
android:layout_x="58px"
android:layout_y="5px">
</DigitalClock>
<TextView
android:id="@+id/isopen_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_isopen_text"
android:textSize="16px"
android:textColor="@drawable/black"
android:layout_x="10px"
android:layout_y="64px"
>
</TextView>
<CheckBox
android:id="@+id/isopen_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="@drawable/black"
android:layout_x="160px"
android:layout_y="54px"
/>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_title1"
android:textSize="20sp"
android:textColor="@drawable/black"
android:layout_x="10px"
android:layout_y="104px"
>
</TextView>
<Button
android:id="@+id/mButton"
android:layout_width="108px"
android:layout_height="40px"
android:text="@string/str_button1"
android:textColor="@drawable/black"
android:textSize="18sp"
android:layout_x="160px"
android:layout_y="102px"
>
</Button>
<TextView
android:id="@+id/repeattext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_default"
android:textSize="16sp"
android:textColor="@drawable/red"
android:layout_x="10px"
android:layout_y="145px"
>
</TextView>
<Button
android:id="@+id/repeatButton"
android:layout_width="108px"
android:layout_height="40px"
android:layout_x="160px"
android:layout_y="182px"
android:textColor="@drawable/black"
android:textSize="18sp"
android:text="@string/repeat_button"
/>
</AbsoluteLayout>
</LinearLayout>
value目录下的文件
一、arrays.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="select_dialog_items">
<item>周一</item>
<item>周二</item>
<item>周三</item>
<item>周四</item>
<item>周五</item>
<item>周六</item>
<item>周日</item>
</string-array>
</resources>
二、color.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<drawable name="white">#FFFFFFFF</drawable>
<drawable name="black">#000000</drawable>
<drawable name="blue">#0000FF</drawable>
<drawable name="red">#FF0000</drawable>
<drawable name="dackgray">#666666</drawable>
<drawable name="yellow">#FFFFFF00</drawable>
</resources>
三、string.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MainActivity!</string>
<string name="app_name">AlarmApp</string>
<string name="alarm_list">大明闹钟</string>
<string name="not_dbcursor_values">数据库中没有值,请设置你的闹钟。。。。</string>
<string name="str_isopen_text">是否开启闹钟</string>
<string name="str_title1">设置闹钟</string>
<string name="str_button1">设置时间</string>
<string name="str_default">目前无设置</string>
<string name="repeat_button">设置重复</string>
<string name="alert_dialog_ok">确定</string>
<string name="alert_dialog_cancel">取消</string>
<string name="alarm_dialog_title">闹钟设置</string>
<string name="alert_dialog_multi_choice">重复闹钟设置</string>
<string name="alarm_time_come">您使用大明闹钟设置的闹钟时间到了!!!</string>
<string name="alarm_delete1">大明闹钟一删除成功!</string>
<string name="alarm_delete2">大明闹钟二删除成功!</string>
<string name="alarm_set2">大明闹钟二时间为:</string>
<string name="not_time_right">闹钟时间设置不对,请选择周几重复!</string>
</resources>
<strong><span style="font-size:24px;color:#660000;">注意:广播一定要在Manifest中注册</span></strong>
AndroidManifest.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cn.daming"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
Android闹钟【复杂版】的更多相关文章
- Android 闹钟最终版
以下是我发现的几点闹钟中重要的点,分享一下: (1)在闹钟中有AudioManager管理机制,这个机制可以申请和释放OnAudioFocusChangeListener监听. 还有mTelephon ...
- Android闹钟 AlarmManager的使用
Android闹钟 AlarmManager的使用 AlarmManager介绍 AlarmManager这个类提供对系统闹钟服务的访问接口. 你可以为你的应用设定一个在未来某个时间唤醒的功能. 当闹 ...
- Android闹钟设置的解决方案
Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案. 主要问题 API19开始AlarmMan ...
- Android P正式版即将到来:后台应用保活、消息推送的真正噩梦
1.前言 对于广大Android开发者来说,Android O(即Android 8.0)还没玩热,Andriod P(即Andriod 9.0)又要来了. 下图上谷歌官方公布的Android P ...
- 通过微信Android和iOS版,看两大系统的差异
由于设计师或者产品经理使用的移动设备大部分是iPhone,所以在做设计时,容易忽略Android和iOS的差异,按照自己的使用习惯进行设计,导致大部分设计师或产品经理做出的设计都是基于iOS规范或习惯 ...
- Android O 正式版新功能
ref: Android O新特性和行为变更总结zzhttp://www.cnblogs.com/bluestorm/p/7148134.html Android O正式版带来了诸多新功能,如Tens ...
- Android Studio Beat版公布!
Android Studio Beat版公布了! 速度比0.61快爆了,有木有! L也能更新了,炫爆了,有木有!
- android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动
android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动 1.先简单设置一个闹钟提醒事件: //设置闹钟 mSetting.setOnClickListener ...
- 微信4.5 for Android安卓内测版体验【实时对讲】杀手级应用下载
微信4.5 for Android 安卓 内测版 体验 程序启动画面,是一支在动的烛光 主要功能更新如下 支持语音提醒,到时间后自动弹出消息框 发起语音提醒请求 成功识别语音请求,并且保存在本地,应该 ...
随机推荐
- centos配置中文显示和中文输入
我现在使用虚拟机运行centos,但是安装完成后系统显示英文,而且无法进行中文输入,这使我感到很烦躁,虽然我对自己说,这样可以逼迫自己适应全英文的环境,但作为一个中国人还是难以忍受,所以记录一下解决办 ...
- ref 参数
当使用ref 作为参数赋值时,ref 得需要初始化,就是在从新定义一下 参数的值,下面有列子: 在控制台中运行如下: //定义一个方法,两个参数 i和a . public static void ge ...
- 一行 Python 实现并行化 -- 日常多线程操作的新思路
春节坐在回家的火车上百无聊赖,偶然看到 Parallelism in one line 这篇在 Hacker News 和 reddit 上都评论过百的文章,顺手译出,enjoy:-) http:// ...
- 【转】大数据以及Hadoop相关概念介绍
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4230220.html 感谢! 一.大数据的基本概念 1.1.什么是大数据 大数据指的就是要处理的数据是TB级别以 ...
- [翻译]Behavior-Driven Development (BDD)行为驱动开发(一)
简单而言,BDD是一系列基于TDD的工具和方法集发展而来的开发模式,一般不认为是一种新的开发模式,而是作为TDD的补充.因此,首先对TDD的概念进行进行. 测试驱动开发(TDD) TDD模式采取的是迭 ...
- Java并发编程:Timer和TimerTask
Java并发编程:Timer和TimerTask 下面内容转载自: http://blog.csdn.net/xieyuooo/article/details/8607220 其实就Timer来讲就是 ...
- Working with Other Node Types II
[Working with Other Node Types II] An SKCropNode object does not directly render content, like a spr ...
- Java(07)转化流
查看API得知: public class OutputStreamWriter extends Writer public class InputStreamReader extends Reade ...
- ASP.NET中Request.ApplicationPath、Request.FilePath、Request.Path、.Request.MapPath、Server.MapPath(转载)
1.Request.ApplicationPath->当前应用的目录 Jsp中, ApplicationPath指的是当前的application(应用程序)的目录,ASP.NET中也是这个 ...
- Socket小项目的一些心得(鸣谢传智的教学视频)
Socket是一种封装了四层通信的整体抽象入口,通常也称作"套接字",这是常用的四层通信这是访问Socket的流程图,这个分为客户端和服务器端,其中服务器端有以下步骤去建立,前面的 ...