最近做闹钟,所以自己写了个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. 提供给开发者 10 款最好的 Python IDE

    Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程. Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE).这 ...

  2. static public和 public static 区别

    static:加static 的是静态成员,不能实例化在你运行的时候他自己在内存中开辟了块空间,不用在new, 有点像全局变量,如果不用你必须去 实例化(new)才能用 static是静态的意思,pu ...

  3. 【转】 Linux Shell 命令--rename

    重命名文件,经常用到mv命令,批量重命名文件rename是最好的选择,Linux的rename 命令有两个版本,一个是C语言版本的,一个是Perl语言版本的,判断方法:输入man rename 看到第 ...

  4. 利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引)

    利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引) ##应用情景 项目中有大量的SQL,尤其是涉及到统计报表时,表关联比较多,当初开发建表时也没搞好索引关联的,上线后 ...

  5. Hadoop开发环境简介(转)

    1.Hadoop开发环境简介 1.1 Hadoop集群简介 Java版本:jdk-6u31-linux-i586.bin Linux系统:CentOS6.0 Hadoop版本:hadoop-1.0.0 ...

  6. js冲突

    bundles.Add(new ScriptBundle("~/bundles/jquery").Include(//"~/Scripts/modernizr-2.6.2 ...

  7. Azure中国版 制作镜像 捕捉镜像

    因为项目需要需要部署多台功能一样的服务器,简单来说是多台nginx服务器.如果按照原始的做法,是新建vm,然后一台台部署相关服务. 现在Azrue已经可以通过捕获镜像的方式创建vm镜像模板,然后按照创 ...

  8. tomcat的 JNDI 配置

    tomcat的conf/server.xml 配置 尽量用简单版 <Context path="/cas" docBase="D:\YC\zqV7\cas\WebR ...

  9. POJ1201Intervals(差分约束系统)

    昨天看了下差分约数系统的含义,其实就是如果有n个变量在m个形如aj-ai>=bk条件下,求解的此不等式的方法. 而这种不等式的解法其实就是转化为图论的最小路的算法求解的.我们将上面的不等式边形后 ...

  10. kindeditor html代码过滤不能保存

    这是因为编辑器默认开启了过滤模式(filterMode:true).当filterMode为true时,编辑器会根据htmlTags设定自动过滤HTML代码,主要是为了生成干净的代码.如果想保留所有H ...