android闹钟(五):实现闹钟功能

闹钟主页面:AlarmView.java

package com.mytest.myclock;

import java.util.Calendar;

import android.app.AlarmManager;
import android.app.AlertDialog;
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.content.SharedPreferences.Editor;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ShareActionProvider;
import android.widget.TimePicker;
import android.widget.Toast;

public class AlarmView extends LinearLayout {

    public AlarmView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }

    public AlarmView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public AlarmView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    private ListView alarmListView;
    private Button addAlarmButton;
    private ArrayAdapter<Alarm> adapter;
    private final static String KEY_ALARM_LIST = "clarm_list";
    private AlarmManager alarmManager;

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        alarmListView = (ListView) this.findViewById(R.id.lv_alarm);
        addAlarmButton = (Button) this.findViewById(R.id.btn_add_alarm);

        addAlarmButton.setOnClickListener(new AddAlarmOnClickListener());

        adapter = new ArrayAdapter<AlarmView.Alarm>(getContext(), android.R.layout.simple_list_item_1);
        alarmListView.setAdapter(adapter);
        alarmListView.setOnItemLongClickListener(new ClarmOnItemLongClickListener());

        readSaveCalarm();

        alarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
    }

    private final class ClarmOnItemLongClickListener implements AdapterView.OnItemLongClickListener {

        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {

            //System.out.println("onItemLongClick=================>");

            new AlertDialog.Builder(getContext()).setTitle("确认删除?").setNegativeButton("取消", null)
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            System.out.println("onItemLongClick->onClick:which:" + which);

                            removeAlarm(position);

                        }

                    }).show();

            return true;
        }

    }

    private final class AddAlarmOnClickListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            // Toast.makeText(getContext(), "add",Toast.LENGTH_SHORT).show();
            addAlarm();
        }
    }

    private void removeAlarm(int index) {
        Alarm alarm = adapter.getItem(index);
        adapter.remove(alarm);
        saveAlarm();
        alarmManager.cancel(PendingIntent.getBroadcast(getContext(), alarm.getId(), new Intent(getContext(),AlarmReceiver.class), 0));
    }

    /**
     * 保存设置的闹钟。覆盖式的,全部重新写入,清空原有的。
     */
    private void saveAlarm() {
        Editor edit = getContext().getSharedPreferences(AlarmView.class.getName(), Context.MODE_PRIVATE).edit();
        StringBuffer alarmListStr = new StringBuffer();

        for (int i = 0; i < adapter.getCount(); i++) {
            alarmListStr.append(adapter.getItem(i).getTime()).append(",");
        }

        edit.putString(KEY_ALARM_LIST, alarmListStr.toString());
        edit.commit();
    }

    /**
     * 读取保存的闹钟
     */
    private void readSaveCalarm() {
        SharedPreferences share = getContext().getSharedPreferences(AlarmView.class.getName(), Context.MODE_PRIVATE);
        String alarmListStr = share.getString(KEY_ALARM_LIST, "");
        if (alarmListStr != null) {
            String[] alarmArr = alarmListStr.split(",");
            if (alarmArr != null) {
                for (String str : alarmArr) {
                    System.out.println("alarm:" + str);
                    if (str != null && !"".equals(str.trim())) {
                        long time = Long.valueOf(str);
                        adapter.add(new Alarm(time));
                    }
                }
            }
        }

    }

    /**
     * 添加闹钟
     */
    private void addAlarm() {
        Calendar curCal = Calendar.getInstance();

        new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() {

            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                Calendar alarmCal = Calendar.getInstance();
                alarmCal.set(Calendar.HOUR_OF_DAY, hourOfDay);
                alarmCal.set(Calendar.MINUTE, minute);
                alarmCal.set(Calendar.SECOND, 0);

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

                // System.out.println(String.format("hourOfDay:%d,minute:%d",
                // hourOfDay,minute));

                // 添加到adapter,显示到列表
                Alarm alarm = new Alarm(alarmCal.getTimeInMillis());
                adapter.add(alarm);

                //每隔10分钟
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarm.getTime(), 10 * 60 * 1000, PendingIntent
                        .getBroadcast(getContext(), alarm.getId(), new Intent(getContext(), AlarmReceiver.class), 0));

                // 保存到share中,下次启动再读取
                saveAlarm();
            }
        }, curCal.get(Calendar.HOUR_OF_DAY), curCal.get(Calendar.MINUTE), true).show();
    }

    private class Alarm {
        private long time = 0;
        private String timeLabel = "";
        private Calendar date;

        public Alarm(Long time) {
            this.time = time;
            Calendar cal = Calendar.getInstance();
            cal.setTimeInMillis(time);

            timeLabel = String.format("%d-%d %d:%d", cal.get(Calendar.MONTH + 1), cal.get(Calendar.DAY_OF_MONTH),
                    cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE));
        }

        public long getTime() {
            return time;
        }

        public String getTimeLabel() {
            return timeLabel;
        }

        public Calendar getDate() {
            return date;
        }

        public int getId() {
            return (int) (getTime() / 1000 / 60);
        }

        @Override
        public String toString() {
            return getTimeLabel();
        }

    }

}

闹钟时间到,播放音乐的activity:PlayAlarmAty.java

package com.mytest.myclock;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;

public class PlayAlarmAty extends Activity {

    private MediaPlayer player;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.alarm_music_play);

        player = MediaPlayer.create(this, R.raw.an_angel);
        player.start();

    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();

        finish();
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        player.stop();
        player.release();
    }
}

闹钟播放界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:text="@string/play_sound" />

</LinearLayout>

闹钟时间到,接收处理类AlarmReceiver.java

package com.mytest.myclock;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("AlarmReceiver.onReceive");

        AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

        manager.cancel(
                PendingIntent.getBroadcast(context, getResultCode(), new Intent(context, AlarmReceiver.class), 0));

        Intent it = new Intent(context, PlayAlarmAty.class);
        it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(it);
    }

}

AndroidMainfest.xml添加配置

        <receiver android:name=".AlarmReceiver"></receiver>
         <activity android:name="PlayAlarmAty" android:screenOrientation="portrait"></activity>

另:在res中添加音乐文件。

时间: 2024-08-29 19:44:27

android闹钟(五):实现闹钟功能的相关文章

android闹钟小案例之功能阐述

最近花了一个星期左右的时间做了一个小闹钟,现在回过头来进行总结下.刚开始接触这个案例,总体觉着没有太大的难度,都是一些基础知识的堆砌,可现实总比理想残酷啊,这几天下来,每天都会有意料之外的bug出现.在debug的过程中,深深体会到了百度一下和谷歌谷歌的用处,基本常见的问题都可以在这里得到提示甚至答案.这篇文章先来介绍下这个案例所实现的功能,接下来再用几遍文章记录所用到的知识点. 功能简介: 1.闹钟基本功能:和平时的闹钟一样,用户在界面选择闹钟响起的时间,到达所设定时间后执行相应的指定操作.

Android 编程之天气预报闹钟启动服务设置界面加载--4

真个application讲的已经差不多了,在说完这一篇之后,我会上传源码到资源,喜欢的可以下载和学习,今天主讲闹钟启动设置,设置页面的加载 在Android系统中,闹钟和唤醒功能都是由Alarm Manager Service控制并管理的.我们所熟悉的RTC闹钟以及定时器都和它有莫大的关系.为了便于称呼,我常常也把这个service简称为ALMS.         另外,ALMS还提供了一个AlarmManager辅助类.在实际的代码中,应用程序一般都是通过这个辅助类来和ALMS打交道的.就代

Android自定义View绘制闹钟

Android自定义View绘制闹钟 本文简单实现了一个闹钟,扩展View,Canvas绘制 效果如下: 代码如下: package com.gaofeng.mobile.clock_demo; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.gr

Android解决WebView的定位功能、视频全屏播放、下载功能、页面Url的处理、进度条处理

解决WebView的定位功能.视频全屏播放.下载功能.页面Url的处理.进度条处理 事先说明: 定位功能在安卓6.0需要用户手动确认权限后才能使用 若需在安卓6.0适配WebView的定位功能,则需要在WebView中手动增加用户权限访问 详细可百度安卓6.0权限管理系统,或者采用第三方封装好的权限管理类进行编写(如Bmob) 如果对内容不理解的话,可参考最后的整个类的代码 如果对BaseActivity这个抽象类不理解的话,可以查看下面一篇文章对BaseActivity的介绍 步骤一:webv

Android使用GridView实现日历功能(详细代码)

代码有点多,发个图先: 如果懒得往下看的,可以直接下载源码吧(0分的),最近一直有人要,由于时间太久了,懒得找出来整理,今天又看到有人要,正好没事就整理了一下 http://download.csdn.net/detail/onlyonecoder/6574379 布局文件: [html] view plaincopy <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:androi

Android ShareSDK快速实现分享功能

第一步 :获取ShareSDK 为了集成ShareSDK,您首先需要到ShareSDK官方网站注册并且创建应用,获得ShareSDK的Appkey,然后到SDK的下载页面下载SDK的压缩包,解压以后可以得到如下图的目录结构: ShareSDK在“ShareSDK for Android”目录下,此目录中的“Libs”包含“MainLibs”和“OnekeyShare” 分别是ShareSDK的核心库和“快捷分享”的源码库,说明文档也在“ShareSDK for Android”目录下,集成Sha

Android studio下增量升级功能的NDK开发

最近研究Android应用的增量升级功能,期间涉及到了NDK开发的内容,整理记录在此. 先说几个问题. 一.NDK开发就是JNI开发啊,卧槽我原来都不知道啊,一直以为是两个东西啊...... 二.关于开发环境,老的Eclipse版本要安装的工具比较多,什么NDK啊,cygwin啊什么,AS(Android studio首字母,以下皆以AS代替)就简单多了,直接装一个NDK就可以了.貌似AS从1.3版本就可以不装cygwin了,而我装的是2.0版本的,更不需要装.而且神奇的是,我安装NDK的时候没

Android第五期 - 更新自己的apk本地与网络两种方法

首先是本地: ParseXmlService部分: package com.szy.update; import java.io.InputStream; import java.util.HashMap; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element

Android 实现登录界面和功能实例

最近一个android小程序需要登录功能,我简单实现了一下.现在记录下来也当做个笔记,同时也希望可以相互学习.所以,如果我的代码有问题,还各位请提出来.多谢了! 下面,就简述一下此实例的主要内容: 输入用户名和密码 ,从本地文件userinfo.json中读取users.判断此用户名是否在users中,如果不在则加入users,每次退出Activity都使用AES算法加密users,然后保存到userinfo.json中.用户名下拉菜单是由PopupWindow + ListView 实现. 运

Android ListView条目全选功能,不用checkbox实现!

大家好,翻了翻以前的笔记,发现了一个我特别标记的功能,那就是ListView全选功能,顿时想起了我那个时候苦逼的生涯,由于我大学机械出身,大学毕业了都不知道什么叫代码,在58干了一段销售.实在是干不下去了,不干了就得在网上找工作,就喜欢干电脑相关的工作,有一天,一家培训机构给我打来电话让我去面试,我以为让我去工作那,谁知道是忽悠我去培训,我当然不可能花钱了,就直接回去了,想了几天,除了销售我真不知道干啥,咬咬牙,就花钱培训了.我擦,咋说这到了,不跟你们说了,还是写下面的这个功能吧,虽然很简单,但