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

来源:互联网 发布:三菱l系列plc编程手册 编辑:程序博客网 时间:2024/03/29 21:20

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

原创粉丝点击