转载来自:http://blog.csdn.net/zengshuqin/article/details/7169616
使用Notifaction和NotifactionManager的目的
目的:Broadcast Receiver组件并没有提供可视化界面来显示广播信息,而Notifaction和NotifactionManager可以实现可视化的信息显示,通过它们可以显示广播信息的内容以及图标和震动等信息(在状态栏上)
具体步骤:
1)获得系统级的服务Notification Manager,调用getSystemService()方法实现
- String service = NOTIFICATION_SERVICE;
- nm=(NotificationManager)getSystemService(service);
2)然后实例化Notification,设置其属性(要显示的),
- //实例化Notification
- n = new Notification();
- //设置显示图标,该图标会在状态状态栏显示
- int icon = n.icon=R.drawable.notification;
- //设置显示提示信息,该信息会在状态栏显示
- String tickerText="Test Notification";
- //显示时间
- long when = System.currentTimeMillis();
- n.icon=icon;
- n.tickerText=tickerText;
- n.when=when;
当然也可以通过
- Notification n1 = new Notification(icon,tickerText,when);
此外,设置视图中图标和时间可以通过:
- Intent intent = new Intent(MainActivity.this,MainActivity.class);
3)通过Notification Manager发出通知
- //实例化intent
- Intent intent = new Intent(MainActivity.this,MainActivity.class);
- //获取pendingIntent
- PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
- //设置事件信息
- n.setLatestEventInfo(MainActivity.this, "My Title", "My Content", pi);
- //发出通知
- nm.notify(ID,n);
具体的代码,MainActivity,java
- package com.ex;
- import android.app.Activity;
- import android.app.Notification;
- import android.app.NotificationManager;
- import android.app.PendingIntent;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class MainActivity extends Activity {
- private Button btn_send,btn_cancel;
- //声明Notifaction
- private Notification n;
- //声明NotificationManager
- private NotificationManager nm;
- //Notification标识ID
- private static final int ID = 1;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //实例化两个按钮
- btn_send=(Button)findViewById(R.id.btnsend);
- btn_cancel=(Button)findViewById(R.id.btncancel);
- //获得NotifactionManager实例
- String service = NOTIFICATION_SERVICE;
- nm=(NotificationManager)getSystemService(service);
- //实例化Notification
- n = new Notification();
- //设置显示图标,该图标会在状态状态栏显示
- int icon = n.icon=R.drawable.notification;
- //设置显示提示信息,该信息会在状态栏显示
- String tickerText="Test Notification";
- //显示时间
- long when = System.currentTimeMillis();
- n.icon=icon;
- n.tickerText=tickerText;
- n.when=when;
- //为图标添加监听器
- btn_send.setOnClickListener(new OnClickListener(){
- @Override
- public void onClick(View v) {
- //实例化intent
- Intent intent = new Intent(MainActivity.this,MainActivity.class);
- //获取pendingIntent
- PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
- //设置事件信息
- n.setLatestEventInfo(MainActivity.this, "My Title", "My Content", pi);
- //发出通知
- nm.notify(ID,n);
- }});
- btn_cancel.setOnClickListener(new OnClickListener(){
- @Override
- public void onClick(View v) {
- nm.cancel(ID);
- }});
- }
- }
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="测试Notifaction"
- />
- <Button
- android:id="@+id/btnsend"
- android:text="发出通知"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- ></Button>
- <Button
- android:id="@+id/btncancel"
- android:text="取消通知"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
- </LinearLayout>
效果:
点击发出通知后状态栏的显示如
取消通知按钮
----------------------------------------------------------------------------------------------------------------------
pendingIntent详解
PendingIntent用于描述Intent及其最终的行为.
你可以通过
getActivity(
Context context, int requestCode,
Intent intent, int flags)
系列方法从系统取得一个
用于启动一个Activity的PendingIntent对象
,
可以通过
getService(
Context context, int requestCode,
Intent intent, int flags)
方法从系统取得一个
用于启动一个Service的PendingIntent对象
可以通过
getBroadcast(
Context context, int requestCode,
Intent intent, int flags)
方法从系统取
得一个用于向BroadcastReceiver的Intent广播的PendingIntent对象
返回的PendingIntent可以递交给别的应用程序,然后继续处理。这里的话你可以稍后才处理PendingIntent中描述的Intent及其最终行为。
当你把
PendingIntent
递交给别的程序进行处理时,PendingIntent仍然拥有PendingIntent原程序所拥有的权限(with the same permissions and identity).
当你从系统取得一个PendingIntent时,一定要非常小心才行。比如,通常,如果Intent目的地是你自己的component(
Activity
/
Service/BroadcastReceiver
)的话,你最好采用在Intent中显示指定目的component名字的方式,以确保Intent最终能发到目的,否则Intent最后可能不知道发到哪里了
。一个
PendingIntent
就是Android系统中的一个token(节点,这个应该是Linux或C\C++用语)的一个对象引用,它描述了一些将用于retrieve的数据(这里,这些数据描述了Intent及其最终的行为)。
这就意味着即使PendingIntent原进程结束了的话,
PendingIntent
本身仍然还存在,可在其他进程(PendingIntent被递交到的其他程序)中继续使用.
如果我在从系统中提取一个
PendingIntent
的,而系统中有一个和你描述的
PendingIntent
对等的
PendingInent
, 那么系统会直接返回和该PendingIntent其实是同一token的
PendingIntent
,而不是一个新的
token
和
PendingIntent
。然而你在从提取
PendingIntent
时,通过
FLAG_CANCEL_CURRENT参数
,让这个老
PendingIntent
的先cancel()掉,这样得到的
pendingInten
和其
token
的就是新的了。
通过
FLAG_UPDATE_CURRENT参数
的话,可以让新的Intent会更新之前
PendingIntent
中的Intent对象数据,例如更新Intent中的Extras
。另外,我们也可以在
PendingIntent
的原进程中调用PendingIntent的cancel ()把其从系统中移除掉。
注意:
两个PendingIntent对等是指它们的operation一样, 且其它们的Intent的action, data, categories, components和flags都一样。
但是它们的Intent的Extra可以不一样
。
主要常量
FLAG_CANCEL_CURRENT:
如果当前系统中已经存在一个相同的
PendingIntent
对象,那么就将先将已有的PendingIntent取消,然后重新生成一个
PendingIntent
对象。
FLAG_NO_CREATE:
如果当前系统中不存在相同的
PendingIntent
对象,系统将不会创建该
PendingIntent
对象而是直接返回null。
FLAG_ONE_SHOT:
该PendingIntent只作用一次。在该
PendingIntent
对象通过
send()
方法触发过后,
PendingIntent
将自动调用
cancel()
进行销毁,那么如果你再调用
send()
方法的话,系统将会返回一个
SendIntentException
。
FLAG_UPDATE_CURRENT:
如果系统中有一个和你描述的
PendingIntent
对等的
PendingInent
,那么系统将使用该
PendingIntent
对象,但是会使用新的Intent来更新之前
PendingIntent
中的
Intent
对象数据,例如更新Intent中的Extras。