android+状态栏显示图标大全,Android应用图标在状态栏上显示实现原理
一、前方
在研究《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应用图标在状态栏上显示实现原理相关推荐
- android的app图标大全,安卓app图标
在Android开发中,通常会有这样的需求,逢年过节UI的小伙伴们都会做出节日或活动相关的APP图标让我们更换,可是每次更换都要发版实现.那么,如何在不发版的情况下动态地更换我们的图标呢?本篇文章就来 ...
- android高德显示指定位置,高德地图开发(二)地图上显示指定位置
我们在用地图软件搜索的时候,搜索结果会在地图上以红点显示,现在我们来实现一个在地图上显示指定位置的程序,先看效果图. 要实现这么个功能,首先要能将地图视图中心移动到以指定位置:还有在指定位置绘制一个点 ...
- android控件使用大全,Android常见控件使用详解
本文实例为大家分享了六种Android常见控件的使用方法,供大家参考,具体内容如下 1.TextView 主要用于界面上显示一段文本信息 2.Button 用于和用户交互的一个按钮控件 //为Butt ...
- android 下拉框大全,Android 下拉列表Spinner
在UI中经常会使用到下拉列表,在android控件中有两个下拉列表控件: Spinner AppCompatSpinner 兼容低版本,在高版本中才能使用的方法换了V7下的Spinner后可以兼容到2 ...
- android中的广播大全,android中的广播
1系统广播(关闭,锁并,声音,电话,信号,等系统提供的广播)(例如信号) 广播一般是在一个类中直接写出来而不用这样单独写出到一个类中,这样方便在监听到结果时处理数据 import android.co ...
- android 经纬度 转换,andorid将经纬度转换到手机屏幕上显示
这是效果图,屏幕中的位置是兴东地铁站,左下方是洪浪北地铁站 主要的算法公式为: 以A为中心点,已知其经纬度为 lonA, latA 已知其他位置坐标的经度为纬度 lon, lat 其座标在手机屏幕位 ...
- w7计算机不显示移动硬盘,win7系统不显示移动硬盘怎么回事_win7移动硬盘在电脑上显示不出来如何处理-win7之家...
很多win7系统用户在电脑中插入移动硬盘的时候,发现打开我的电脑并没有显示移动硬盘图标,但是明明已经插入到电脑中了为什么还不显示呢?这是怎么回事呢,很多小伙伴想必都遇到过一样的情况吧,为了帮助到大家, ...
- 走路步数怎么在屏幕上显示_华为走步步数不在屏幕上显示如何设置
展开全部 1.打开手机的设置选项,找到"安全和隐私一栏",点击进入. 2.进入后下拉屏幕,32313133353236313431303231363533e4b893e5b19e3 ...
- linux 显示目录文件数,如何在Linux系统上显示当前及子目录中的文件数量
在本指南中,我们将介绍如何在 Linux 系统上显示当前工作目录或任何目录及其子目录中的文件数量. 我们将使用 find 命令,它用于搜索目录层次结构中的文件,以及 wc 命令,它会打印每个文件或来自 ...
- 在屏幕上显示一个短句c语言编程,在屏幕上显示Hllo.ppt
在屏幕上显示Hllo * * §2.1 在屏幕上显示Hello World 第2章 用C语言编写程序 用算例尽快进入编程 例2-1 在屏幕上显示一个短句: Hello World /* 显示" ...
最新文章
- 'datetime.datetime' object is not callable
- 快速了解Scala技术栈
- python的线程组怎么写_Python学习——Python线程
- 在.NET Core中使用MySQL5.7的JSON类型字段
- 冬奥开幕在即,现场通信网络技术深度揭秘!
- Multi-thread--提高C++性能的编程技术笔记:多线程内存池+测试代码
- 【译】渐进式 Web App 的离线存储
- 苹果隐私追踪新规发布后 Android广告支出涨10%
- java求两个数组的并集、交集、差集
- C++ 学习 之Struct
- PAT乙级 1031 查验身份证 (15 分)
- python必备基础代码-python基础知识和练习代码
- 十八、完成登录与注册页面的前端
- 【2019杭电多校第六场1011=HDU6644】11 Dimensions(dp+思维)
- NBU 备份 SAP HANA
- Javascript基础——函数
- c语言中sqrt取整,69. Sqrt(x) 求根号再取整
- jQuery视频展示效果实例
- MATLAB 滤波函数的源代码
- win11任务栏图标大小设置教程
热门文章
- 用计算机怎么计算p级数,2020考研计算机数学49个基础知识点
- Keil MDK配置ARM开发环境
- Wallystech|802.11r Fast Roaming hardware IPQ4019 IPQ4029 routerboard
- log4j 2.x读取配置文件以及使用
- 出现多个虚拟显示器(通用非即插即用监视器)处理办法
- 百度文库文档(文字和图片)
- word2vec的cbow
- 配置文件无法导出问题解决方案
- ASP.NET Core 3.1系列(30)——Newtonsoft.Json实现JSON的序列化和反序列化
- Android-沉浸式导航栏