作者:刘昊昱
博客:http://blog.csdn.net/liuhaoyutz
状态栏通知涉及到两个类,一是Notification,它代表一个通知;另一个是NotificationManager,它是用于发送Notification的系统服务。
使用状态栏通知一般有4个步骤:
1、 通过getSystemService()方法获取NotificationManager服务。
2、 创建一个Notification对象,并为其设置各种属性。
3、 为Notification对象设置事件信息。
4、 通过NotificationManager类的notify()方法将通知发送到状态栏。
下面我们来看一个例子,其运行效果如下所示:
主布局文件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" > <Button android:id="@+id/button1" android:text="发送消息" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/button2" android:text="清空消息" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
下面看主Activity文件,其内容如下所示:
package com.liuhaoyu; 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 { final int NOTIFYID_1 = 123; //第一个通知的ID final int NOTIFYID_2 = 124; //第二个通知的ID /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Button button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Notification notify = new Notification(); notify.icon = R.drawable.image01; notify.tickerText = "有新通知啦!"; notify.when = System.currentTimeMillis(); notify.defaults = Notification.DEFAULT_ALL; notify.setLatestEventInfo(MainActivity.this, "通知1", "周六下午5点打篮球", null); notificationManager.notify(NOTIFYID_1, notify); Notification notify1 = new Notification(R.drawable.image01, "哈哈,又有新通知了", System.currentTimeMillis()); notify1.flags|=Notification.FLAG_AUTO_CANCEL; Intent intent=new Intent(MainActivity.this,ContentActivity.class); PendingIntent pendingIntent=PendingIntent.getActivity(MainActivity.this, 0, intent, 0); notify1.setLatestEventInfo(MainActivity.this, "通知2", "点击查看详情", pendingIntent); notificationManager.notify(NOTIFYID_2, notify1); } }); Button button2 = (Button) findViewById(R.id.button2); button2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // notificationManager.cancel(NOTIFYID_1); //清除ID号为常量NOTIFYID_1的通知 notificationManager.cancelAll(); //清除全部通知 } }); } }
当点击第一个按钮时,发送两个通知,第一个直接显示通知内容,第二个通过启动另外一个Activity 即ContentActivity来显示通知内容。
当点击第二个按钮时,清空所有通知,也可以删除指定ID号的通知。
因为第一个通知设置使用默认声音、默认振动及默认闪光灯,即程序需要访问系统闪光灯资源和振动器,所以我们需要在AndroidManifest.xml文件中声明使用权限,加上如下语句:
<uses-permission android:name="android.permission.FLASHLIGHT"/> <uses-permission android:name="android.permission.VIBRATE"/>
因为第二个通知要启动另外一个Activity来显示通知内容,所以我们也要在AndroidManifest.xml文件中声明这个Activity,加入如下语句:
<activity android:label="通知" android:name=".ContentActivity" android:theme="@android:style/Theme.Dialog" />
通知2调用的活动ContentActivity比较简单,仅仅是显示一条通知,但注意我们通过在AndroidManifest.xml中的android:theme="@android:style/Theme.Dialog"指定它为对话框的形式。该活动实现如下:
package com.liuhaoyu; import android.app.Activity; import android.os.Bundle; public class ContentActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.content); } }
其布局文件内容如下:
<?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="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="周日下午5点打羽毛球" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout>