目录
一.消息通知
1.消息条通知
1.1 预定义的标准消息条
1.2 自定义消息条
1.3 普通消息条、指定位置消息条、自定义消息条实例
2.对话框通知
2.1 警告对话框-AlertDialog / 进度条对话框-ProgressDialog
2.2 日期/时间选择对话框-Date/TimePickerDialog / 自定义对话框
二.闹铃
3.1 创建一次性闹铃
3.2 创建重复闹铃
一.消息通知
- 用于通知用户事件的技术:
- 消息条通知(Toast):用于简短消息,不可交互
- 对话框通知(Dialog):用于显示进度栏 / 要求用户确认的短消息,可交互
1.消息条通知
1.1 预定义的标准消息条
- 使用预定义的标准消息条:显示单行信息,几秒钟后自动消失,用户不可交互
- 创建消息条的标准方法: android.widget.Toast.makeText(context, text, duration);
- Context:显示消息条的应用/活动
- text:要显示的消息
- Duration:显示消息的时间范围
- android.widget.Toast类的 show()方法:显示消息
- setGravity() 方法:定位消息条通知
- xOffset:以像素为单位的X坐标偏移量,yOffset以像素为单位的Y坐标偏移量
- Toast toast = Toast.makeText(getApplicationContext(),"Hi", Toast.LENGTH_LONG);
toast.setGravity(Gravity.BOTTOM|Gravity.LEFT, 0, 0);
toast.show();1.2 自定义消息条
- 布局文件中 创建消息条布局:
- 通过 java代码 动态添加消息属性
1.3 普通消息条、指定位置消息条、自定义消息条实例
- 区分:
- getLayoutInflater():获取布局文件,动态添加
- findViewById::获取布局文件中的单个组件
public class MainActivity extends Activity {
// 声明、获取组件,注册噢监听器...
class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.button1:
Toast.makeText(MainActivity.this,"普通的Toast",Toast.LENGTH_SHORT).show();
break;
case R.id.button2: // 水平/垂直方向:LEFT,RIGHT,CENTER / TOP,CENTER,BOTTOM
Toast t2=Toast.makeText(MainActivity.this,"指定位置的Toast", Toast.LENGTH_SHORT);
t2.setGravity(Gravity.LEFT|Gravity.BOTTOM, 80, 60);
t2.show();
break;
case R.id.button3:
makeMyToast("自定义的Toast",R.drawable.c);
break;
}}}
void makeMyToast(String text,int imageId){ // 自定义消息(文本,图片)
Toast t3=new Toast(MainActivity.this);
t3.setDuration(Toast.LENGTH_LONG); // 设置显示时间
t3.setGravity(Gravity.CENTER|Gravity.BOTTOM, 0, 0); // 设置显示位置
ViewGroup vg=(ViewGroup)findViewById(R.id.toastLayout); // 自定义消息布局文件
ImageView iv=(ImageView)v.findViewById(R.id.toastIV);
TextView tv=(TextView)v.findViewById(R.id.toastTV);
iv.setImageResource(imageId);
tv.setText(text);//设置该TextView的显示文本
//获取布局填充器,填充视图内容:把自定义消息布局文件 填充到主布局文件中
View v=getLayoutInflater().inflate(R.layout.custom_toast, vg);
t3.setView(v); //设置Toast的显示内容为你定义好的视图
t3.show();
}}
2.对话框通知
- 对话框(Dialog):在当前活动之上显示的一个小窗口
- 对话框用于:打断用户 / 执行与当前应用有关任务的通知
- Dialog类 充当创建所有对话框的 基类
- 要将 Dialog类 实例化,应使用以下子类之一:
- AlertDialog:警告对话框
- ProgressDialog:进度条对话框
- DatePickerDialog:日期选择对话框
- TimePickerDialog:时间选择对话框
2.1 警告对话框-AlertDialog / 进度条对话框-ProgressDialog
- 最灵活的对话实现方式,包括普通警告对话框、带列表的警告对话框
- 创建警报对话框,可使用 AlertDialog.Builder 子类:
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- 警报对话框三个按钮:Positive button(肯定)、Negative button(否定)、Neutral button(中立)
- setItems()方法:为警报对话框 添加列表视图
- 如果匿名类想访问 同方法中的另一变量,那么这个变量必须是 常量final
- 进度条对话框:ProgressDialog:AlertDialog类 的扩展,以 旋转环 / 水平进度条 的形式显示操作进度
- ProgressDialog.STYLE_HORIZONTAL:水平进度条
- ProgressDialog.STYLE_SPINNER:旋转环进度条
public class MainActivity extends Activity {
// 声明、查找组件,注册监听器...
class ButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
// 创建警告对话框
AlertDialog.Builder builder = new AlertDialog.Builder(
MainActivity.this);
builder.setTitle("退出确认"); // 设置对话框标题
// 设置对话框的图标:getResources().getDrawable获取静态资源
builder.setIcon(getResources().getDrawable(R.drawable.h));
builder.setMessage("您真的真的要退出程序吗?"); // 设置对话框显示的消息
// 设置确定按钮的显示文本和点击监听器
builder.setPositiveButton("是",
new DialogInterface.OnClickListener() { // 点击是后,执行的操作
@Override
public void onClick(DialogInterface arg0, int arg1) {
MainActivity.this.finish(); // 退出程序
}});
// 设置否定按钮的显示文本和点击监听器
builder.setNegativeButton("否",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
Toast.makeText(MainActivity.this,
"哈哈,我就知道你不会退出!", Toast.LENGTH_SHORT)
.show();
}});
builder.show(); // 弹出对话框
break;
case R.id.button2:
// 创建列表警告对话框
AlertDialog.Builder builder2 = new AlertDialog.Builder(
MainActivity.this);
builder2.setTitle("请选择一个国家");
// 如果一个匿名类想访问同一个方法中的另外一个变量,那么这个变量必须是常量final
final String[] countries = { "China", "USA", "UK", "Korea",
"Japan" };
// setItems()方法:设置对话框显示的列表和对应的监听器
builder2.setItems(countries,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
b2.setText(countries[which]);
}});
builder2.show();
break;
case R.id.button3:
pd1 = new ProgressDialog(MainActivity.this);
pd1.setTitle("下载进度");
pd1.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// STYLE_HORIZONTAL, STYLE_SPINNER
pd1.setMax(100); // 设置最大值,就是完成时的进度值
pd1.show();
ChildThread1 t1 = new ChildThread1(); // 单独开一个线程,更新进度条
t1.start();
break;
case R.id.button4:
pd2 = new ProgressDialog(MainActivity.this);
pd2.setTitle("下载提示");
pd2.setMessage("下载中......");
// 转圈的不确定进度的进度对话框,完成后一般退出对话框即可
pd2.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd2.show();
ChildThread2 t2 = new ChildThread2(); // 单独开一个线程,更新进度条
t2.start();
break;
}}}
class ChildThread1 extends Thread { // 更改进度条
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
try {
Thread.sleep(50); // 每隔 0.05s 更新一次
pd1.setProgress(i); // 更改进度条的进度值
} catch (InterruptedException e) {
Log.e("MainActivity", e.getMessage());
}}}}
class ChildThread2 extends Thread {
@Override
public void run() {
try {
Thread.sleep(3000); // 3s
pd2.dismiss(); // 退出对话框
} catch (InterruptedException e) {
}}}}
- 普通警告对话框,点击是退出应用,点击否出现消息条:
- 带列表的普通警告对话框,点击选项,重置选项文本信息:
- 水平 / 旋转环 进度条:
2.2 日期/时间选择对话框-Date/TimePickerDialog / 自定义对话框
- Calendar.getInstance():获取 Calendar实例,Calendar类,即日历类,是抽象类
- DatePickerDialog类-选择当前日期,TimePickerDialog类-选择当前时间,提供方法:
- getDatePicker():在对话框中检索日期选择器,返回日历视图
- onClick(DialogInterface dialog, int which):单击对话框按钮执行
- onDateChanged(DatePicker view, int year, int month, int day):日期改变执行
- onTimeChanged(TimePicker view, inthourOfDay, int minute):时间改变执行
- onRestoreInstanceState(Bundle savedInstanceState):从当前状态恢复对话框原始状态
- onSaveInstanceState():保存对话框状态
- updateDate(int year, int monthOfYear, int dayOfMonth):设置日期
- updateTime(inthourOfDay, intminutOfHour):设置时间
- 创建自定义对话框,需指定自己的对话框布局:
- 定义布局后,将 布局资源ID 传递到 setContentView(View)方法
public class MainActivity extends Activity { // 声明、获取组件,注册监听器... class MyListener implements OnClickListener{ @Override public void onClick(View v) { switch(v.getId()){ case R.id.tvDate: // 操作日期Calendar类(日历类) Calendar cal=Calendar.getInstance(); //获取Calendar实例 // 获取当前系统的年份、月份和日子 int YY=cal.get(Calendar.YEAR); int MM=cal.get(Calendar.MONTH); int DD=cal.get(Calendar.DAY_OF_MONTH); // 参数5个:上下文路径,监听器,年份,月份,日 DatePickerDialog d1=new DatePickerDialog(MainActivity.this,new OnDateSetListener(){ @Override // 当日期设定时,该方法自动被调用,并自动传入选中日期 public void onDateSet(DatePicker view, int year, int month, int day) { tvDate.setText(year+"-"+(month+1)+"-"+day); } },YY,MM,DD); d1.show(); break; case R.id.tvTime: Calendar cal2=Calendar.getInstance(); int hhs=cal2.get(Calendar.HOUR_OF_DAY); int mms=cal2.get(Calendar.MINUTE); // 5个参数:上下文,监听器,显示的小时,显示的分钟,是否使用24小时制 TimePickerDialog d2=new TimePickerDialog(MainActivity.this,new OnTimeSetListener(){ @Override //当时间设定的时候,自动调用该方法,并自动传入选中时间 public void onTimeSet(TimePicker view, int hourOfDay, int minute) { tvTime.setText(hourOfDay+":"+minute); }},hhs,mms,true); d2.show(); break; case R.id.tvCD: Dialog d3=new Dialog(MainActivity.this); // 自定义对话框,创建Dialog对象 d3.setContentView(R.layout.custom_dialog); // 设置自定义对话框布局资源id d3.setTitle("查找文本"); Button b=(Button)d3.findViewById(R.id.andy); // 对查找到的视图进行操作 b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this,"查找到内容",Toast.LENGTH_SHORT).show(); }}); d3.show(); break; }}}}
- 日期:
- 时间:
- 自定义:
二.闹铃
- 闹铃:独立服务,在预定时间触发意图,可以 一次触发 或 重复触发
- 可以在应用的作用域之外设置,用于触发应用的事件/操作,比如关机后依旧运行
- android.app.AlarmManager类 提供闹铃类型的常量,包括:
- RTC_WAKEUP:在指定时间唤醒设备,触发意图
- RTC:设备处于睡眠状态时触发意图,不在设备关闭时触发意图,定义闹铃的预定义常量
- INTERVAL_HALF_HOUR :闹铃所设置时间半小时后触发
- INTERVAL_HALF_DAY
- INTERVAL_FIFTEEN_MINUTES
- INTERVAL_DAY
- ELAPSED_REALTIME :根据设备睡眠的时长触发意图,不唤醒设备
- ELAPSED_REALTIME_WAKEUP :根据设备睡眠的时长触发意图,唤醒设备
- android.app.AlarmManager类 提供闹铃类型的方法,包括:
- cancel(PendingIntent task):取消闹铃,PendingIntent:待执行的意图(非立即执行)
- set(int type, long triggerAtTime, PendingIntenttask):设置一次性闹铃
- setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation):设置重复闹铃
- setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent task):设置重复闹铃
- setTime(long time):设置系统时间
- setTimeZone(String timeZone):设置时区
3.1 创建一次性闹铃
- set()方法 设置一次性闹铃,参数如下:
- type:四种可用类型之一,例如 RTC 或 ELAPSED_REALTIME
- triggerAtMillis:闹铃响起时的时间(以毫秒为单位)
- operation:闹铃响起时必须执行的操作
3.2 创建重复闹铃
- setRepeating()方法 设置重复闹铃,参数如下:
- type:四种可用类型之一,例如 RTC 或 ELAPSED_REALTIME
- triggerAtMillis:闹铃响起时的时间(以毫秒为单位)
- interval:重复多久再次启动闹铃
- operation:闹铃响起时必须执行的操
// MainActivity.java
public class MainActivity extends Activity {
AlarmManager manager;// 1:声明组件 闹铃任务都是由闹铃管理器管理的
// 注册监听器....
// getSystemService():获取指定的系统服务,返回对应的服务管理器
manager=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
}
class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.button1:
Calendar cal=Calendar.getInstance(); // 获取日历对象
int hh=cal.get(Calendar.HOUR_OF_DAY);
int mm=cal.get(Calendar.MINUTE);
TimePickerDialog td=new TimePickerDialog(MainActivity.this,new OnTimeSetListener(){
@Override
public void onTimeSet(TimePicker view, int hourOfDay,
int minute) {
Calendar newcal=Calendar.getInstance(); // Calendar实例 存储设定时间
newcal.set(Calendar.HOUR_OF_DAY, hourOfDay);
newcal.set(Calendar.MINUTE,minute);
newcal.set(Calendar.SECOND,0);
Intent intent=new Intent(MainActivity.this,AlarmActivity.class);
// Intent是立刻执行的意图,为了在指定的时刻执行
// 需要定义一个PendingIntent(待定的Intent)来封装Intent
// 四个参数:上下文,请求码(整数),要执行的intent,Flag标记(整数)
pi=PendingIntent.getActivity(MainActivity.this,0,intent,0);
// 设置一次性闹铃服务
long time=newcal.getTimeInMillis(); // 将时间转成毫秒表示
// 三个参数:闹铃类型,启动任务的时间,要执行的PendingIntent
// manager.set(AlarmManager.RTC_WAKEUP,time,pi);
// 设置重复的任务,第三个参数为重复的时间间隔
manager.setRepeating(AlarmManager.RTC_WAKEUP,
time, 1000*10, pi);
Toast.makeText(MainActivity.this,"闹钟设置成功", Toast.LENGTH_SHORT).show();
}
},hh,mm,true);
td.show();
break;
case R.id.button2:
manager.cancel(pi); // 取消闹铃任务
Toast.makeText(MainActivity.this,"取消闹钟成功", Toast.LENGTH_SHORT).show();
break;
}}}}
// Activity1.java
public class AlarmActivity extends Activity{
MediaPlayer player; // 声明音乐播放组件对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
player=MediaPlayer.create(AlarmActivity.this,R.raw.alarm1);
// player.setLooping(true); // 设置音乐循环
player.start();
AlertDialog.Builder dd=new AlertDialog.Builder(AlarmActivity.this);
dd.setTitle("闹钟提醒"); // 设置对话框标题
dd.setMessage("快起床啦狗比特!");
dd.setPositiveButton("我知道了",new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
player.stop(); //停止音乐
AlarmActivity.this.finish(); //结束当前活动
}});
dd.show();
}}