android Notification定义与应用
首先要明白一个概念:
Intent 与 PendingIntent 的区别:
Intent:是意图,即告诉系统我要干什么,然后做Intent应该做的事,而intent是消息的内容
PendingIntent 为Intent的包装,这里是启动Intent的描述,PendingIntent.getActivity 返回的PendingIntent表示,此PendingIntent实例中的Intent是用于启动 Activity 的Intent。PendingIntent.getActivity的参数依次为:Context,发送者的请求码(可以填0),用于系统发送的 Intent,标志位。
包装Intent,intent是我们直接使用startActivity,startService,senbBroadcast启动某项工作的内容,而某些时候我们并不能直接调用 startActivity,startService,senbBroadcast,而是系统或者程序达到某一条件才发送intent,例如下面要学习的Notification,当用户点击Notification之后,由系统发出一条activity的intent。如果我们不用某种方法告诉系统的话,系统是不知道是使用startActivity(),startService还是senbBroadcast...来启动intent的,因此需要PendingIntent,对intent进行包装,调用getActivity()方法。
前面我们说过,NotificationManager是所有Notification的大管家,它的主要职责是加入/移除Notification。
NotificationManager类
通过获取系统服务来获取该对象:
NotificationManager mNotificationManager = (NotificationManager)getSystemServic(Context.NOTIFICATION_SERVICE) ;
常用方法:
public void cancelAll() 移除所有通知 (只是针对当前Context下的Notification)
public void cancel(int id) 移除标记为id的通知 (只是针对当前Context下的所有Notification)
public voidnotify(String tag ,int id, Notification notification) 将通知加入状态栏, 标签为tag,标记为id
public void notify(int id, Notification notification) 将通知加入状态栏,,标记为id
一般来说, 一个Notification应该传送的消息包括:
1 、一个状态条图标
2、在拉伸的状态栏窗口中显示额外的信息和启动一个Application的Intent
3、闪灯或LED
4、电话震动
在状态栏(Status Bar)中,通知主要有两类(使用FLAG_标记,后面讲解到):
1、正在运行的事件
2、通知事件
Notification图解如下:
Notification类介绍:
常量:
//表示发送一个Notification的所携带的效果
DEFAULT_ALL 使用默认字段
DEFAULT_LIGHTS 默认闪光
DEFAULT_SOUND 默认声音(uri,指向路径)
DEFAULT_VIRATE 默认震动,后来得知需要添加震动权限VIBRATE: android.permission.VIBRATE
其中震动和闪光都需要在AndroidManifest.xml中添加权限
<!-- 添加操作闪光灯的权限 -->
<uses-permission android:name="android.permission.VIBRATE"/>
<!-- 添加操作震动的权限 -->
<uses-permission android:name="android.permission.FLASHLIGHT"/>
PS:以上的效果常量可以累加,即通过mNotifaction.defaults |=DEFAULT_SOUND (有些效果只能在真机上才有,比如震动)
//设置Flag位
FLAG_AUTO_CANCEL 该通知能被状态栏的清除按钮给清除掉
FLAG_NO_CLEAR 该通知不能被状态栏的清除按钮给清除掉
FLAG_ONGOING_EVENT 通知放置在正在运行
常用字段
contentView 通知在状态栏的显示View(自定义,具体请看下文) ,常与contentIntent配合使用,点击该通知后,
即触发contentIntent
contentIntent 设置PendingIntent对象,点击该通知时发送该Intent
flags 设置flag位,例如FLAG_NO_CLEAR等
defaults 添加效果
tickerText 显示在状态栏中的文字
when 发送此通知的时间戳
icon 设置图标
常用方法介绍:
void setLatestEventInfo(Context context , CharSequence contentTitle,CharSequence contentText,PendingIntent contentIntent)
功能: 显示在拉伸状态栏中的Notification属性,点击后将发送PendingIntent对象。
参数: context 上下文环境
contentTitle 状态栏中的大标题
contentText 状态栏中的小标题
contentIntent 点击后将发送PendingIntent对象
另外的就是Notification的几步不同构造方法了,其构造方法的参数含义如上,请参考SDK 。
注意,关于通知(Notification)的显示类型有两种:
第一种:使用默认的形式(效果图如上显示)。具体使用是为Notification对象设置setLatestEventInfo()方法(该方法内部创建
了默认的RemoteViews对象,因此为默认显示),否则程序会报异常 ;
第二种: 使用自定义的View(RemoteViews对象)显示(功能更加自由,强大),具体方法为设置Notification对象的
contentView 属性和contentIntent属性 ,此时不需要设置setLatestEventInfo()方法。具体使用方法如下:
第一种:例子:main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<Button android:id="@+id/showButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="showNotification"/>
<Button android:id="@+id/cancelButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="cancelNotification"/>
</LinearLayout>
Intent.FLAG_ACTIVITY_CLEAR_TOP :如果在当前Task中,有要启动的Activity,那么把该Acitivity之前的所有Activity都关掉,并把此Activity置前以避免创建Activity的实例
Intent.FLAG_ACTIVITY_NEW_TASK :系统会检查当前所有已创建的Task中是否有该要启动的Activity的Task,若有,则在该Task上创建Activity,若没有则新建具有该 Activity属性的Task,并在该新建的Task上创建Activity。更多请参见 “ (转载)Android下Affinities和Task ”
NotificationDemoActivity.java
package com.lp.ecjtu;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class NotificationDemoActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
private Context mContext;
private Button showButton,cancelButton;
private Notification mNotification;
private NotificationManager mNotificationManager;
private static final int NOTIFICATION_ID = 0x0001;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupViews();
}
private void setupViews() {
mContext = NotificationDemoActivity.this;
showButton = (Button) findViewById(R.id.showButton);
cancelButton = (Button) findViewById(R.id.cancelButton);
mNotification = new Notification(R.drawable.ic_launcher, "this is Notification", System.currentTimeMillis());
//将使用 默认的声音来提醒用户,添加震动,后来得知需要添加震动权限 : Virbate Permission
//mNotification.defaults = Notification.DEFAULT_SOUND;
//mNotification.defaults = Notification.DEFAULT_VIBRATE;
mNotification.defaults = Notification.DEFAULT_LIGHTS;
mNotificationManager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
showButton.setOnClickListener(this);
cancelButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v==showButton){
Intent intent = new Intent(mContext, NotificationDemoActivity.class);
//这里需要设置Intent.FLAG_ACTIVITY_NEW_TASK属性
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
PendingIntent mContentIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
//这里必需要用setLatestEventInfo(上下文,标题,内容,PendingIntent)不然会报错.
mNotification.setLatestEventInfo(mContext, "10000", "您的话费不足,请充值!", mContentIntent);
//这里发送通知,消息ID,通知对象
mNotificationManager.notify(NOTIFICATION_ID,mNotification);
}else if(v==cancelButton){
mNotificationManager.cancel(NOTIFICATION_ID);
}
}
}
别忘了添加震动的权限:
<!-- 添加操作闪光灯的权限 -->
<uses-permission android:name="android.permission.VIBRATE"/>
效果图:
第二种:自定义view
代码如下:
view.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<ImageView android:id="@+id/image" android:layout_width="wrap_content"
android:layout_height="fill_parent" />
<TextView android:id="@+id/text" android:layout_width="wrap_content"
android:layout_toRightOf="@+id/image"
android:layout_height="wrap_content" android:textColor="#000" />
<ProgressBar android:id="@+id/progress_horizontal"
style="?android:attr/progressBarStyleHorizontal"
android:layout_below="@+id/text"
android:layout_toRightOf="@+id/image"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:max="100" android:progress="50" android:secondaryProgress="75" />
</RelativeLayout >
java 代码
NotificationRomoteViewActivity.java
package com.lp.ecjtu;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.RemoteViews;
public class NotificationRomoteViewActivity extends Activity {
private Notification mNotification;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
showViewNotification();
}
private void showViewNotification() {
// TODO Auto-generated method stub
mNotification = new Notification(R.drawable.ic_launcher, "自定义View", System.currentTimeMillis()+10000);
//1.创建一个自定义布局
//2.在程序代码中使用RemoteViews的方法来定义image和text。然后把RemoteViews对象传到contentView字段
mNotification.flags = Notification.FLAG_INSISTENT;
RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.view);//自定义Notification
remoteViews.setImageViewResource(R.id.image, R.drawable.ic_launcher);
remoteViews.setTextViewText(R.id.text, "自定义View");
mNotification.contentView = remoteViews;
// 3、为Notification的contentIntent字段定义一个Intent(注意,使用自定义View不需要setLatestEventInfo()方法)
//点击启动setting
PendingIntent mPendingIntent = PendingIntent.getActivity(NotificationRomoteViewActivity.this,
0, new Intent("android.settings.SETTINGS"), 0);
mNotification.contentIntent = mPendingIntent;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, mNotification);
}
}
android Notification定义与应用的更多相关文章
- 3、android notification 详细用法
在 android 系统中,在应用程序可能会遇到几种情况需要通知用户,有的需要用户回应,有的则不需要,例如: * 当保存文件等事件完成,应该会出现一个小的消息,以确认保存成功. * 如果应用程序在后台 ...
- Android NOtification 使用(震动 闪屏 铃声)
一. Notification 简介 在 android 系统中,在应用程序可能会遇到几种情况需要通知用户,有的需要用户回应,有的则不需要,例如: * 当保存文件等事件完成,应该会出现一个小的消息,以 ...
- Android Notification通知详细解释
Android Notification通知具体解释 Notification: (一).简单介绍: 显示在手机状态栏的通知. Notification所代表的是一种具有全局效果的通 ...
- Android Notification通知简介
Android Notification通知简介 根据activity的生命周期,在activity不显示时,会执行onStop函数(比如按下home键),所以你在onStop函数(按退出键除外)里面 ...
- Android自己定义矩形及selector、shape的使用
[声明]转载请注明出处.此文出自指尖飞落的博客:http://blog.csdn.net/huntersnail --每天写一篇博客.每天做一点技术积累! Android自己定义矩形及selector ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- android notification 传值关键
android notification 传值关键在 onNewIntent方法里获取 @Override protected void onCreate(Bundle savedInstanceSt ...
- Android自己定义DataTimePicker(日期选择器)
Android自己定义DataTimePicker(日期选择器) 笔者有一段时间没有发表关于Android的文章了,关于Android自己定义组件笔者有好几篇想跟大家分享的,后期会记录在博客中.本篇 ...
随机推荐
- Nginx在嵌入式系统中的应用
-----------------本文转载自 http://blog.csdn.net/xteda/article/details/39708009 ------------------------- ...
- 安装新版本的mysql数据库
默认情况,在CentOS 6.8 下通过yum安装的是5.1.73版本,现在需求是安装5.7版本. -------------------------------------------------- ...
- 微信小程序视频地址
微信小程序视频系列教程完整版,课程中用到的源码附在帖子最后. [url=http://bbs.larkapp.com/forum.php?mod=viewthread&tid=5673][b] ...
- Java中构造函数执行顺序的问题
1, 先执行内部静态对象的构造函数,如果有多个按定义的先后顺序执行:而且静态类的构造函数只会被执行一次,只在其第一个对象创建时调用,即便是创建了同一个类的多个对象,例如main()函数里b1,b2创 ...
- 【img】 图片是怎么存储的
用ue 打开一张图片,动动手脚,出现卡碟的画面效果. 可不可以用C#来做一个图片编辑器? 怎么做?路线怎么走? 稍后揭晓答案 根据实际操作获取类一些基础知识: 1. 文件是二进制存储的,为了便于查看编 ...
- iOS开发应用学习笔记
一.iOS应用设计 1. 参考资料: 解读iPhone平台的一些优秀设计思路 iPhone App的特点及基本设计方法 Mobile UI design and Developer 2. 用户对iPh ...
- 深入理解用mysql_fetch_row()以数组的形式返回查询结果
同mysql_result()一样,mysql_fetch_row()也可以用来获取查询结果集,其区别在于函数的返回值不是一个字符串,而是一个数组.函数定义如下. 复制代码 代码如下: array m ...
- SQL对like 操作中的特殊字符处理方法
SQL对like 操作中的特殊字符处理方法: SQL Server查询过程中,单引号 ' 是特殊字符,所以在查询的时候要转换成双单引号 '' . 在like操作还有以下特殊字符:下划线_, ...
- Interview-Largest independent set in binary tree.
BT(binary tree), want to find the LIS(largest independent set) of the BT. LIS: if the current node i ...
- Unity3D 利用NGUI2.6.3做技能冷却的CD效果
转自http://blog.csdn.net/qqmcy/article/details/9469021 NGUI非常强大我们今天来学习一下,如何利用NGUI做技能冷却的CD效果.先导入NGUI的插件 ...