好久没上来CSDN上写技术博客了,近来个人变得有点浮躁,最近总算平息了些,还是要做点事情才行了。最近在做Android的项目开发,要使用到android系统的通知栏,以前没有开发过,今天找了些例子学习了一下,在这里记录下来,希望帮助到一些初级程序员。
当程序在运行时,按下home键的时候,Activity会执行onPause和onStop方法,此时程序在后台运行。如果我们想要在通知栏看得到这些后台正在运行的图标的话,就可以用Notification。
1.首先实现一个用于显示Notification的类:
protected void showNotification() {
// 创建一个NotificationManager对象
NotificationManagernotificationmanager = (NotificationManager)getSystemService(android.content.Context.NOTIFICATION_SERVICE);
// 定义notification的各种属性
Notification notification= new Notification(R.drawable.qq,"手机QQ",
System.currentTimeMillis());
notification.flags |= Notification.FLAG_ONGOING_EVENT;// 将此通知放到通知栏的"Ongoing"即"正在运行"组中
notification.flags |= Notification.FLAG_NO_CLEAR;// 表明在点击了通知栏中的"清除通知"后,此通知不清除,经常与FLAG_ONGOING_EVENT一起使用
notification.flags |= Notification.FLAG_SHOW_LIGHTS;
notification.defaults = Notification.DEFAULT_LIGHTS;
notification.ledARGB = Color.BLUE;
notification.ledOnMS = 5000;
// 设置通知的事件消息
CharSequence contentTitle= "流年(在线)";// 通知栏标题
CharSequence contentText ="最新版本号2012.3.27";// 通知栏内容
Context contex =getApplicationContext();
Intent notificationIntent= new Intent(contex, Activity02.class);// 点击该通知后要跳转的Activity
PendingIntent contentItent= PendingIntent.getActivity(contex, 0,
notificationIntent, 0);
notification.setLatestEventInfo(contex,contentTitle, contentText,
contentItent);
// 把Notification传递给NotificationManager,第一个参数是一个标识
notificationmanager.notify(0,notification);
}
注意:
(1)其中,Notification notification =newNotification(R.drawable.qq, "手机QQ",
System.currentTimeMillis());中R.drawable.qq是显示在通知栏最上面的图标,“手机QQ”是显示在通知栏最上面的名称:如下图所示:
“手机QQ”显示大概一两秒后就会消失。但是我发现在“手机QQ”这个标题好没消失的时候,整个通知是占满整个通知栏的,如果当时还有其他图标,这个时候是看不到的。那么怎么样才能一开始就能同时看到其他的图标呢,解决方法是不设置“手机QQ”这个标题就可以。
而第三个参数是获取系统当前的时间。
2.接下来我们就可以来使用它了。有与按下home键的时候Activity会调用OnPause 和OnStop方法所以我们就在onStop中调用显示Notification。但是activity跳转的时候也会调用onStop方法,所以我们可以用一个变量来判断当前执行多次onStop方法是否是activity跳转中的,如果不是则显示通知Notification。
protected void onStop() {
super.onStop();
//如果是activity之间的跳转,即如果是按下的home键则显示通知
if(!isIntent)
showNotification();
Log.v("activity02","onStop");
}
3.当我们想回到程序,点击了通知栏的图标时要回到程序退出时的状态时,要注意,如果不做任何处理,activity会重新执行onCreate方法,这样的话就不是原来的状态了。在网上查找了一个主要是有这么两个方法:
1. 在配置文件中的使用了Notification的Activity属性中加入android:launchMode="singleInstance"
2. 在显示Notification的方法中,作如下的修改:
Intent intent =new Intent(this,Class.forName("XX包名.TestActivity1"));
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP|Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);
注意:上面的方法只对于home键有作用,但是对于按back键退出程序是不起作用的,因为back键会destory当前的Activity,所以再次进入的时候还是会调用oncreate方法的。
4. 经过上面的几个步骤已经可以回到原来的Activity了,这个时候我们就应该把通知栏的信息清除了,由于回到原来的Activity时会执行onRestart--->onStart--->onResume方法,所以就可以再start方法中清除通知栏的相关信息。
protected void onStart() {
super.onStart();
//取消通知
NotificationManagernotificationManager = (NotificationManager)this
.getSystemService(NOTIFICATION_SERVICE);
notificationManager.cancel(0);
Log.v("activity02","onStart");
};
其中的notificationManager.cancel(0);中的0就是一开是显示Notification时建立的一个标识。
有的时候,我们的程序就是要真正的退出而不是在后台运行,这个时候,就不需要在显示通知了,此时我们可以在onDestory方法中让通知不显示就可以了。