Android 软件的状态栏图标通知处理

本文介绍了一种状态栏通知的实现方式,以QQ和飞信为例,详细解析了它们的状态栏通知机制,并提供了一个测试案例,展示了如何使用Notification进行状态栏通知的创建与取消。

编写:徐建祥(netpirate@gmail.com)

日期:2010/11/22

网址:http://www.anymobile.org

QQ的状态栏通知机制:当所有QQ的UI Activity切换到后台后,添加状态通知;切换回来后,删除该状态通知。

飞信的状态栏通知方式:运行软件后,图标一直显示在状态栏的通知栏中;显示退出软件则删除该状态通知。

似乎QQ的更有点技术含量,多个程序切换到后台的处理而已;以飞信的模式,做个类似的测试,案例如下:

程序路径:org.anymobile.im

程序入口:org.anymobile.im.LoginActivity(Action:android.intent.action.MAIN;Category:android.intent.category.LAUNCHER)

主界面程序:org.anymobile.im.MainActivity

测试程序流程:未登录的情况下,或者第一次运行会打开LoginActivity程序;登陆后,一直停留在主界面MainActivity。

所以,通过Notification,需可以回到im项目的上一个界面程序,LoginActivity / MainActivity,这里就要参考Launcher应用的相关实现,Intent的flag设置。

测试代码,新建一个android项目,TestNotification,入口程序:TestActivity,代码如下:

  1. packageorg.anymobile.test;
  2. importandroid.app.Activity;
  3. importandroid.content.ComponentName;
  4. importandroid.content.Intent;
  5. importandroid.graphics.LightingColorFilter;
  6. importandroid.os.Bundle;
  7. importandroid.view.Menu;
  8. importandroid.view.View;
  9. importandroid.view.View.OnClickListener;
  10. importandroid.widget.Button;
  11. publicclassTestActivityextendsActivity
  12. {
  13. privatestaticfinalintADD_ID=0;
  14. privatestaticfinalintDEL_ID=1;
  15. /**Calledwhentheactivityisfirstcreated.*/
  16. @Override
  17. publicvoidonCreate(BundlesavedInstanceState)
  18. {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.main);
  21. Buttonbutton=(Button)this.findViewById(R.id.btn_menu);
  22. button.setOnClickListener(newOnClickListener()
  23. {
  24. publicvoidonClick(Viewv)
  25. {
  26. //TestActivity.this.openOptionsMenu();
  27. StringpackName="org.anymobile.im";
  28. StringclassName=packName+".LoginActivity";
  29. Intentintent=newIntent();
  30. ComponentNamecomponentName=newComponentName(packName,className);
  31. intent.setComponent(componentName);
  32. intent.setAction("android.intent.action.MAIN");
  33. intent.addCategory("android.intent.category.LAUNCHER");
  34. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  35. intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
  36. TestActivity.this.startActivity(intent);
  37. }
  38. });
  39. //button.getBackground().setColorFilter(0xFFFF0000,PorterDuff.Mode.MULTIPLY);
  40. button.getBackground().setColorFilter(newLightingColorFilter(0xFFFFFFFF,0xFFAA0000));
  41. }
  42. @Override
  43. publicbooleanonCreateOptionsMenu(Menumenu)
  44. {
  45. menu.add(0,ADD_ID,0,"ADD");
  46. menu.add(0,DEL_ID,0,"DEL");
  47. returnsuper.onCreateOptionsMenu(menu);
  48. }
  49. }

OK,开始测试状态栏的通知功能:

1、LoginActivity.onCreate() 调用showNotification()方法,创建一个通知图标;

  1. /**
  2. *Thenotificationistheiconandassociatedexpandedentryinthe
  3. *statusbar.
  4. */
  5. protectedvoidshowNotification()
  6. {
  7. CharSequencefrom="IM";
  8. CharSequencemessage="IMstartup";
  9. Intentintent=newIntent();
  10. ComponentNamecomponentName=newComponentName("com.longcheer.imm",
  11. "com.longcheer.imm.activitys.LoginActivity");
  12. intent.setComponent(componentName);
  13. intent.setAction("android.intent.action.MAIN");
  14. intent.addCategory("android.intent.category.LAUNCHER");
  15. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  16. intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
  17. //ThePendingIntenttolaunchouractivityiftheuserselectsthisnotification
  18. PendingIntentcontentIntent=PendingIntent.getActivity(this,0,intent,0);
  19. //constructtheNotificationobject.
  20. Notificationnotif=newNotification(R.drawable.icon,"IMMStillrunbackground!",
  21. System.currentTimeMillis());
  22. notif.setLatestEventInfo(this,from,message,contentIntent);
  23. //lookupthenotificationmanagerservice
  24. NotificationManagernm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
  25. nm.notify(R.string.app_name,notif);
  26. }

2、在LoginActivity / MainAcitivity的退出操作中cancel该通知。

  1. privatevoiddoExit()
  2. {
  3. this.finish();
  4. NotificationManagernm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
  5. nm.cancel(R.string.app_name);
  6. }

测试OK!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值