简单实现Android闹钟功能

闹钟的简单实现,只有显示时间和设置闹钟。

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(); 

    //设置时间小于当前时间,往后推一天
    if(calendar.getTimeInMillis()<=currentTime.getTimeInMillis()){
     calendar.setTimeInMillis(calendar.getTimeInMillis()+24*60*60*1000);
    } 

    AlarmData ad=new AlarmData(calendar.getTimeInMillis());
    adapter.add(ad); 

/*
第一个参数 RTC操作系统时间为启动时间点,WAKEUP系统休眠时同样执行
第二个参数 什么时候启动
第三个参数 启动之后什么时间再次启动
第四个参数 Pendingintent挂起的Intent,不立即执行
*/
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
      ad.getTime(),//当前时间当做请求码
      5*60*1000,
      //执行广播
      PendingIntent.getBroadcast(getContext(),
        ad.getId(),
        new Intent(getContext(),
          AlarmReceiver.class),
        0)); 

//每一个闹钟对应一个请求码,根据请求码移除特定的闹钟,那么把时间当做请求码
    saveAlarmList();
   }
  },c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),true).show(); 

 }
 //保存闹钟数据
 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();
 }
 //读取已存数据 

 @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;//系统的闹钟服务
 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); 

 }
 //判断可见属性是否发生改变
 @Override
 protected void onVisibilityChanged(View changedView, int visibility) {
  super.onVisibilityChanged(changedView, visibility);
  if(getVisibility()== View.VISIBLE){
   timerHander.sendEmptyMessage(0);//可见,则呈现
  }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每隔一秒执行一次
 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毫秒后再执行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()为声明内容
  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;
 //音乐播放器
}

运行效果图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android手机闹钟服务AlarmManagerk开发案例
  • 简单实现Android闹钟程序 附源码
  • Android闹钟设置的解决方案
  • Android编程闹钟设置方法详解
  • Android自定义View 实现闹钟唤起播放闹钟铃声功能
  • Android闹钟机制实现定时任务功能
  • Android仿正点闹钟时间齿轮滑动效果
  • Android如何在App中启动系统闹钟
  • Android使用CountDownTimer类实现倒计时闹钟
  • android用闹钟定时做http请求推送的解决方案
(0)

相关推荐

  • Android仿正点闹钟时间齿轮滑动效果

    看到正点闹钟上的设置时间的滑动效果非常好看,自己就想做一个那样的,在网上就开始搜资料了,看到网上有的齿轮效果的代码非常多,也非常难懂,我就决定自己研究一下,现在我就把我的研究成果分享给大家.我研究的这个效果出来了,而且代码也非常简单,通俗易懂.效果图如下: 首先是MainActivity的布局文件,这个布局文件非常简单,就是一个Button:activity_main.xml文件,代码如下: <?xml version="1.0" encoding="utf-8&quo

  • Android如何在App中启动系统闹钟

    由于不同Android手机厂商提供的系统闹钟包名都不一致,所以只能通过过滤当前手机所有的应用,以确定闹钟应用的包名,进而启动它. 这里采用的过滤规则是:系统应用 && 应用的PackageName包含"widget" 和 "clock" 1.布局文件  activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&

  • android用闹钟定时做http请求推送的解决方案

    设计思路 如果在开发当中需要做push接入,而产品又要求不允许用第三方sdk(百度push,友盟push),而且又没有网络编程的经验,这个时候怎么办?这里就给大家分享下用http请求解决这个问题. 大体的设计思路是,写一个service(为了保证长时间运行不被kill,就将其定义到另外的进程当中去),在这个service里面启动闹钟,每隔一段时间(这个时间可以自己定义)去请求服务器,如果有新的push消息,就通知给用户. 具体实现 貌似很简单定义一个闹钟不断轮循请求服务器一句话,却在实际开发中要

  • Android使用CountDownTimer类实现倒计时闹钟

    下面使用CountDownTimer类实现倒计时小闹钟,CountDownTimer类其实很简单,一般只需重写其onFinish和onTick方法就可以实现倒计时小闹钟,代码如下: MainActivity: package com.home.brewclock; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.os.CountDownT

  • Android闹钟设置的解决方案

    Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案. 主要问题 1.API19开始AlarmManager的机制修改. 2.应用程序被Kill掉后,设置的闹钟不响. 3.6.0以上进入Doze模式会使JobScheduler停止工作. 4.手机设置重启后,闹钟失效问题. API19以上AlarmManager机制的修改 API19之前AlarmManager提供了三个设置闹钟的方法,由于业务

  • Android手机闹钟服务AlarmManagerk开发案例

    AlarmManager通常用来开发手机闹钟,并且它是一个全局定时器,可在指定时间或指定周期启动其他组件(包括Activity,Service,BroadcastReceiver) 获取AlarmManager对象: getSystemService(Service.ALARM_SERVICE) 调用其中的方式设置定时器启动指定组件: set(int type,long triggerAtTime,PendingIntent operation)设置在TriggerAtTime时间启动由oper

  • 简单实现Android闹钟程序 附源码

    这个应用实现了简单的闹钟功能,关闭程序的状态中也可以进行闹钟的提醒. 这里遗留了一个问题: 如果我通过应用本身关闭程序,是可以实现我上述所说的功能,但是如果我在手机进程管理中实现应用程序的关闭操作,这个提醒就不起作用了,我很疑惑的是,我通过应用程序本身关闭了后,在进程中也是查看不到这个应用了的.所以哪位知道的帮留个言指点下,谢谢. ClockDemo.java package com.example.clock; import java.util.Calendar; import android

  • Android编程闹钟设置方法详解

    本文实例讲述了Android编程闹钟设置方法.分享给大家供大家参考,具体如下: 闹钟在生活中最常见了,在Android中可以通过AlarmManager来实现闹钟,AlarmManager类专门用来设置在某个指定的时间去完成指定的时间.AlarmManager就会通过onReceive()方法去执行这些事件,就算系统处于待机状态,同样不会影响运行.可以通过Context.getSystemService方法来获得该服务.AlarmManager中的方法不少,如下: 方法 说明 Cancel 取消

  • Android闹钟机制实现定时任务功能

    Android的闹钟实现机制, 需要调用AlarmManager.set()将闹铃时间记录到系统中,当闹铃时间到后,系统会给应用程序发送广播,我们只需要去注册广播接收器就可以了. 本文分三部分讲解如何实现闹钟: 目录: 1. 设置闹铃时间; 2. 接收闹铃事件广播; 3. 重开机后重新计算并设置闹铃时间; 1. 设置闹铃时间(毫秒) private void setAlarmTime(Context context, long triggerAtMillis) { AlarmManager am

  • Android自定义View 实现闹钟唤起播放闹钟铃声功能

    先上图看一下闹钟唤期页面的效果 实现的功能: 1:转动的图片根据天气情况更换 2:转动时间可以设置,转动结束,闹铃声音就结束 3:光圈颜色渐变效果 直接上代码啦: package com.yuekong.sirius.extension.customview; import android.animation.Animator; import android.animation.ValueAnimator; import android.content.Context; import andro

随机推荐