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(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;i1){
            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 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实战—闹钟的简单实现_第1张图片 Android实战—闹钟的简单实现_第2张图片 Android实战—闹钟的简单实现_第3张图片 Android实战—闹钟的简单实现_第4张图片



你可能感兴趣的:(android开发)