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

编写:徐建祥(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. package org.anymobile.test;  
  2. import android.app.Activity;  
  3. import android.content.ComponentName;  
  4. import android.content.Intent;  
  5. import android.graphics.LightingColorFilter;  
  6. import android.os.Bundle;  
  7. import android.view.Menu;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.Button;  
  11. public class TestActivity extends Activity  
  12. {  
  13.     private static final int ADD_ID = 0;  
  14.     private static final int DEL_ID = 1;  
  15.       
  16.     /** Called when the activity is first created. */  
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState)  
  19.     {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.main);  
  22.           
  23.         Button button = (Button) this.findViewById(R.id.btn_menu);  
  24.         button.setOnClickListener(new OnClickListener()  
  25.         {  
  26.             public void onClick(View v)  
  27.             {  
  28. //              TestActivity.this.openOptionsMenu();  
  29.                 String packName = "org.anymobile.im";  
  30.                 String className = packName + ".LoginActivity";  
  31.                   
  32.                 Intent intent = new Intent();  
  33.                 ComponentName componentName = new ComponentName(packName, className);  
  34.                 intent.setComponent(componentName);  
  35.                   
  36.                 intent.setAction("android.intent.action.MAIN");  
  37.                 intent.addCategory("android.intent.category.LAUNCHER");  
  38.                 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  39.                 intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  40.                   
  41.                 TestActivity.this.startActivity(intent);  
  42.             }  
  43.         });  
  44. //        button.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);  
  45.         button.getBackground().setColorFilter(new LightingColorFilter(0xFFFFFFFF0xFFAA0000));  
  46.     }  
  47.     @Override  
  48.     public boolean onCreateOptionsMenu(Menu menu)  
  49.     {  
  50.         menu.add(0, ADD_ID, 0"ADD");  
  51.         menu.add(0, DEL_ID, 0"DEL");  
  52.           
  53.         return super.onCreateOptionsMenu(menu);  
  54.     }  
  55.       
  56. }  
 

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

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

  1. /** 
  2.    * The notification is the icon and associated expanded entry in the 
  3.    * status bar. 
  4.    */  
  5.   protected void showNotification()  
  6.   {  
  7.       CharSequence from = "IM";  
  8.       CharSequence message = "IM start up";  
  9.         
  10. Intent intent = new Intent();  
  11. ComponentName componentName = new ComponentName("com.longcheer.imm",   
  12.     "com.longcheer.imm.activitys.LoginActivity");  
  13. intent.setComponent(componentName);  
  14. intent.setAction("android.intent.action.MAIN");  
  15. intent.addCategory("android.intent.category.LAUNCHER");  
  16. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  17. intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  18.   
  19.       // The PendingIntent to launch our activity if the user selects this notification  
  20.       PendingIntent contentIntent = PendingIntent.getActivity(this0, intent, 0);  
  21.       // construct the Notification object.  
  22.       Notification notif = new Notification(R.drawable.icon, "IMM Still run background!",  
  23.               System.currentTimeMillis());  
  24.       notif.setLatestEventInfo(this, from, message, contentIntent);  
  25.         
  26.       // look up the notification manager service  
  27.       NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);  
  28.       nm.notify(R.string.app_name, notif);  
  29.   }  
 

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

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

测试OK!!

posted @ 2011-07-12 21:08  jacky.YL.G  阅读(1245)  评论(0编辑  收藏  举报