簡單實(shí)現(xiàn)Android鬧鐘功能
鬧鐘的簡單實(shí)現(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("操作選項(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)前時間
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);
//寫出當(dāng)前時間
Calendar currentTime=Calendar.getInstance();
//設(shè)置時間小于當(dāng)前時間,往后推一天
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)時間為啟動時間點(diǎn),WAKEUP系統(tǒng)休眠時同樣執(zhí)行
第二個參數(shù) 什么時候啟動
第三個參數(shù) 啟動之后什么時間再次啟動
第四個參數(shù) Pendingintent掛起的Intent,不立即執(zhí)行
*/
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
ad.getTime(),//當(dāng)前時間當(dāng)做請求碼
5*60*1000,
//執(zhí)行廣播
PendingIntent.getBroadcast(getContext(),
ad.getId(),
new Intent(getContext(),
AlarmReceiver.class),
0));
//每一個鬧鐘對應(yīng)一個請求碼,根據(jù)請求碼移除特定的鬧鐘,那么把時間當(dā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);//去掉最后一個逗號
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{
//鬧鐘所要響起的時間
@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為毫秒
}
//獲取時間的標(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.
*/
//時鐘 顯示目前的時間
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();
//若為當(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("時鐘").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;
//音樂播放器
}
運(yùn)行效果圖




以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android通過AlarmManager類實(shí)現(xiàn)簡單鬧鐘功能
- Android編程使用AlarmManager設(shè)置鬧鐘的方法
- Android 使用AlarmManager和NotificationManager來實(shí)現(xiàn)鬧鐘和通知欄
- Android手機(jī)鬧鐘服務(wù)AlarmManagerk開發(fā)案例
- 簡單實(shí)現(xiàn)Android鬧鐘程序 附源碼
- Android編程實(shí)現(xiàn)鬧鐘的方法詳解
- Android實(shí)現(xiàn)簡易鬧鐘功能
- Android鬧鐘設(shè)置的解決方案
- Android鬧鐘機(jī)制實(shí)現(xiàn)定時任務(wù)功能
- Android使用AlarmManager設(shè)置鬧鐘功能
相關(guān)文章
Android adb安裝apk時提示Invalid APK file的問題
這篇文章主要介紹了Android adb安裝apk時提示Invalid APK file的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
Android應(yīng)用程序簽名步驟及相關(guān)知識介紹
本文主要介紹Android應(yīng)用程序簽名相關(guān)的理論知識,包括:什么是簽名、為什么要給應(yīng)用程序簽名、如何給應(yīng)用程序簽名等,感興趣的朋友可以參考下哈2013-04-04
Android使用ContentProvider初始化SDK庫方案小結(jié)
這篇文章主要介紹了Android使用ContentProvider初始化SDK庫方案總結(jié),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
Android—基于微信開放平臺v3SDK開發(fā)(微信支付填坑)
這篇文章主要介紹了Android—基于微信開放平臺v3SDK開發(fā)(微信支付填坑),具有一定的參考價值,有需要的可以了解一下。2016-11-11
android系統(tǒng)按鍵音framework流程源碼詳細(xì)解析
這篇文章主要為大家詳細(xì)介紹了android系統(tǒng)按鍵音framework流程源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08
Android Socket實(shí)現(xiàn)多個客戶端聊天布局
這篇文章主要為大家詳細(xì)介紹了Android Socket實(shí)現(xiàn)多個客戶端聊天布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
Android中WebView與Js交互的實(shí)現(xiàn)方法
本文給大家介紹android中webview與js交互的實(shí)現(xiàn)方法,本文介紹的非常詳細(xì),具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)2016-05-05

