Android 状态栏提示的另一种方法

来源: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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值