您的位置:首页 > 移动开发 > Android开发

Android闹钟

2015-08-13 19:20 435 查看
Android闹钟

在编写闹钟之前首先说一下Android中的广播机制,BroadCast是一种广泛应用的在应用程序之间传输信息的机制,例如在现实生活中人们听收音机,许许多多不同的广播电台发送特定频率的信号,当人们的收音机调成与广播电台频率相同时就可以收听广播内容了,Android中的广播机制差不多就是这个意思。

注:
1、在Android中我们所发送的广播内容是在一个Intent对象中的。

2、在Android中要想接收广播内容则需要注册一个BroadCastReceiver进行接收,只有发送广播的action与接收广播的action相同时才可以接收广播内容。

接下来开始编写闹钟代码:

1、首先我们要写一个闹钟响的时候给用户的提示信息的类,这个类继承自Activity

public class AlarmMessageActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new AlertDialog.Builder(this).setTitle("该起床了").setMessage("现在得时间是:" +
        new SimpleDateFormat("yyyy年MM月dd日mm分ss秒").format(new Date())).setPositiveButton("关闭", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                AlarmMessageActivity.this.finish();
            }
        }).show();
    }
}
2、接下来就是布局文件。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <!--
    定义一个时间选择器,和两个按钮
    -->
    <TimePicker
        android:id="@+id/tp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </TimePicker>
    <TextView
        android:id="@+id/text1"
        android:text="当前未设置闹钟"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/set"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="设置闹钟"/>
    <Button
        android:id="@+id/delet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="取消闹钟"
        />

</LinearLayout>
3、编写一个广播接收类

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) {
        Intent it = new Intent(context, AlarmMessageActivity.class);
        //Context中有一个startActivity方法,Activity继承自Context,
        //重载了startActivity方法。如果使用Activity的 startActivity
        // 方法,不会有任何限制,而如果使用Context的startActivity方法的话,就需要开启一个新的task.
        it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(it);
    }
}
4、编写MainActivity.java文件代码

package com.example.dell.broadcastproject;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

import java.util.Calendar;
import java.util.Timer;

public class MainActivity extends AppCompatActivity {
    //闹钟服务
    private AlarmManager alarm;
    private Button setAlarm, deletAlarm;
    private TextView text1;
    private TimePicker tp;

    //由于无法取得时间,所以设置两个整型值记录
    private int hourOfDay = 0;
    private int minute  = 0;
    //根据默认的时区实例化对象
    private Calendar calendar = Calendar.getInstance();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setAlarm = (Button)findViewById(R.id.set);
        deletAlarm = (Button)findViewById(R.id.delet);
        text1 = (TextView)findViewById(R.id.text1);
        tp = (TimePicker)findViewById(R.id.tp);

        tp.setIs24HourView(true);
        //取得闹钟服务
        alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        setAlarm.setOnClickListener(new OnSetClickListenerImpl());
        deletAlarm.setOnClickListener(new OnDeleteClickListenerImpl());
        tp.setOnTimeChangedListener(new OnTimeChangedListenerImpl());
    }

    private class OnTimeChangedListenerImpl implements TimePicker.OnTimeChangedListener {
        @Override
        public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
            //给calendar设置为当前的时间
            MainActivity.this.calendar.setTimeInMillis(System.currentTimeMillis());
            //设置小时数
            MainActivity.this.calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
            //设置分钟数
            MainActivity.this.calendar.set(Calendar.MINUTE, minute);
            //设置秒数,由于设置闹钟时大部分都不使用秒和毫秒所以这里设置为0
            MainActivity.this.calendar.set(Calendar.SECOND, 0);
            //设置毫秒数
            MainActivity.this.calendar.set(Calendar.MILLISECOND, 0);
            MainActivity.this.hourOfDay = hourOfDay;
            MainActivity.this.minute = minute;
        }
    }

    private class OnSetClickListenerImpl implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            //启动AlarmReceiver这个类
            Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
            //设置一个动作,就好比是在设置一个特有的频率,在后边配置AndroidManifest.xml文件时
            //再设置一个过滤器就把名字为"org.lxh.action.setalarm"的Intent给过滤出来了。
            intent.setAction("org.lxh.action.setalarm");
            //PendingIntent不是立刻执行某个动作,而是当满足一定条件或触发某个事件时才执行指定的操作
            PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
            /*
                参数解释:
                       第一个参数:表示闹钟类型。
                       第二个参数:表示闹钟的执行时间(闹钟什么时候响)。
                       第三个参数:表示闹钟响的时候该去干什么
                       AlarmManager.RTC_WAKEUP:硬件闹钟,当闹钟响时唤醒手机休眠
                       AlarmManager.ELAPSED_REALTIME_WAKEUP,真实时间流逝闹钟,当闹钟响时唤醒手机休眠
             */
            MainActivity.this.alarm.set(AlarmManager.RTC_WAKEUP,MainActivity.this.calendar.getTimeInMillis(),sender);
            //在文本组件上显示闹钟响起的时间
            MainActivity.this.text1.setText("闹钟响起的时间是:" + MainActivity.this.hourOfDay + " 点 " + MainActivity.this.minute  + " 分");
            //设置一个消息提示框
            Toast.makeText(MainActivity.this,"闹钟设置成功", Toast.LENGTH_LONG).show();
        }
    }
    private class OnDeleteClickListenerImpl implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            if (MainActivity.this.alarm != null) {

                Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
                intent.setAction("org.lxh.action.setalarm");
                PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
                //取消闹钟
                MainActivity.this.alarm.cancel(sender);
                MainActivity.this.text1.setText("您已成功删除当前闹钟");
                Toast.makeText(MainActivity.this,"闹钟删除成功", Toast.LENGTH_LONG).show();
            }
        }
    }
}
5、对AndroidManifest.xml文件进行配置,以下是配置代码。

<receiver android:name="AlarmReceiver"
            android:enabled="true"
            android:process=":remote"
            >
            //过滤出名字为org.lxh.action.setalarm的Intent
            //如若匹配则会调用AlarmReceiver.java中的onReceive()方法
            <intent-filter>
                <action android:name="org.lxh.action.setalarm"></action>
            </intent-filter>
        </receiver>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: