一、前方

在研究《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

android+状态栏显示图标大全,Android应用图标在状态栏上显示实现原理相关推荐

  1. android的app图标大全,安卓app图标

    在Android开发中,通常会有这样的需求,逢年过节UI的小伙伴们都会做出节日或活动相关的APP图标让我们更换,可是每次更换都要发版实现.那么,如何在不发版的情况下动态地更换我们的图标呢?本篇文章就来 ...

  2. android高德显示指定位置,高德地图开发(二)地图上显示指定位置

    我们在用地图软件搜索的时候,搜索结果会在地图上以红点显示,现在我们来实现一个在地图上显示指定位置的程序,先看效果图. 要实现这么个功能,首先要能将地图视图中心移动到以指定位置:还有在指定位置绘制一个点 ...

  3. android控件使用大全,Android常见控件使用详解

    本文实例为大家分享了六种Android常见控件的使用方法,供大家参考,具体内容如下 1.TextView 主要用于界面上显示一段文本信息 2.Button 用于和用户交互的一个按钮控件 //为Butt ...

  4. android 下拉框大全,Android 下拉列表Spinner

    在UI中经常会使用到下拉列表,在android控件中有两个下拉列表控件: Spinner AppCompatSpinner 兼容低版本,在高版本中才能使用的方法换了V7下的Spinner后可以兼容到2 ...

  5. android中的广播大全,android中的广播

    1系统广播(关闭,锁并,声音,电话,信号,等系统提供的广播)(例如信号) 广播一般是在一个类中直接写出来而不用这样单独写出到一个类中,这样方便在监听到结果时处理数据 import android.co ...

  6. android 经纬度 转换,andorid将经纬度转换到手机屏幕上显示

    这是效果图,屏幕中的位置是兴东地铁站,左下方是洪浪北地铁站 主要的算法公式为: 以A为中心点,已知其经纬度为 lonA, latA 已知其他位置坐标的经度为纬度  lon, lat 其座标在手机屏幕位 ...

  7. w7计算机不显示移动硬盘,win7系统不显示移动硬盘怎么回事_win7移动硬盘在电脑上显示不出来如何处理-win7之家...

    很多win7系统用户在电脑中插入移动硬盘的时候,发现打开我的电脑并没有显示移动硬盘图标,但是明明已经插入到电脑中了为什么还不显示呢?这是怎么回事呢,很多小伙伴想必都遇到过一样的情况吧,为了帮助到大家, ...

  8. 走路步数怎么在屏幕上显示_华为走步步数不在屏幕上显示如何设置

    展开全部 1.打开手机的设置选项,找到"安全和隐私一栏",点击进入. 2.进入后下拉屏幕,32313133353236313431303231363533e4b893e5b19e3 ...

  9. linux 显示目录文件数,如何在Linux系统上显示当前及子目录中的文件数量

    在本指南中,我们将介绍如何在 Linux 系统上显示当前工作目录或任何目录及其子目录中的文件数量. 我们将使用 find 命令,它用于搜索目录层次结构中的文件,以及 wc 命令,它会打印每个文件或来自 ...

  10. 在屏幕上显示一个短句c语言编程,在屏幕上显示Hllo.ppt

    在屏幕上显示Hllo * * §2.1 在屏幕上显示Hello World 第2章 用C语言编写程序 用算例尽快进入编程 例2-1 在屏幕上显示一个短句: Hello World /* 显示" ...

最新文章

  1. 'datetime.datetime' object is not callable
  2. 快速了解Scala技术栈
  3. python的线程组怎么写_Python学习——Python线程
  4. 在.NET Core中使用MySQL5.7的JSON类型字段
  5. 冬奥开幕在即,现场通信网络技术深度揭秘!
  6. Multi-thread--提高C++性能的编程技术笔记:多线程内存池+测试代码
  7. 【译】渐进式 Web App 的离线存储
  8. 苹果隐私追踪新规发布后 Android广告支出涨10%
  9. java求两个数组的并集、交集、差集
  10. C++ 学习 之Struct
  11. PAT乙级 1031 查验身份证 (15 分)
  12. python必备基础代码-python基础知识和练习代码
  13. 十八、完成登录与注册页面的前端
  14. 【2019杭电多校第六场1011=HDU6644】11 Dimensions(dp+思维)
  15. NBU 备份 SAP HANA
  16. Javascript基础——函数
  17. c语言中sqrt取整,69. Sqrt(x) 求根号再取整
  18. jQuery视频展示效果实例
  19. MATLAB 滤波函数的源代码
  20. win11任务栏图标大小设置教程

热门文章

  1. 用计算机怎么计算p级数,2020考研计算机数学49个基础知识点
  2. Keil MDK配置ARM开发环境
  3. Wallystech|802.11r Fast Roaming hardware IPQ4019 IPQ4029 routerboard
  4. log4j 2.x读取配置文件以及使用
  5. 出现多个虚拟显示器(通用非即插即用监视器)处理办法
  6. 百度文库文档(文字和图片)
  7. word2vec的cbow
  8. 配置文件无法导出问题解决方案
  9. ASP.NET Core 3.1系列(30)——Newtonsoft.Json实现JSON的序列化和反序列化
  10. Android-沉浸式导航栏