目录
一.消息通知
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 自定义消息条
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):设置时间
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(); }}