簡單實現(xiàn)Android鬧鐘功能
更新時間:2021年01月27日 12:07:53 作者:我愛酸奶奶奶奶奶
這篇文章主要教大家如何簡單實現(xiàn)Android鬧鐘功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
鬧鐘的簡單實現(xiàn),只有顯示時間和設(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("操作選項").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(){ //獲取當前時間 Calendar c=Calendar.getInstance(); //時間選擇框 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); //寫出當前時間 Calendar currentTime=Calendar.getInstance(); //設(shè)置時間小于當前時間,往后推一天 if(calendar.getTimeInMillis()<=currentTime.getTimeInMillis()){ calendar.setTimeInMillis(calendar.getTimeInMillis()+24*60*60*1000); } AlarmData ad=new AlarmData(calendar.getTimeInMillis()); adapter.add(ad); /* 第一個參數(shù) RTC操作系統(tǒng)時間為啟動時間點,WAKEUP系統(tǒng)休眠時同樣執(zhí)行 第二個參數(shù) 什么時候啟動 第三個參數(shù) 啟動之后什么時間再次啟動 第四個參數(shù) Pendingintent掛起的Intent,不立即執(zhí)行 */ alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, ad.getTime(),//當前時間當做請求碼 5*60*1000, //執(zhí)行廣播 PendingIntent.getBroadcast(getContext(), ad.getId(), new Intent(getContext(), AlarmReceiver.class), 0)); //每一個鬧鐘對應一個請求碼,根據(jù)請求碼移除特定的鬧鐘,那么把時間當做請求碼 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);//去掉最后一個逗號 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)的鬧鐘服務 private static class AlarmData{ //鬧鐘所要響起的時間 @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為毫秒 } //獲取時間的標簽 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. */ //時鐘 顯示目前的時間 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("這里顯示時間"); 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);//否則移除所有消息 } } //刷新時間 @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(); //若為當前頁面,則刷新;否則,沒有必要刷新 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("時鐘").setContent(R.id.tabTime)); tabHost.addTab(tabHost.newTabSpec("tabAlarm").setIndicator("鬧鐘").setContent(R.id.tabAlarm)); tabHost.addTab(tabHost.newTabSpec("tabTimer").setIndicator("計時器").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; //音樂播放器 }
運行效果圖
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- Android通過AlarmManager類實現(xiàn)簡單鬧鐘功能
- Android編程使用AlarmManager設(shè)置鬧鐘的方法
- Android 使用AlarmManager和NotificationManager來實現(xiàn)鬧鐘和通知欄
- Android手機鬧鐘服務AlarmManagerk開發(fā)案例
- 簡單實現(xiàn)Android鬧鐘程序 附源碼
- Android編程實現(xiàn)鬧鐘的方法詳解
- Android實現(xiàn)簡易鬧鐘功能
- Android鬧鐘設(shè)置的解決方案
- Android鬧鐘機制實現(xiàn)定時任務功能
- Android使用AlarmManager設(shè)置鬧鐘功能
相關(guān)文章
Android adb安裝apk時提示Invalid APK file的問題
這篇文章主要介紹了Android adb安裝apk時提示Invalid APK file的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Android使用ContentProvider初始化SDK庫方案小結(jié)
這篇文章主要介紹了Android使用ContentProvider初始化SDK庫方案總結(jié),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04Android—基于微信開放平臺v3SDK開發(fā)(微信支付填坑)
這篇文章主要介紹了Android—基于微信開放平臺v3SDK開發(fā)(微信支付填坑),具有一定的參考價值,有需要的可以了解一下。2016-11-11android系統(tǒng)按鍵音framework流程源碼詳細解析
這篇文章主要為大家詳細介紹了android系統(tǒng)按鍵音framework流程源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08Android Socket實現(xiàn)多個客戶端聊天布局
這篇文章主要為大家詳細介紹了Android Socket實現(xiàn)多個客戶端聊天布局,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04Android中WebView與Js交互的實現(xiàn)方法
本文給大家介紹android中webview與js交互的實現(xiàn)方法,本文介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起學習2016-05-05