android闹钟开发详解总结
弄android也有一段时间了,之前一直在看基础,后面想想或许做一个实例出来会明白的更多;
然后弄了一个android的闹钟,也在网上找了许多闹钟的实例,在开始的时候看着都不是很明白,再加上那些实例基本没什么注释,后面也发现了一些好的简单的实力,好了.废话不多说,现在来总结一下我的android闹钟吧.
界面:
做一个闹钟,先要弄好布局文件:mian.xml
需要用到的控件有 Button TextView DigitalClock AnalogClock
Button和TextView就不多说了, 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);
}
}
Activity和Task(栈)的关系
Task就像一个容器,而Activity就相当与填充这个容器的东西,第一个东西(Activity)则会处于最下面,最后添加的东西(Activity)则会在最低端。从Task中取出东西(Activity)则是从最顶端取出,也就是说最先取出的是最后添加的东西(Activity),一次类推,最后取出的是第一次添加的Activity,而Activity在Task中的顺序是可以控制的,那则在Activity跳转时用到Intent Flag
二、界面跳转和服务的启动都会用到Intent,现在介绍Intent Flag是关于Activity的跳转
Intent intent = new Intent(this,xxx.class);
//如果activity在task存在,拿到最顶端,不会启动新的Activity
intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
//如果activity在task存在,将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 Flag有20多种,以上只是介绍了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
我是新手,求大牛指教,谢谢.
更多相关文章
- Android实现长时间等待界面
- 45套精美的 ( Android, iPhone, iPad ) 手机界面设计素材和线框
- [置顶] Android界面布局的几种常用方式
- 动手学Android之三——第一个界面
- Android 的一个简单界面介绍
- android SharedPreference的简单使用(登陆界面记住密码)
- 一个没有停止的android闹钟,一旦开始就要把歌唱完 .
- Android学习笔记2---多界面切换