10.通知

10.1.Toast通知

10.1.1.创建、发送通知

Context context = getApplicationContext();CharSequence text = "Hello toast!";int duration = Toast.LENGTH_SHORT;Toast toast = Toast.makeText(context, text, duration);toast.show();等价于Toast.makeText(context, text, duration).show();

10.1.2.设置Toast显示位置

默认是底部水平居中
我们可以使用方法toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);来设置
参数一:重力常数;参数二:x轴偏移;参数三:y轴偏移

10.1.3.创建一个自定义Toast

布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              android:id="@+id/toast_layout_root"//注意这里定义的ID              android:orientation="horizontal"              android:layout_width="fill_parent"              android:layout_height="fill_parent"              android:padding="8dp"              android:background="#DAAA"              >    <ImageView android:src="@drawable/droid"               android:layout_width="wrap_content"               android:layout_height="wrap_content"               android:layout_marginRight="8dp"               />    <TextView android:id="@+id/text"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:textColor="#FFF"              />LinearLayout>

代码使用我们自定义的布局

LayoutInflater inflater = getLayoutInflater();View layout = inflater.inflate(R.layout.custom_toast,                               (ViewGroup) findViewById(R.id.toast_layout_root));TextView text = (TextView) layout.findViewById(R.id.text);text.setText("This is a custom toast");Toast toast = new Toast(getApplicationContext());toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);toast.setDuration(Toast.LENGTH_LONG);toast.setView(layout);toast.show();

10.2.状态栏通知

一个通知可以提供多种操作。
1.当用户单击该通知时,我们可以打开一个Activity。
2.也可以将按钮添加到通知,可快速回复短信,关闭闹铃等(Android 4.1)。
3.如果你使用其他的动作按钮,你还必须使他们的功能在你的应用程序的活动中,查看更多 Handling compatibility

10.2.1正常视图的状态栏通知

Android核心基础-10.通知_第1张图片
高度:64dp
参数说明:
The callouts in the illustration refer to the following:

1.Content title(内容标题)
2.Large icon(大图标)
3.Content text(内容文本)
4.Content info(内容信息)
5.Small icon(小图标)
6.Time that the notification was issued. You can set an explicit value with setWhen(); if you don’t it defaults to the time that the system received the notification.(发出通知的时间。你可以用setwhen()显式值集;如果你不违约的时候,系统收到通知。)

10.2.2.大视图的状态栏通知

Android核心基础-10.通知_第2张图片
Android 4.1.抽屉被拉开时显示。
注意,大部分的视觉元素与正常的视图共享。唯一不同的是标注7号,正文区。每一个大的视图样式都以不同的方式设置该区域。可用的风格是:
大图片样式
正文区域包含一个位图多达256个dp在正文部分高。
大文本风格
在正文部分显示一个大文本块。
收件箱样式
在正文部分显示文本行。
所有的大视图样式也有以下内容选项,在正常视图中不可用:
大标题
允许您重写“正常”视图的内容标题,标题仅以“扩展视图”出现。
摘要文本
允许您在正文区域添加一行文本。
将大的视图样式应用到通知中描述的“大”视图样式中的“通知”。

10.2.3.创建状态栏通知

一个通知对象必须包含以下部分:
一个小图标,通过setSmallIcon()设置
一个标题,由setContentTitle()设置
详细的文本,由setContentText()设置
其他部分都是可选的。

创建一个普通视图

NotificationCompat.Builder mBuilder =        new NotificationCompat.Builder(this)        .setSmallIcon(R.drawable.notification_icon)        .setContentTitle("My notification")        .setContentText("Hello World!");// 创建一个明确的意图,链接至我们应用程序的AcitivityIntent resultIntent = new Intent(this, ResultActivity.class);// 创建一个堆栈生成器TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);//为意图添加回栈(但不是意图本身)stackBuilder.addParentStack(ResultActivity.class);// 将启动活动的意图添加到堆栈的顶部stackBuilder.addNextIntent(resultIntent);PendingIntent resultPendingIntent =        stackBuilder.getPendingIntent(            0,            PendingIntent.FLAG_UPDATE_CURRENT        );mBuilder.setContentIntent(resultPendingIntent);// 获取通知管理器NotificationManager mNotificationManager =    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);// 用管理器发送通知mNotificationManager.notify(mId, mBuilder.build());

创建一个大视图通知

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)    .setSmallIcon(R.drawable.notification_icon)    .setContentTitle("Event tracker")    .setContentText("Events received");NotificationCompat.InboxStyle inboxStyle =        new NotificationCompat.InboxStyle();String[] events = new String[6];// 设置“收件箱”式的“大”视图的标题inboxStyle.setBigContentTitle("Event tracker details:");...// 将事件移动到大视图for (int i=0; i < events.length; i++) {    inboxStyle.addLine(events[i]);}// 将大视图样式对象移动到通知对象中。mBuilder.setStyle(inBoxStyle);...// 发出通知。

更新通知

mNotificationManager =        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);// 给通知设置一个IDint notifyID = 1;mNotifyBuilder = new NotificationCompat.Builder(this)    .setContentTitle("New Message")    .setContentText("You've received new messages.")    .setSmallIcon(R.drawable.ic_notify_status)numMessages = 0;// 开启一个loop去处理数据,并更新通知。...    mNotifyBuilder.setContentText(currentText)        .setNumber(++numMessages);    // 因为持有唯一通知ID,通知将得到更新    mNotificationManager.notify(            notifyID,            mNotifyBuilder.build());...

移除通知
1.用户下拉通知栏点击清除
2.setAutoCancel()后,用户点击该条通知后,则该条通知消失。
3.cancel()指定ID的通知
4.cancelAll()清除全部通知

10.2.4.点击通知栏的一条消息启动Activity

创建正常PendingIntent意图
1.清单文件中

<activity    android:name=".MainActivity"    android:label="@string/app_name" >    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    intent-filter>activity><activity    android:name=".ResultActivity"    android:parentActivityName=".MainActivity">    <meta-data        android:name="android.support.PARENT_ACTIVITY"        android:value=".MainActivity"/>activity>

代码中

...Intent resultIntent = new Intent(this, ResultActivity.class);TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);// 添加一个父类(当点击通知弹出一个Activity,我们此时再按返回键要回到的Activity界面)stackBuilder.addParentStack(ResultActivity.class);// 添加一个意图到栈顶stackBuilder.addNextIntent(resultIntent);// 获得一个PendingIntentPendingIntent resultPendingIntent =        stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);...NotificationCompat.Builder builder = new NotificationCompat.Builder(this);builder.setContentIntent(resultPendingIntent);NotificationManager mNotificationManager =    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);mNotificationManager.notify(id, builder.build());

创建特定PendingIntent意图
清单文件中

<activity    android:name=".ResultActivity"...    android:launchMode="singleTask"    android:taskAffinity=""    android:excludeFromRecents="true">activity>...

代码中

// 创建一个通知生成器NotificationCompat.Builder builder = new NotificationCompat.Builder(this);// 创建一个意图Intent notifyIntent =        new Intent(new ComponentName(this, ResultActivity.class));// 设置意图启动在一个新的,空的堆栈中notifyIntent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);// 创建一个PendingIntentPendingIntent notifyIntent =        PendingIntent.getActivity(        this,        0,        notifyIntent        PendingIntent.FLAG_UPDATE_CURRENT);// 将PendingIntent绑定到通知中builder.setContentIntent(notifyIntent);// 创建一个通知管理器NotificationManager mNotificationManager =    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);// 用管理器发送通知mNotificationManager.notify(id, builder.build());
  • 创建通知
    • 通过构造函数创建: Notification(int icon, CharSequence tickerText, long when)
    • icon: 通知的图片资源ID
    • tickerText: 状态栏中显示的消息内容
    • when: 时间
  • 创建PendingIntent以供点击时发送
    • PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags)
    • context: 当前上下文
    • requestCode: 请求码
    • intent: 点击时要发送的意图
    • flags: 类型, PendingIntent中提供了常量选择
  • 设置通知点击事件
    • 调用Notification 对象方法: setLatestEventInfo(Context context, CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent)
    • context: 当前上下文
    • contentTitle: 标题
    • contentText: 内容
    • contentIntent: 点击时触发的意图
  • 设置通知点击后清除
    • 设置Notification 对象属性 n.flags = Notification.FLAG_AUTO_CANCEL;
  • 获取系统通知服务
    • NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE)
  • 发送消息
    • 调用Notification对象方法: notify(int id, Notification notification)

具体代码

Notification n = new Notification(R.drawable.qq, "下载完成", System.currentTimeMillis());PendingIntent pi = PendingIntent.getActivity(this, 100,  new Intent(this, ResultActivity.class), PendingIntent.FLAG_ONE_SHOT);n.setLatestEventInfo(this, "下载完成", "qq.exe下载完成", pi);n.flags = Notification.FLAG_AUTO_CANCEL;NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

10.2.4.在通知中显示进度

显示固定持续时间进度指示器

...mNotifyManager =        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);mBuilder = new NotificationCompat.Builder(this);mBuilder.setContentTitle("Picture Download")    .setContentText("Download in progress")    .setSmallIcon(R.drawable.ic_notification);// 在新线程中开启一个耗时操作new Thread(    new Runnable() {        @Override        public void run() {            int incr;            // 这个耗时操作执行20次            for (incr = 0; incr <= 100; incr+=5) {                    // 设置完成进度条的值                    mBuilder.setProgress(100, incr, false);                    // 第一次显示进度条                    mNotifyManager.notify(0, mBuilder.build());                        // 开启睡眠,模拟耗时操作                        try {                            // Sleep for 5 seconds                            Thread.sleep(5*1000);                        } catch (InterruptedException e) {                            Log.d(TAG, "sleep failure");                        }            }            // 当循环结束时,更新通知            mBuilder.setContentText("Download complete")            // 移除进度条                    .setProgress(0,0,false);            mNotifyManager.notify(ID, mBuilder.build());        }    }).start();

10.3.普通对话框

Android核心基础-10.通知_第3张图片

public void normal(View v) {    OnClickListener listener = new OnClickListener() {        public void onClick(DialogInterface dialog, int which) {            switch (which) { // 判断选了哪个按钮            case DialogInterface.BUTTON_POSITIVE: // 右边的                Toast.makeText(getApplicationContext(), "确定", Toast.LENGTH_SHORT).show();                break;            case DialogInterface.BUTTON_NEUTRAL: // 中间的                Toast.makeText(getApplicationContext(), "稍后", Toast.LENGTH_SHORT).show();                break;            case DialogInterface.BUTTON_NEGATIVE: // 左边的                Toast.makeText(getApplicationContext(), "取消", Toast.LENGTH_SHORT).show();                break;            }        }    };    new AlertDialog.Builder(this) // 下面方法返回值都是Builder, 可以连续调用            .setTitle("是否下载更新?") // 标题            .setMessage("1.速度更快\r\n2.更多功能\r\n3.修复上个版本的Bug") // 具体消息            .setCancelable(false) // 是否可取消            .setPositiveButton("确定", listener) // 右边按钮            .setNeutralButton("稍后", listener) // 中间按钮            .setNegativeButton("取消", listener) // 左边按钮            .show(); // 显示}

10.4.单选对话框

Android核心基础-10.通知_第4张图片

public void single(View v) {    final String[] items = { "Java", ".Net", "PHP", "网页平面设计", "iOS", "C++" };    OnClickListener listener = new OnClickListener() {        private int index;        public void onClick(DialogInterface dialog, int which) {            switch (which) {            case DialogInterface.BUTTON_POSITIVE:                Toast.makeText(getApplicationContext(), items[index], Toast.LENGTH_SHORT).show();                break;            default:                index = which;            }        }    };    new AlertDialog.Builder(this).setTitle("选择要学习的课程").setSingleChoiceItems(items, -1, listener) // 设置数据, 默认选项, 监听器            .setPositiveButton("确定", listener).show();}

10.5.多选对话框

Android核心基础-10.通知_第5张图片

public void multi(View v) {    final String[] items = { "抽烟", "喝酒", "烫头" };    final boolean[] checkedItems = { false, false, false };    OnMultiChoiceClickListener multiListener = new OnMultiChoiceClickListener() {        public void onClick(DialogInterface dialog, int which, boolean isChecked) {            System.out.println(items[which] + ": " + isChecked);        }    };    OnClickListener positiveListener = new OnClickListener() {        public void onClick(DialogInterface dialog, int which) {            StringBuilder sb = new StringBuilder();            for (int i = 0; i < checkedItems.length; i++) {                sb.append(checkedItems[i] ? items[i] + " " : "");            }            Toast.makeText(getApplicationContext(), sb, Toast.LENGTH_SHORT).show();        }    };    new AlertDialog.Builder(this).setTitle("请选择您的爱好").setMultiChoiceItems(items, checkedItems, multiListener).setPositiveButton("确定", positiveListener).show();}

10.6.进度对话框

Android核心基础-10.通知_第6张图片

public void progress(View v) {    final ProgressDialog dialog = new ProgressDialog(this);    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);    dialog.setTitle("正在下载, 请稍候...");    dialog.show();    dialog.setMax(100); // 最大刻度    new Thread() {        public void run() {            for (int i = 1; i <= 100; i++) {                dialog.setProgress(i); // 设置进度(可以在新线程中修改界面)                SystemClock.sleep(100);            }            dialog.dismiss(); // 销毁        }    }.start();    /*     * 带进度条的界面都可以在新线程中操作. 只要使用进度条, 一定是耗时操作. 耗时操作一定是在新线程中的. 进度条通常都是在新线程中使用     * 安卓已经替我们做了Handler的操作     *      * ProgressBar, SeekBar     */}

示例源码->百度网盘

更多相关文章

  1. Android 实现不同通知栏
  2. Android sqlite约束-视图-检查
  3. android 9.0 收到通知消息亮屏
  4. ANDROID L——Material Design详解(视图和阴影)
  5. Android23-视图坐标系以及MotionEvent事件
  6. [Android]ButterKnife-无尽之刃-绑定视图控件和事件的快速开发工
  7. [zz]android框架示意图
  8. android常驻通知栏点击事件
  9. Android 状态栏通知

随机推荐

  1. android之NDK(jni)开发笔记1——运行第一个
  2. 阿里路由框架ARouter简介
  3. Android 2020年最新保活方案 保活90% 已
  4. android实现ios形式的字体,实现各种自定义
  5. Android学习建议
  6. [Android Studio] Android Studio如何提
  7. 论“Android”在未来十年的发展
  8. Android React Native的使用细节问题
  9. Android 驱动之旅 第四章:在Android 系统
  10. Android(安卓)音视频深入 四 Android原生