来源:http://www.eoeandroid.com/thread-74415-1-1.html
NotificationManager与Notification对象的应用
在Android手机界面的最上方有一条显示时间、信号强度和电池状态等信息的区域,这是Android手机的状态栏(Status Bar)。当系统有一些信息要通知手机用户时,例如,收到新短信、收到新的电子邮件或有未接来电时,系统通常会把信息显示在状态栏中,有的仅显示小图标,有的则显示图标及文字提醒,用手指按住状态栏往下拉,还可以展开状态栏,查看所有系统发出的信息。
在程序中,要如何把提示信息放入状态栏,又要如何显示小图标呢?Android API已经为了管理提示信息(Notification),率先定义了NotificationManager(Android.app.NotificationMana- ger),只要将Notification添加NotificationManager,即可将信息显示在状态栏。
本范例将模拟MSN在线状态的切换,会在切换在线状态的同时,改变状态栏上显示的在线状态小图标,并以文字提示目前MSN显示的状态为何。
实现本范例时需先准备几张MSN在线状态的小Icon,并预先存入/res/drawable/文件夹中,图片文件路径如下:
/res/drawable/msn.png: 在线的小
ICON /res/drawable/away.png: 离开的小
ICON /res/drawable/busy.png: 忙碌中的小
ICON /res/drawable/min.png: 马上回来的小
ICON /res/drawable/offine.png: 离线的小ICON
效果图:
程序中以setAdapter()将存放5种登录状态的String[] status设置至Spinner中,当任何一个item被选择时,将会触发onItemSelected()这个方法,并依照其所选择的item,调用自定义的setNotiType()来发出Notification。
在setNotiType()这个方法中,以NotificationManager.notify()来发出Notification,并同时发出系统默认的铃响。
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
public class EX05_08 extends Activity {
/*声明对象变量*/
private NotificationManager myNotiManager;
private Spinner mySpinner;
private ArrayAdapter<String> myAdapter;
private static final String[] status = { "在线","离开","忙碌中","马上回来","离线" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* 载入main.xml Layout */
setContentView(R.layout.main);
/* 初始化对象 */
myNotiManager= (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
mySpinner=(Spinner)findViewById(R.id.mySpinner);
myAdapter=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,status);
/* 应用myspinner_dropdown自定义下拉菜单模式 */
myAdapter.setDropDownViewResource(R.layout.myspinner_dropdown);
/* 将ArrayAdapter添加Spinner对象中 */
mySpinner.setAdapter(myAdapter);
/* 将mySpinner添加OnItemSelectedListener */
mySpinner.setOnItemSelectedListener( new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0,View arg1, int arg2,long arg3) {
/* 依照选择的item来判断要发哪一个notification */
if(status[arg2].equals("在线")) {
setNotiType(R.drawable.msn,"在线");
} else if(status[arg2].equals("离开")) {
setNotiType(R.drawable.away,"离开");
} else if(status[arg2].equals("忙碌中")) {
setNotiType(R.drawable.busy,"忙碌中");
} else if(status[arg2].equals("马上回来")) {
setNotiType(R.drawable.min,"马上回来");
} else {
setNotiType(R.drawable.offine,"离线");
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
/* 发出Notification的method */
private void setNotiType(int iconId, String text) {
/* 创建新的Intent,作为单击Notification留言条时,
* 会运行的Activity
*/
Intent notifyIntent=new Intent(this,EX05_08_1.class);
notifyIntent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK);
/* 创建PendingIntent作为设置递延运行的Activity */
PendingIntent appIntent=PendingIntent.getActivity(EX05_08.this, 0,notifyIntent,0);
/* 创建Notication,并设置相关参数 */
Notification myNoti=new Notification();
/* 设置statusbar显示的icon */
myNoti.icon=iconId;
/* 设置statusbar显示的文字信息 */
myNoti.tickerText=text;
/* 设置notification发生时同时发出默认声音 */
myNoti.defaults=Notification.DEFAULT_SOUND;
/* 设置Notification留言条的参数 */
myNoti.setLatestEventInfo(EX05_08.this,"MSN登录状态", text,appIntent);
/* 送出Notification */
myNotiManager.notify(0,myNoti);
}
}
NotificationManager与Notification对象的应用
src/irdc.ex05_08/EX05_08_1.java
当用户在单击Nitification列表中,MSN登录状态的Notification时,会启动这个程序,程序会发出一个Toast,并告知用户"这是模拟MSN切换登录状态的程序"。
/* 当user单击Notification留言条时,会运行的Activity */
public class EX05_08_1 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* 发出Toast */
Toast.makeText(EX05_08_1.this, "这是模拟MSN切换登录状态的程序", Toast.LENGTH_SHORT ).show(); finish();
}
}
AndroidManifest.xml
本应用范例程序里有两个Activity,一个是LAUNCHER启动时运行,另一个是用户单击Nitification列表中的MSN登录状态时,显示Toast的Activity。如以下的Manifest所述。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="irdc.ex05_08" android:versionCode="1"
android:versionName="1.0.0">
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
<activity
android:name=".EX05_08"
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=".EX05_08_1"
android:label="@string/app_name">
</activity>
</application>
<uses-sdk android:minSdkVersion="7" />
</manifest>
本范例的学习重点在于如何运用NotificationManager来发出Notification,这在目前的手机上已经被广泛的应用,比如说,显示新短信提示、显示未接来电提示、显示系统错误信息提示等,在开发Android应用程序时可以好好利用这个功能。
发出Notification时,有三个地方可以显示文字,第一个是当Notification被添加到状态栏时,跟着ICON跑出的文字,在程序中以myNoti.tickerText=text来设置;其余两个地方则是在Notification列表中所显示的信息标题与信息内容,是在调用setLatestEventInfo()这个方法时所设置的,那么,如果希望在状态栏中不要显示文字,只要让ICON做变化,要怎么做呢?很简单,只要不设置Notification的tickerText,就只有ICON会改变,没有文字提示;同理,如果希望在列表的地方没有标题或内容,只要传入空白字符串就可以了。
在范例中,在线状态改变的同时,会发出系统默认的声音,主要是因为以下这一行程序:
myNoti.defaults=Notification.DEFAULT_SOUND;
Notification的defaults属性列表
Notification.DEFAULT_SOUND
发出系统默认的声音
Notification.DEFAULT_LIGHTS
屏幕发亮
Notification.DEFAULT_VIBRATE
手机震动
Notification.DEFAULT_ALL
包含以上三种的动作
通过上述几种方式,可以设置在发出Notification时,要同时运行的动作,甚至还可以通过设置Notification的sound属性(Url对象)来指定要播放的声音。
程序中用NotificationManager.notify(id,Notification)来发出信息,其中传入的第一个参数id就是Notification的id。以本范例而言,由于每次更改在线状态时,发出的Notification的id皆为0,因此当新的Notification被发出时,会替换掉旧的Notification,造成不断变换状态栏上的ICON的效果,若发出的Notification的id不同,状态栏上就会显示不同的ICON。