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

2016-02-19 09:29 40 1 收藏

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐Android应用图标在状态栏上显示实现原理,无聊中的都看过来。

【 tulaoshi.com - 编程语言 】

一、前方
在研究《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

来源:https://www.tulaoshi.com/n/20160219/1591007.html

延伸阅读
百度滴答状态栏图标怎么设置?   百度滴答状态栏图标设置方法。每次设置了闹钟后,一下子没想起来直接就把闹钟关了,导致安排今天的事情都没做好,过后想起来就很懊恼。别急,小编教你百度滴答状态栏图标设置方法,以防自己一下子没想起来,它可以提醒你哦。 1)首先打开,进入界面后点击右上角按键,再点击。 2)界面...
第一步 我们都知道一般状态栏都会显示一些最基本的信息,但是这些基本的信息却又是我们不可或缺的。比如说当前页数或者是当前的字数等等这些都是非常重要的。如果没有了的话还是会非常不方便。想要显示状态栏我们首先要点击当前页面左上角有一个【WPS文字】选项,点击这个项目然后可以在下拉菜单中选择【工具】-【选项】。 选择复选框...
本文为大家简单介绍一下Dreamweaver状态栏,希望对大家有帮助。 “文档”窗口底部的状态栏提供与正创建的文档有关的其它信息。 一、Dreamweaver 状态栏 A:标签选择器 B:选取工具 C:手形工具 D:缩放工具 E:设置缩放比率 F:窗口大小 G:下载文件大小/下载时间 H:编码格式 ...
标签: 办公软件
    相信打开查找和替换对话框来查找和替换文档中的文字、录制宏、执行修订文档等功能大家平时使用得一定挺多的,但大家一般都是通过选择菜单下的命令来打开并执行这些功能的。不过您知道吗?利用Word 2000的状态栏我们可以快速执行上述操作。     1、快速打开“查找和替换”对话框   &nbs...
C++ Q&A 专栏... 原著:Paul DiLascia 翻译:lowiq 原文出处:MSDN Magazine December 2001(C++ Q&A) 原代码下载:CQA0112.exe (52KB) 停止屏幕保护 侦测屏幕的分辨率 ...

经验教程

164

收藏

64
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部