最近做闹钟,所以自己写了个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闹钟【复杂版】的更多相关文章

  1. Android 闹钟最终版

    以下是我发现的几点闹钟中重要的点,分享一下: (1)在闹钟中有AudioManager管理机制,这个机制可以申请和释放OnAudioFocusChangeListener监听. 还有mTelephon ...

  2. Android闹钟 AlarmManager的使用

    Android闹钟 AlarmManager的使用 AlarmManager介绍 AlarmManager这个类提供对系统闹钟服务的访问接口. 你可以为你的应用设定一个在未来某个时间唤醒的功能. 当闹 ...

  3. Android闹钟设置的解决方案

    Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案. 主要问题 API19开始AlarmMan ...

  4. Android P正式版即将到来:后台应用保活、消息推送的真正噩梦

    1.前言 对于广大Android开发者来说,Android O(即Android 8.0)还没玩热,Andriod P(即Andriod 9.0)又要来了.   下图上谷歌官方公布的Android P ...

  5. 通过微信Android和iOS版,看两大系统的差异

    由于设计师或者产品经理使用的移动设备大部分是iPhone,所以在做设计时,容易忽略Android和iOS的差异,按照自己的使用习惯进行设计,导致大部分设计师或产品经理做出的设计都是基于iOS规范或习惯 ...

  6. Android O 正式版新功能

    ref: Android O新特性和行为变更总结zzhttp://www.cnblogs.com/bluestorm/p/7148134.html Android O正式版带来了诸多新功能,如Tens ...

  7. Android Studio Beat版公布!

    Android Studio Beat版公布了! 速度比0.61快爆了,有木有! L也能更新了,炫爆了,有木有!

  8. android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动

    android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动            1.先简单设置一个闹钟提醒事件: //设置闹钟 mSetting.setOnClickListener ...

  9. 微信4.5 for Android安卓内测版体验【实时对讲】杀手级应用下载

    微信4.5 for Android 安卓 内测版 体验 程序启动画面,是一支在动的烛光 主要功能更新如下 支持语音提醒,到时间后自动弹出消息框 发起语音提醒请求 成功识别语音请求,并且保存在本地,应该 ...

随机推荐

  1. centos配置中文显示和中文输入

    我现在使用虚拟机运行centos,但是安装完成后系统显示英文,而且无法进行中文输入,这使我感到很烦躁,虽然我对自己说,这样可以逼迫自己适应全英文的环境,但作为一个中国人还是难以忍受,所以记录一下解决办 ...

  2. ref 参数

    当使用ref 作为参数赋值时,ref 得需要初始化,就是在从新定义一下 参数的值,下面有列子: 在控制台中运行如下: //定义一个方法,两个参数 i和a . public static void ge ...

  3. 一行 Python 实现并行化 -- 日常多线程操作的新思路

    春节坐在回家的火车上百无聊赖,偶然看到 Parallelism in one line 这篇在 Hacker News 和 reddit 上都评论过百的文章,顺手译出,enjoy:-) http:// ...

  4. 【转】大数据以及Hadoop相关概念介绍

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4230220.html 感谢! 一.大数据的基本概念 1.1.什么是大数据 大数据指的就是要处理的数据是TB级别以 ...

  5. [翻译]Behavior-Driven Development (BDD)行为驱动开发(一)

    简单而言,BDD是一系列基于TDD的工具和方法集发展而来的开发模式,一般不认为是一种新的开发模式,而是作为TDD的补充.因此,首先对TDD的概念进行进行. 测试驱动开发(TDD) TDD模式采取的是迭 ...

  6. Java并发编程:Timer和TimerTask

    Java并发编程:Timer和TimerTask 下面内容转载自: http://blog.csdn.net/xieyuooo/article/details/8607220 其实就Timer来讲就是 ...

  7. Working with Other Node Types II

    [Working with Other Node Types II] An SKCropNode object does not directly render content, like a spr ...

  8. Java(07)转化流

    查看API得知: public class OutputStreamWriter extends Writer public class InputStreamReader extends Reade ...

  9. ASP.NET中Request.ApplicationPath、Request.FilePath、Request.Path、.Request.MapPath、Server.MapPath(转载)

    1.Request.ApplicationPath->当前应用的目录   Jsp中, ApplicationPath指的是当前的application(应用程序)的目录,ASP.NET中也是这个 ...

  10. Socket小项目的一些心得(鸣谢传智的教学视频)

    Socket是一种封装了四层通信的整体抽象入口,通常也称作"套接字",这是常用的四层通信这是访问Socket的流程图,这个分为客户端和服务器端,其中服务器端有以下步骤去建立,前面的 ...