Android常用的反馈系统状态信息的方式主要有三种

  1. Toast提醒
  2. 通知栏提醒
  3. 对话框提醒

三种提醒分别适用于页面的提示、系统交互事件的通知和非常重要的提醒;

一、Toast

        Toast toast = Toast.makeText(MainActivity.this, "Toast 通知", Toast.LENGTH_SHORT);
toast.show();

Toast提醒最最简单方便的,默认情况下Toast显示在Activity下文水平居中,不过也可以通过代码设置为显示在其他位置

        toast.setGravity(Gravity.CENTER, 0, 0);

如果普通的文本无法满足要求,还可以设置自定义的View

        toast.setView(view);

二、Notification
  Notification更适用于交互事件的通知,常用于短信、即时消息、下载、外围设备的状态变化场景,支持文字显示、振动、三色灯、振铃音等多种提示形式,默认情况下,Notification只显示消息标题\消息内容\时间三项;

Android提供了一个Notification管理器NotificationManager,我们可以通过NotificationManager来控制一个Notification的显示与消除;

1。快速显示Notification

    public void showNotification() {
NotificationManager notiManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent = new Intent(LoginActivity.this, LoginActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(
LoginActivity.this, 0, intent, 0); // contentIntent
Notification noti = new Notification();
noti.icon = R.drawable.ic_launcher; // 通知的图标
noti.tickerText = "tickerText"; // 在通知显示前,在手机状态栏会有一个快速的通知,
noti.flags = Notification.FLAG_AUTO_CANCEL;// 设置通知被点击后自动取消
noti.setLatestEventInfo(this, "Title", "Notification Content",
contentIntent);
// 指定notification的Context对象,标题,内容,以及点击对应的contentIntent
notiManager.notify(12, noti);
}

2。上面的代码快速的显示了一个Notification,我们还可以对Notification进行一些个性化的设定,比如指定提示音,震动方式等;

        noti.defaults = Notification.DEFAULT_SOUND;// 使用默认的提示声音
noti.defaults |= Notification.DEFAULT_VIBRATE;// 添加默认震动方式

除了使用默认的震动方式,还可以自定义震动方式,自定义提示声音等;

>>1.自定义振动方式:

        Notification noti = new Notification();
noti.vibrate = new long[] { 0, 700, 500, 1000 }; // 延迟0秒,振动0.7秒,延迟0.5秒,再振动1秒

>>2.三色灯

        noti.flags |= Notification.FLAG_SHOW_LIGHTS; // 设置标志位为FLAG_SHOW_LIGHTS之后才能显示三色灯,如果设置为默认的话:DEFAULTS_LIGHTS;
noti.ledARGB = Color.parseColor("#00000000");
noti.ledOffMS = 300;
noti.ledOnMS = 300;

>>3.铃声提醒

        noti.sound = Uri.parse("filepath");
noti.defaults |= Notification.DEFAULT_SOUND; // 默认铃声

>>4.提醒标志位

FLAG_SHOW_LIGHTS //三色灯
FLAG_ONGOING_EVENT //发起事件
FLAG_INSISTENT //铃声将持续到notification取消或notificaton窗口打开
FLAG_ONLT_ALERT_ONCE //发起notification后,铃声或振动只执行一次
FLAG_AUTO_CALCEL //单击后自动消失
FLAG_NO_CLEAR //只有全部清除时,notification都会被清除
FLAG_FOREGROUND_SERVICE //表示正在运行的服务

>>5.针对意图的包装对象,为了使Notification能够响应点击事件,需要设置notification的contentIntent对象

            Intent intent = new Intent(this.getApplicationContext(),this.getClass());
// 设置Intent.FLAG_ACTIVITY_NEW_TASK
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0); // 生成PendingIntent对象

3。清除Notification

清除Notification有两种方式

>>1.通过NotificationManager来清除

notiManager.cancel(12); // 传入Notification显示时的id

>>2.通过Intent来清除

在执行清除Notification操作时,通过设计notification的deleteIntent变量可以响应这个事件;

            Notification noti = new Notification();
Intent deleteIntent = new Intent();
deleteIntent.setClass(LoginActivity.this, this.getClass());
deleteIntent.setAction(Intent.ACTION_DELETE);
noti.deleteIntent = PendingIntent.getBroadcast(
getApplicationContext(), 0, deleteIntent, 0);
notiManger.notify(12, noti); // 同样需要传入Notification显示时的id

为了响应紧急事件(如来电),需要设置Notification的fullScreenIntent变量

        Notification noti = new Notification();
Intent deleteIntent = new Intent();
deleteIntent.setClass(getApplicationContext(), null);
deleteIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
noti.fullScreenIntent = PendingIntent.getActivity(getApplicationContext(), 0, deleteIntent, 0);

4。上面所说的是最简单的Notification,有时候我们会看到一些各式各样布局的Notification,它其实是通过RemoteViews来实现的;下面是模仿下载文件的一个例子;

>>1.定义一个layout,里面定义了notification的显示界面;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="64dp"
android:orientation="horizontal" > <ImageView
android:id="@+id/noti_iv"
android:layout_width="64dp"
android:layout_height="match_parent"
android:scaleType="center" /> <ProgressBar
android:id="@+id/noti_pb"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="20.0dip"
android:layout_marginRight="20.0dip" /> </LinearLayout>

在这个xml文件中,定义了一个ImageView和ProgressBar,分别用来显示notification的图标和下载进度;

>>2.编写Java代码实现

public class LoginActivity extends Activity {
String tag = "LoginActivity";
private int progress = 0;
private Notification noti;
private NotificationManager notiManger;
private Handler handler; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_logion);
notiManger = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
progress += 5;
getNotification(LoginActivity.this, progress);
notiManger.notify(1024, noti);
if (progress == 100) {
notiManger.cancel(1024);
return;
}
sendEmptyMessageDelayed(0, 1000);
}
};handler.sendEmptyMessageDelayed(0, 2000);
}    private Notification getNotification(Context context, int progress) {
if (noti == null) {
noti = new Notification();
noti.icon = R.drawable.ic_launcher;
noti.tickerText = "正在下载新版本...";
}
noti.flags = Notification.FLAG_NO_CLEAR; // 设置Notification为不可清除 // 指定个性化视图
RemoteViews rv = new RemoteViews(context.getPackageName(),
R.layout.app_update_noti);
rv.setImageViewResource(R.id.noti_iv, R.drawable.ic_launcher); // 设置icon
rv.setProgressBar(R.id.noti_pb, 100, progress, false); // 设置progressbar进度
Intent intent = new Intent(context, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
intent, PendingIntent.FLAG_CANCEL_CURRENT);
noti.contentView = rv;
// 指定内容意图
noti.contentIntent = contentIntent;
return noti;
}
}

通过上面的代码,就可以看到一个在通知栏不断更新进度的通知;

主要有两点需要注意,一是添加一个为 Notification.FLAG_NO_CLEAR 的 flags ,二是指定notification#contentView为一个RemoteViews;

三、对话框提醒

Android 通知机制 Toast和Notification的更多相关文章

  1. Android应用程序组件Content Provider的共享数据更新通知机制分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6985171 在Android系统中,应用程序组 ...

  2. Android中的消息通知(NotificationManager和Notification)

    下面来谈谈notification,这个notification一般用在电话,短 信,邮件,闹钟铃声,在手机的状态栏上就会出现一个小图标,提示用户处理这个通知,这时手从上方滑动状态栏就可以展开并处理这 ...

  3. Android 通知(Notification)

    1.介绍 2.常用属性 3.java后台代码 package com.lucky.test30notification; import android.app.Notification; import ...

  4. [iOS基础控件 - 6.10] Notification 通知机制

    A.定义      iOS程序都有一个NSNotificationCenter的单例对象,用来负责发布不同对象之间的通知      任何对象都能够在NSNotificationCenter发布通知,发 ...

  5. Android开发之漫漫长途 ⅥI——Android消息机制(Looper Handler MessageQueue Message)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  6. Android开发之漫漫长途 Ⅶ——Android消息机制(Looper Handler MessageQueue Message)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  7. Binder对象死亡通知机制

    本文參考<Android系统源码情景分析>,作者罗升阳. 一.Binder库(libbinder)代码:        ~/Android/frameworks/base/libs/bin ...

  8. Android随笔之——Android广播机制Broadcast详解

    在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理.这个广播跟我们传统意义中的电台广播有些相似之处.之所以叫做广播,就 ...

  9. Android广播机制的深入学习

    部分内容转载自http://www.cnblogs.com/lwbqqyumidi/p/4168017.html 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者 ...

随机推荐

  1. Ruby数据类型

    数字类型 书写整数时,可以根据需要在整数之间任意加入下划线而不会影响数字的值 a=123_45_78 puts a # => 12345678 to_i 截掉小数点之后的数字取整 内置Math模 ...

  2. mysql索引 b+树

    1.B+树基本概念 B+树的语言定义比较复杂,简单的说是为磁盘存取设计的平衡二叉树 网上经典图,黄色p1 p2 p3代表指针,蓝色的代表磁盘,里面包含数据项,第一层17,35,p1就代表小于17的,p ...

  3. 【WXS数据类型】RegExp

    生成 regexp 对象需要使用 getRegExp函数,注意与JS的使用方法不同( new RegExp(pattern,modifiers);) 原型:getRegExp(pattern, mod ...

  4. git 跟踪分支 远程跟踪分支 学习笔记

    远程跟踪分支相当于一个只读仓库指针,从服务器上获取数据,不可以被本地直接修改. 跟踪分支相当于一个本地指针   用于项目更新和迭代. 1跟踪分支  (tracking  branch)   逻辑示意图 ...

  5. (python)leetcode刷题笔记04 Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of size m and n respectiv ...

  6. JDK源码分析:Integer.java部分源码解析

    1)声明部: public final class Integer extends Number implements Comparable<Integer> extends Number ...

  7. [Clr via C#读书笔记]Cp15枚举和位标识

    Cp15枚举和位标识 枚举类型 本质是结构,符号名称-值:好处显而易见:System.Enum;值类型: 编译的时候,符号会转换为常量字段: 枚举支持很多方法和成员: 位标识bit flag 判断和设 ...

  8. truffle运行特殊 无法找到module的处理方法

    https://blog.csdn.net/SnWJy/article/details/80549227 错误描述: ​ truffle项目根目录执行truffle compile时,报错'modul ...

  9. [leetcode-718-Maximum Length of Repeated Subarray]

    Given two integer arrays A and B, return the maximum length of an subarray that appears in both arra ...

  10. nodejs笔记--与MongoDB的交互篇(七)

    原文地址:http://www.cnblogs.com/zhongweiv/p/node_mongodb.html 目录 简介 MongoDB安装(windows) MongoDB基本语法和操作入门( ...