广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    Android应用图标在状态栏上显示实现原理

    2018-04-09 07:41:58 次阅读 稿源:互联网
    广告
    一、前方
    在研究《Android类似360,QQ管家那样的悬浮窗》突发奇想,想把应用的图标也显示到状态栏上,类似手机QQ,而有消息来时改变状态栏上的图标显示。

    二、原理
    其实很研究完后,才发现,很简单:
    2.1 显示图标在状态栏上
    代码如下:

    NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    Notification n = new Notification(
    resId, "Floats Start!", System.currentTimeMillis());

    // 将此通知放到通知栏的"Ongoing"即"正在运行"组中
    n.flags |= Notification.FLAG_ONGOING_EVENT;
    // 表明在点击了通知栏中的"清除通知"后,此通知不清除,
    // 经常与FLAG_ONGOING_EVENT一起使用
    n.flags |= Notification.FLAG_NO_CLEAR;

    PendingIntent pi = PendingIntent.getActivity(this, 0, getIntent(), 0);
    n.contentIntent = pi;
    n.setLatestEventInfo(this, "FloatsWindow", "start!", pi);
    nm.notify(NOTIFICATION_ID_ICON, n);

    2.2 修改图标的显示
    不用cancel这个通知,只需传入不同的resId,再通知即可。
    代码如下:

    package com.chris.floats.window;
    import android.os.Bundle;
    import android.util.DisplayMetrics;
    import android.view.Gravity;
    import android.view.WindowManager;
    import android.app.Activity;
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Context;
    public class MainActivity extends Activity {
    private static WindowManager mWindowMgr = null;
    private WindowManager.LayoutParams mWindowMgrParams = null;
    private static FloatsWindowView mFloatsWindowView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStop() {
    super.onStop();
    deleteIconToStatusbar();
    }
    /*
    * 显示应用主界面时,去除悬浮层
    * 修改状态栏上的图标
    */
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
    if(hasFocus){
    if(mFloatsWindowView != null){
    mWindowMgr.removeView(mFloatsWindowView);
    mFloatsWindowView = null;
    }
    addIconToStatusbar(R.drawable.a0);
    }else{
    getWindowLayout();
    addIconToStatusbar(R.drawable.ic_launcher);
    }
    }
    private void initParams(){
    DisplayMetrics dm = getResources().getDisplayMetrics();
    mWindowMgrParams.x = dm.widthPixels - 136;
    mWindowMgrParams.y = 300;
    mWindowMgrParams.width = 136;
    mWindowMgrParams.height = 136;
    }
    private void getWindowLayout(){
    if(mFloatsWindowView == null){
    mWindowMgr = (WindowManager)getBaseContext().getSystemService(Context.WINDOW_SERVICE);
    mWindowMgrParams = new WindowManager.LayoutParams();

    /*
    * 2003 在指悬浮在所有界面之上
    * (4.0+系统中,在下拉菜单下面,而在2.3中,在上拉菜单之上)
    */
    mWindowMgrParams.type = 2003;
    mWindowMgrParams.format = 1;

    /*
    * 代码实际是wmParams.flags |= FLAG_NOT_FOCUSABLE;
    * 40的由来是wmParams的默认属性(32)+ FLAG_NOT_FOCUSABLE(8)
    */
    mWindowMgrParams.flags = 40;
    mWindowMgrParams.gravity = Gravity.LEFT | Gravity.TOP;
    initParams();

    mFloatsWindowView = new FloatsWindowView(this);
    mWindowMgr.addView(mFloatsWindowView, mWindowMgrParams);
    }
    }

    private final static int NOTIFICATION_ID_ICON = 0x10000;
    /*
    * 如果没有从状态栏中删除ICON,且继续调用addIconToStatusbar,
    * 则不会有任何变化。除了:
    * 如果,将notification中的resId设置不同的图标,则会显示不同
    * 的图标
    */
    private void addIconToStatusbar(int resId){
    NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    Notification n = new Notification(
    resId, "Floats Start!", System.currentTimeMillis());

    // 将此通知放到通知栏的"Ongoing"即"正在运行"组中
    n.flags |= Notification.FLAG_ONGOING_EVENT;
    // 表明在点击了通知栏中的"清除通知"后,此通知不清除,
    // 经常与FLAG_ONGOING_EVENT一起使用
    n.flags |= Notification.FLAG_NO_CLEAR;

    PendingIntent pi = PendingIntent.getActivity(this, 0, getIntent(), 0);
    n.contentIntent = pi;
    n.setLatestEventInfo(this, "FloatsWindow", "start!", pi);
    nm.notify(NOTIFICATION_ID_ICON, n);
    }

    private void deleteIconToStatusbar(){
    NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    nm.cancel(NOTIFICATION_ID_ICON);
    }
    }

    以上就是源码,当应用的焦点变化时,状态栏上的图片也会跟着变化。
    源码下载地址:http://download.csdn.net/detail/qingye_love/5506825

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告