簡(jiǎn)單實(shí)現(xiàn)Android鬧鐘功能
鬧鐘的簡(jiǎn)單實(shí)現(xiàn),只有顯示時(shí)間和設(shè)置鬧鐘。
AlarmView
package com.example.lenovo.clock2; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.TimePickerDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.icu.util.Calendar; import android.os.Build; import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; import android.support.v7.app.AlertDialog; import android.util.AttributeSet; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TimePicker; import java.util.Date; /** * Created by lenovo on 2017/11/20. */ //鬧鐘 public class AlarmView extends LinearLayout { // public AlarmView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { // super(context, attrs, defStyleAttr); // } public AlarmView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public AlarmView(Context context) { super(context); init(); } private void init(){ alarmManager= (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE); } @RequiresApi(api = Build.VERSION_CODES.N) @Override protected void onFinishInflate() { super.onFinishInflate(); btnAddAlarm=findViewById(R.id.btnAddAlarm); lvAlarmList=findViewById(R.id.lvAlarmList); adapter=new ArrayAdapter<AlarmView.AlarmData>(getContext(),R.layout.support_simple_spinner_dropdown_item); lvAlarmList.setAdapter(adapter); readSavedAlarmList(); //adapter.add(new AlarmData(System.currentTimeMillis())); btnAddAlarm.setOnClickListener(new OnClickListener() { @RequiresApi(api = Build.VERSION_CODES.N) @Override public void onClick(View view) { addAlarm(); } }); lvAlarmList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){ @Override public boolean onItemLongClick(AdapterView<?> adapterView, View view, final int position, long id) { new AlertDialog.Builder(getContext()).setTitle("操作選項(xiàng)").setItems(new CharSequence[]{"刪除"}, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int which) { switch (which){ case 0: deleteAlarm(position); break; default: break; } } }).setNegativeButton("取消",null).show(); return true; } }); } private void deleteAlarm(int position){ AlarmData ad=adapter.getItem(position); adapter.remove(ad); saveAlarmList();//重新保存 alarmManager.cancel(PendingIntent.getBroadcast(getContext(),ad.getId(),new Intent(getContext(),AlarmReceiver.class),0)); } @RequiresApi(api = Build.VERSION_CODES.N) private void addAlarm(){ //獲取當(dāng)前時(shí)間 Calendar c=Calendar.getInstance(); //時(shí)間選擇框 new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { Calendar calendar =Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY,hourOfDay); calendar.set(Calendar.MINUTE,minute); calendar.set(Calendar.SECOND,0); calendar.set(Calendar.MILLISECOND,0); //寫出當(dāng)前時(shí)間 Calendar currentTime=Calendar.getInstance(); //設(shè)置時(shí)間小于當(dāng)前時(shí)間,往后推一天 if(calendar.getTimeInMillis()<=currentTime.getTimeInMillis()){ calendar.setTimeInMillis(calendar.getTimeInMillis()+24*60*60*1000); } AlarmData ad=new AlarmData(calendar.getTimeInMillis()); adapter.add(ad); /* 第一個(gè)參數(shù) RTC操作系統(tǒng)時(shí)間為啟動(dòng)時(shí)間點(diǎn),WAKEUP系統(tǒng)休眠時(shí)同樣執(zhí)行 第二個(gè)參數(shù) 什么時(shí)候啟動(dòng) 第三個(gè)參數(shù) 啟動(dòng)之后什么時(shí)間再次啟動(dòng) 第四個(gè)參數(shù) Pendingintent掛起的Intent,不立即執(zhí)行 */ alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, ad.getTime(),//當(dāng)前時(shí)間當(dāng)做請(qǐng)求碼 5*60*1000, //執(zhí)行廣播 PendingIntent.getBroadcast(getContext(), ad.getId(), new Intent(getContext(), AlarmReceiver.class), 0)); //每一個(gè)鬧鐘對(duì)應(yīng)一個(gè)請(qǐng)求碼,根據(jù)請(qǐng)求碼移除特定的鬧鐘,那么把時(shí)間當(dāng)做請(qǐng)求碼 saveAlarmList(); } },c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),true).show(); } //保存鬧鐘數(shù)據(jù) private void saveAlarmList(){ SharedPreferences.Editor editor=getContext().getSharedPreferences(AlarmView.class.getName(),Context.MODE_PRIVATE).edit(); StringBuffer sb=new StringBuffer(); for(int i=0;i<adapter.getCount();i++){ sb.append(adapter.getItem(i).getTime()).append(","); } if(sb.length()>1){ String content=sb.toString().substring(0,sb.length()-1);//去掉最后一個(gè)逗號(hào) editor.putString(KEY_ALARM_LIST,content); }else{ editor.putString(KEY_ALARM_LIST,null); } editor.commit(); } //讀取已存數(shù)據(jù) @RequiresApi(api = Build.VERSION_CODES.N) private void readSavedAlarmList(){ SharedPreferences sp=getContext().getSharedPreferences((AlarmView.class.getName()), Context.MODE_PRIVATE); String content=sp.getString(KEY_ALARM_LIST,null); if(content!=null){ String[] timeStrings=content.split(","); for(String string:timeStrings){ adapter.add(new AlarmData(Long.parseLong(string))); } } } private static final String KEY_ALARM_LIST="alarmList"; private Button btnAddAlarm; private ListView lvAlarmList; private ArrayAdapter<AlarmData> adapter; private AlarmManager alarmManager;//系統(tǒng)的鬧鐘服務(wù) private static class AlarmData{ //鬧鐘所要響起的時(shí)間 @RequiresApi(api = Build.VERSION_CODES.N) public AlarmData(long time){ this.time=time; date= Calendar.getInstance(); date.setTimeInMillis(time); timeLable=String.format("%d月%d日 %d:%d", date.get(Calendar.MONTH)+1,//getMonth的返回值是從0開始的 date.get(Calendar.DAY_OF_MONTH), date.get(Calendar.HOUR_OF_DAY), date.get(Calendar.MINUTE)); } public long getTime(){ return time; } public String getTimeLable(){ return timeLable; } @Override public String toString() { return getTimeLable(); } public int getId(){ return (int)(getTime()/1000/60);//精確到分鐘,getTime為毫秒 } //獲取時(shí)間的標(biāo)簽 private String timeLable=""; private long time=0; private Calendar date; } }
TimeView
package com.example.lenovo.clock2; import android.content.Context; import android.icu.util.Calendar; import android.os.Build; import android.os.Handler; import android.os.Message; import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; import android.util.AttributeSet; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; /** * Created by lenovo on 2017/11/20. */ //時(shí)鐘 顯示目前的時(shí)間 public class TimeView extends LinearLayout { public TimeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public TimeView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public TimeView(Context context) { super(context); } @Override protected void onFinishInflate() { super.onFinishInflate(); tvTime=findViewById(R.id.tvTime); tvTime.setText("這里顯示時(shí)間"); timerHander.sendEmptyMessage(0); } //判斷可見屬性是否發(fā)生改變 @Override protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if(getVisibility()== View.VISIBLE){ timerHander.sendEmptyMessage(0);//可見,則呈現(xiàn) }else{ timerHander.removeMessages(0);//否則移除所有消息 } } //刷新時(shí)間 @RequiresApi(api = Build.VERSION_CODES.N) private void refreshTime(){ Calendar c=Calendar.getInstance(); tvTime.setText(String.format("%d:%d:%d",c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),c.get(Calendar.SECOND))); } //Hander每隔一秒執(zhí)行一次 private Handler timerHander=new Handler(){ @RequiresApi(api = Build.VERSION_CODES.N) @Override public void handleMessage(Message msg) { refreshTime(); //若為當(dāng)前頁面,則刷新;否則,沒有必要刷新 if (getVisibility()== View.VISIBLE) { timerHander.sendEmptyMessageDelayed(0, 1000);//1000毫秒后再執(zhí)行handleMessage方法 } }; }; private TextView tvTime; }
AlarmReceiver
package com.example.lenovo.clock2; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; /** * Created by lenovo on 2017/11/23. */ public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { AlarmManager am= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); am.cancel(PendingIntent.getBroadcast(context,getResultCode(),new Intent(context,AlarmReceiver.class),0)); Intent i=new Intent(context,PlayAlarmAty.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } }
MainActivity
package com.example.lenovo.clock2; import android.app.Activity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TabHost; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tabHost= (TabHost) findViewById(R.id.tabhost); tabHost.setup(); //setContent()為聲明內(nèi)容 tabHost.addTab(tabHost.newTabSpec("tabTime").setIndicator("時(shí)鐘").setContent(R.id.tabTime)); tabHost.addTab(tabHost.newTabSpec("tabAlarm").setIndicator("鬧鐘").setContent(R.id.tabAlarm)); tabHost.addTab(tabHost.newTabSpec("tabTimer").setIndicator("計(jì)時(shí)器").setContent(R.id.tabTimer)); tabHost.addTab(tabHost.newTabSpec("tabStopWatch").setIndicator("秒表").setContent(R.id.tabStopWatch)); } private TabHost tabHost; }
PlayAlarmAty
package com.example.lenovo.clock2; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.support.annotation.Nullable; /** * Created by lenovo on 2017/11/25. */ public class PlayAlarmAty extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.alarm_player_aty); mp=MediaPlayer.create(this,R.raw.mine); mp.start(); } @Override protected void onPause() { super.onPause(); finish(); } @Override protected void onDestroy() { super.onDestroy(); mp.stop(); mp.release(); } private MediaPlayer mp; //音樂播放器 }
運(yùn)行效果圖
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android通過AlarmManager類實(shí)現(xiàn)簡(jiǎn)單鬧鐘功能
- Android編程使用AlarmManager設(shè)置鬧鐘的方法
- Android 使用AlarmManager和NotificationManager來實(shí)現(xiàn)鬧鐘和通知欄
- Android手機(jī)鬧鐘服務(wù)AlarmManagerk開發(fā)案例
- 簡(jiǎn)單實(shí)現(xiàn)Android鬧鐘程序 附源碼
- Android編程實(shí)現(xiàn)鬧鐘的方法詳解
- Android實(shí)現(xiàn)簡(jiǎn)易鬧鐘功能
- Android鬧鐘設(shè)置的解決方案
- Android鬧鐘機(jī)制實(shí)現(xiàn)定時(shí)任務(wù)功能
- Android使用AlarmManager設(shè)置鬧鐘功能
相關(guān)文章
Android adb安裝apk時(shí)提示Invalid APK file的問題
這篇文章主要介紹了Android adb安裝apk時(shí)提示Invalid APK file的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08Android應(yīng)用程序簽名步驟及相關(guān)知識(shí)介紹
本文主要介紹Android應(yīng)用程序簽名相關(guān)的理論知識(shí),包括:什么是簽名、為什么要給應(yīng)用程序簽名、如何給應(yīng)用程序簽名等,感興趣的朋友可以參考下哈2013-04-04Android使用ContentProvider初始化SDK庫方案小結(jié)
這篇文章主要介紹了Android使用ContentProvider初始化SDK庫方案總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Android—基于微信開放平臺(tái)v3SDK開發(fā)(微信支付填坑)
這篇文章主要介紹了Android—基于微信開放平臺(tái)v3SDK開發(fā)(微信支付填坑),具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11android系統(tǒng)按鍵音framework流程源碼詳細(xì)解析
這篇文章主要為大家詳細(xì)介紹了android系統(tǒng)按鍵音framework流程源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Android Socket實(shí)現(xiàn)多個(gè)客戶端聊天布局
這篇文章主要為大家詳細(xì)介紹了Android Socket實(shí)現(xiàn)多個(gè)客戶端聊天布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Android中WebView與Js交互的實(shí)現(xiàn)方法
本文給大家介紹android中webview與js交互的實(shí)現(xiàn)方法,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)2016-05-05