android也有一段时间了,之前一直在看基础,后面想想或许做一个实例出来会明白的更多;

然后弄了一个android的闹钟,也在网上找了许多闹钟的实例,在开始的时候看着都不是很明白,再加上那些实例基本没什么注释,后面也发现了一些好的简单的实力,好了.废话不多说,现在来总结一下我的android闹钟吧.

 

界面:

 

 

做一个闹钟,先要弄好布局文件:mian.xml

需要用到的控件有 Button  TextView  DigitalClock  AnalogClock

ButtonTextView就不多说了, DigitalClock是用于显示数字的时间的, AnalogClock是用于显示图表的时间,下面是main.xml的代码:

<?xmlversion="1.0"encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical"

    android:background="@drawable/black"

     >

 

    <AnalogClock

        android:id="@+id/analogClock"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"/>

 

    <DigitalClock

        android:gravity="center"

        android:id="@+id/dclock"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_x="30px"

        android:layout_y="32px"

        android:textSize="55sp"/>

 

    <LinearLayout

        xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

 

        <TextView

            android:id="@+id/textview2"

            android:layout_width="160dp"

            android:layout_height="wrap_content"

            android:gravity="right"

            android:text="起床闹钟设置为:"/>

 

        <TextView

            android:id="@+id/textview1"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:gravity="center_vertical"

            android:text="@string/hello"/>

 

    LinearLayout>

   

        <LinearLayout

        xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

 

    <Button

        android:gravity="center"

        android:layout_weight="1"

        android:id="@+id/setclock"

        android:layout_width="wrap_content"

        android:layout_height="fill_parent"

        android:text="设置闹钟"

        android:textSize="18sp"

       

         />

 

    <Button

        android:gravity="center"

        android:layout_weight="1"

        android:id="@+id/unsetclock"

        android:layout_width="wrap_content"

        android:layout_height="fill_parent"

        android:text="取消闹钟"

        android:textSize="18sp"/>

LinearLayout>

下面是可以重复的闹钟:

<LinearLayout

        xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

 

        <TextView

            android:id="@+id/textview3"

            android:layout_width="160dp"

            android:layout_height="wrap_content"

            android:gravity="right"

            android:text="重复闹钟设置为:"/>

 

        <TextView

            android:id="@+id/textview4"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:gravity="center_vertical"

            android:text="@string/hello"/>

 

    LinearLayout>

   

        <LinearLayout

        xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

 

    <Button

        android:gravity="center"

        android:layout_weight="1"

        android:id="@+id/setclocks"

        android:layout_width="wrap_content"

        android:layout_height="fill_parent"

        android:text="设置闹钟"

        android:textSize="18sp"

       

         />

 

    <Button

        android:gravity="center"

        android:layout_weight="1"

        android:id="@+id/unsetclocks"

        android:layout_width="wrap_content"

        android:layout_height="fill_parent"

        android:text="取消闹钟"

        android:textSize="18sp"/>

LinearLayout>

 

LinearLayout>

 

 

 

然后是MainActivity.java文件

 

定义Button  TextView,并实例化

private TextViewtextView;

private Buttonsetbtn,unsetbtn

textView = (TextView)findViewById(R.id.textview1);

    setbtn = (Button)findViewById(R.id.setclock);

unsetbtn = (Button)findViewById(R.id.unsetclock);

然后设置按钮点击事件

setbtn.setOnClickListener(new OnClickListener() {

        

         @Override

         publicvoid onClick(View v) {

            //取得按下按钮的时间作为TimePickerDialog的默认值

            c.setTimeInMillis(System.currentTimeMillis());

            //定义获取时间

            int mHour =c.get(Calendar.HOUR_OF_DAY);

            int mMinute =c.get(Calendar.MINUTE);

            //跳出TimePickerDialog来设定时间

            new TimePickerDialog(MainActivity.this,

                   new TimePickerDialog.OnTimeSetListener() {

                      @Override

                      publicvoid onTimeSet(TimePicker view,int hourOfDay,int minute) {

                         //取得设定后的时间秒跟毫秒设为0

   c.setTimeInMillis(System.currentTimeMillis());

                         c.set(Calendar.HOUR_OF_DAY, hourOfDay);

                         c.set(Calendar.MINUTE, minute);

                         c.set(Calendar.SECOND, 0);

                         c.set(Calendar.MILLISECOND, 0);

                         //闹钟设定时间到时要执行CallAlarm.class

                         Intent intent  =new Intent(MainActivity.this,CallAlarm.class);

                         PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this,1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

                         //获取AlarmManager

                         //AlarmManager.RTC_WAKEUP设定服务在系统休眠时同样会执行

                         //

                         AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);

                         //set()设定的PendingIntent只会执行一次

                         am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),sender);

                         //显示设定的闹钟时间

                         String tmpS = format(hourOfDay)+":"+ format(minute);

                         textView.setText(tmpS);

                         //toas显示设定的时间

                         Toast.makeText(MainActivity.this,"设定的时间为:"+tmpS, Toast.LENGTH_LONG).show();

                      }

                   },mHour, mMinute,true).show();

            }

      });

//取消闹钟

       

        unsetbtn.setOnClickListener(new OnClickListener() {

         @Override

         publicvoid onClick(View v) {

            Intent intent = new  Intent (MainActivity.this,CallAlarm.class);

            PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);

            //AlarmManager中移除

            AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);

            am.cancel(sender);

            textView.setText("当前没有设置闹钟!");

            //Toast提示已删除设定,并更新显示的闹钟时间

            Toast.makeText(MainActivity.this,"闹钟已经取消",Toast.LENGTH_LONG).show();

         }

      });

 

在这里还有一个自定义的方法

   private String format(int x)

    {

      String s = "" + x;

      if (s.length() == 1)

        s = "0" + s;

      return s;

}

 

这个方法是把获取到的时间格式一下,就是当获取到的时间是7:1的时候,经过这个方法时间显示为 07:01

 

 

接下来就是CallAlarm.java,当闹钟时间到后,就会跳转到这个类下,这个类继承BroadcastReceiver; ( BroadcastReceiver也就是广播接收者的意思,顾名思义,它就是用来接收来自系统和应用中的广播。)

在这个类中并不会弹出什么界面提示我们在这里接受到了闹钟的广播后,可以让他转到一个界面提示的类中(Alarmalert.java)

CallAlarm.java代码

 

package cn.nict.clock.activity;

 

import android.R.integer;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.Bundle;

 

public class CallAlarm extends BroadcastReceiver {

 

      @Override

      public void onReceive(Context context, Intent intent) {

             // TODO Auto-generated method stub

 

             Intent i= new Intent(context,Alarmalert.class);

             //默认的跳转类型,Activity放到一个新的Task

             i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

             context.startActivity(i);

             }

}

ActivityTask()的关系
  Task就像一个容器,而Activity就相当与填充这个容器的东西,第一个东西Activity)则会处于最下面,最后添加的东西(Activity)则会在最低端。从Task中取出东西(Activity)则是从最顶端取出,也就是说最先取出的是最后添加的东西(Activity),一次类推,最后取出的是第一次添加的Activity,而ActivityTask中的顺序是可以控制的,那则在Activity跳转时用到Intent Flag
  二、界面跳转和服务的启动都会用到Intent,现在介绍Intent Flag是关于Activity的跳转
  Intent intent = new Intent(this,xxx.class);
  //如果activitytask存在,拿到最顶端,不会启动新的Activity
  intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
  //如果activitytask存在,将Activity之上的所有Activity结束掉
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  //默认的跳转类型,Activity放到一个新的Task
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  //如果Activity已经运行到了Task,再次跳转不会在运行这个Activity
  intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
  Intent Flag20多种,以上只是介绍了4

 

 

Alarmalert.java,只是一个显示提示闹钟画面,用户关闭提示

 

package cn.nict.clock.activity;

 

 

import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.content.Intent;

import android.os.Bundle;

 

public class Alarmalert extends Activity {

 

             protected void onCreate(Bundle savedInstanceState) {

             // TODO Auto-generated method stub

             super.onCreate(savedInstanceState);            

             //闹钟显示画面

             new AlertDialog.Builder(Alarmalert.this).setTitle("闹钟响了!!").setMessage("起床啦!!")

             .setPositiveButton("关闭闹钟", new DialogInterface.OnClickListener() {

                   

                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                           // TODO Auto-generated method stub

Alarmalert.this.finish();

                    }

             }).show();

      }

}

 

这样一个基本的闹钟demo就完成了

 

 

然后经过测试的一段时间,发现在退出闹钟后再进入闹钟,会发现之前闹钟设置的时间不在了,在这里,我们要把他显示出来

 

MainActivity.java中添加代码:

private static final StringTEMP_1="temp_1";首先声明一个常量

然后在onCreate方法中

 

//获取SharedPreferences

        SharedPreferences per = getSharedPreferences(TEMP_1,MODE_WORLD_READABLE);

        //得到text内容

        String text_1 =per.getString("text_1","");

        String text_2 =per.getString("text_2","");

        //text中显示内容

        textView.setText(text_1);

        textView1.setText(text_2);

 

最后覆盖onStop方法

   protectedvoid onStop() {

      //TODO Auto-generated method stub

      super.onStop();

      //获取编译器

      SharedPreferences.Editor editor =

            getSharedPreferences(TEMP_1,MODE_WORLD_WRITEABLE).edit();

      //text内容添加到编译器

      editor.putString("text_1",textView.getText().toString());

      editor.putString("text_2",textView1.getText().toString());

      //提交编辑内容

      editor.commit();

   }

 

这样当我们返回到其他界面再进入闹钟后会发现之前设置的闹钟时间就显示出来了

 

 

最后是在AndroidManifest.xml下对服务进行注册

 

       

        <receiver

            android:name=".CallAlarm"

            >receiver>

 

".Alarmalert" android:label="@string/app_name">

 

 

 源码地址:

http://download.csdn.net/detail/lb_llc/4443492

 

 

我是新手,求大牛指教,谢谢.

更多相关文章

  1. Android实现长时间等待界面
  2. 45套精美的 ( Android, iPhone, iPad ) 手机界面设计素材和线框
  3. [置顶] Android界面布局的几种常用方式
  4. 动手学Android之三——第一个界面
  5. Android 的一个简单界面介绍
  6. android SharedPreference的简单使用(登陆界面记住密码)
  7. 一个没有停止的android闹钟,一旦开始就要把歌唱完 .
  8. Android学习笔记2---多界面切换

随机推荐

  1. android 控件布局(顶部、底部......) 留
  2. 在Android中创建和使用数据库
  3. Android防止内存溢出浅析
  4. Android JNI 机制
  5. Android 自定义URL Scheme
  6. fanfou(饭否) android客户端 代码学习3
  7. 学习Android(安卓)Opengles 做游戏引擎笔
  8. Google Android 2.0初期版本亮相 支持手
  9. Android之——史上最简单最酷炫的3D图片
  10. Android UI学习总结