最近做闹钟,所以自己写了个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. collect my database for test KCF tracker tools

    Path Button used to set dir where avi file saves, set path set video size and start record write to ...

  2. 在C语言环境下使用google protobuf

    本文写给经常使用C编程且不喜欢C++而又要经常使用google protobuf的人.        经常写通讯程序的人对数据进行序列化或者反序列化时,可能经常使用google的protobuf(PB ...

  3. 第一个Java Rest服务

    package com.example; import javax.ws.rs.GET; import javax.ws.rs.PUT; import javax.ws.rs.Path; import ...

  4. APT攻击将向云计算平台聚焦

    APT攻击作为一种高效.精确的网络攻击方式,在近几年被频繁用于各种网络攻击事件之中,并迅速成为企业信息安全最大的威胁之一. 近日,飞塔中国首席技术顾问X在谈及APT攻击时表示,随着云计算的不断发展普及 ...

  5. var隐式类型

    var dogName = "ruiky"; 1.[编译器]会在编译时自动根据值的类型推断这个变量的类型:       2.变量类型不可更改:因为声明的时候已经确定类型了. 3.可 ...

  6. oracle学习 一 (持续更新中)

    首先你需要创建一个表空间,然后,再创建一个用户名,用户名要给他指定一个表空间,并且给这个用户赋予权限, DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构. RESOURCE:拥有 ...

  7. JQuery中attr ,html,text,val,的一些用法

    attr:主要获取元素内部的属性,返回 的是属性值 html:返回当前元素(不包括他自己本身的标签,但是可以返回他自己的)的标签加上内容.仅限于返回第一个. text:和 .html() 方法不同, ...

  8. POJ3468 A Simple Problem with Integers(线段树延时标记)

    题目地址http://poj.org/problem?id=3468 题目大意很简单,有两个操作,一个 Q a, b 查询区间[a, b]的和 C a, b, c让区间[a, b] 的每一个数+c 第 ...

  9. Joel Spolsky对计算机学生的七大建议

    /*先来介绍下作者:Joel Spolsky,世界最具影响的程序员网志Joel on Software的主人,软件业一位旗帜鲜明的思想者,一位传统软件管理理念的挑战者.他创办的这个网站被程序员誉为“反 ...

  10. hdoj 5391 Zball in Tina Town

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5391 相关数论结论: 威尔逊定理——当且仅当p为素数时:( p -1 )! ≡ p-1 ( mod p ...