Android 应用背景加载系统动态壁纸

需求

客户的需求总是那么让人摸不着头脑,我们的应用和系统的launcher是共同存在的双桌面形式,客户要求应用必须支持系统桌面的壁纸,针对这个需求,静态壁纸很容易实现,但是动态壁纸就很麻烦了,毕竟我们的只是一个应用伪launcher,并不是在真正的launcher源码上进行更改的桌面程序。

思路

在网上查了很多资料之后才有了一点思路,动态壁纸并不是运行在activity界面,虽然都是以apk的形式存在于android系统中,但是主要是运行在一个壁纸窗口的WallPaperService。所以需要将我们的应用主题设置成透明,再将动态壁纸的窗口贴合应用的acivity窗口,后面看过android原生launcher3的源码之后发现系统也是这样实现的

实现

1.透明背景

将应用的主Activity的主题设置为透明

android:name=".activity.MainActivity"

android:launchMode="singleTask"

android:screenOrientation="landscape"

android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen">

2.壁纸窗口贴合Acivity窗口

通过设置当前窗口的属性,添加显示壁纸窗口的标志,将壁纸窗口贴合在应用背景,当不需要时清除标志

if(isLiveWall){

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER);

}else {

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER);

}

3.关闭系统对话框

完成前两步之后,便可以将当前系统的动态壁纸加载到应用背景上,如果是非launcher的应用这样就已经完成功能了。但是因为我们应用是一个双桌面,具有桌面的home属性,测试过中发现,在Activity窗口和壁纸窗口之间会叠加出现一个最近任务的系统对话框和原生launcher桌面

大概的样子就是这样:

系统窗口背景重叠

这样背景全部重叠在一起,推测最近任务的对话框应该是默认显示在壁纸窗口之上,没有关闭的话就会显示在我们透明的背景下,所以需要关闭掉类似的系统对话框。

多透明窗口的窗口堆栈图

而系统launcher桌面也会叠加的原因是,因为launche3在也是默认透明背景显示壁纸窗口的,两个activity窗口都标志显示壁纸的话,壁纸窗口会显示在最底层的系统桌面窗口。

但是系统默认的桌面是没有这些问题的,所以在系统launcher的源码中,应该存在解决方案

protected void onNewIntent(Intent intent) {

long startTime = 0;

if (DEBUG_RESUME_TIME) {

startTime = System.currentTimeMillis();

}

super.onNewIntent(intent);

boolean alreadyOnHome = mHasFocus && ((intent.getFlags() &

Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT)

!= Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

// Check this condition before handling isActionMain, as this will get reset.

boolean shouldMoveToDefaultScreen = alreadyOnHome &&

mState == State.WORKSPACE && getTopFloatingView() == null;

boolean isActionMain = Intent.ACTION_MAIN.equals(intent.getAction());

if (isActionMain) {

// also will cancel mWaitingForResult.

closeSystemDialogs();

}

public void closeSystemDialogs() {

getWindow().closeAllPanels();

// Whatever we were doing is hereby canceled.

setWaitingForResult(null);

}

在onNewIntent回调中我们可以发现,当launcher收到返回桌面的Intent时,会调用 closeSystemDialogs()来关闭系统对话框,在我们的代码中加入此段代码即可关闭系统对话框

protected void onNewIntent(Intent intent) {

super.onNewIntent(intent);

if(intent.getAction().equals(Intent.ACTION_MAIN)){

closeSystemDialogs();

}

}

private void closeSystemDialogs() {

getWindow().closeAllPanels();

Intent close = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);

sendBroadcast(close);

}

4.设置动态壁纸

到了这里也还没完,根据用户的需求,需要设置一个默认的动态壁纸,然后找了半天发现只有静态壁纸的设置API,动态壁纸的除非自己写的,是没有提供开放的API,还好在Stack Overflow 上面找到一个可以通过反射来实现的方法,但是必须是有系统权限

然后调用hide类的方法IWallpaperManager.setWallpaperComponent(ComponentName)来实现

public void setLiveWallPaper(String wallPaper){

try

{

WallpaperManager manager = WallpaperManager.getInstance(mContext);

Method method = WallpaperManager.class.getMethod("getIWallpaperManager", new Class[]{});

Object objIWallpaperManager = method.invoke(manager, new Object[]{});

Class[] param = new Class[1];

param[0] = ComponentName.class;

method = objIWallpaperManager.getClass().getMethod("setWallpaperComponent", param);

//get the intent of the desired wallpaper service. Note: I created my own

//custom wallpaper service. You'll need a class reference and package

//of the desired live wallpaper

Intent intent = new Intent(WallpaperService.SERVICE_INTERFACE);

intent.setClassName("com.android.noisefield", "com.android.noisefield.NoiseFieldWallpaper");

//set the live wallpaper (throws security exception if you're not system-privileged app)

method.invoke(objIWallpaperManager, intent.getComponent());

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

intent.setClassName("com.android.noisefield", "com.android.noisefield.NoiseFieldWallpaper");

这里可以替换成,自己定义的动态壁纸或者其他Android 自带动态壁纸的包名,壁纸服务名

总结

前前后后总共花了三天才搞定这个需求,一开始想的太简单,还好源码和StackOverflow 帮了大忙,所以以后一定要多读Android系统源码

android设置主题背景为壁纸_Android 应用背景加载系统动态壁纸相关推荐

  1. android设置主题背景为壁纸_主题壁纸美化app下载-主题壁纸美化安卓版(DIY定制) - 超好玩...

    主题壁纸美化是一款非常实用的手机壁纸软件,海量图片素材可以包揽你的桌面.头像.背景图等等,主题壁纸美化安卓版(DIY定制)还有特殊的透明壁纸,可以设置个性挂件,让你的桌面动起来,感兴趣的小伙伴快来下载 ...

  2. android设置主题和自定义主题的方法

    android设置主题和自定义主题的方法 嘿嘿,书接上回,android有两种设置主题到方法,一种就是通过修改manifest文件,一种就是在通过修改我们的java代码:主题的自定义设置和样式的自定义 ...

  3. Android系统之路(初识MTK) ------ (详细精华)添加客供系统壁纸去除系统动态壁纸/Camera默认fine/remove android beam

    ① the first one 进入Camera 设置里面默认 Video quality 摄录像fine 1920*1088 使用 eclipse Dump view hierarchy for u ...

  4. 安卓设置菊花动画_Android仿ios加载loading菊花图效果

    项目中经常会用到加载数据的loading显示图,除了设计根据app自身设计的动画loading,一般用的比较多的是仿照ios 的菊花加载loading 图,当然一些条件下还会涉及到加载成功/ 失败情况 ...

  5. android动态壁纸提取,[图]大神已提取出一加8T的动态壁纸:Android 8.0+设备均可使用...

    原标题:[图]大神已提取出一加8T的动态壁纸:Android 8.0+设备均可使用 在过去数周时间里,不断有一加8T的信息在网络上被曝光.在官方的预热和爆料人士分享的细节下,一加8T基本上已经浮出水面 ...

  6. android动态壁纸提取,大神已提取出一加8T的动态壁纸:Android 8.0+设备均可使用

    在过去数周时间里,不断有一加 8T 的信息在网络上被曝光.在官方的预热和爆料人士分享的细节下,一加 8T 基本上已经浮出水面,而现在一加 8T 的动态壁纸也被提取出来了.在发布会开始前几天,XDA 知 ...

  7. Android 页面或文件或网络请求时的加载动画

    //加载图片或页面或网络请求时出现加载动画 public Class LoadingAnimation{ private static LoadingAnimation loadingAnimatio ...

  8. 仿百度壁纸客户端(四)——自定义上拉加载实现精选壁纸墙

    仿百度壁纸客户端(四)--自定义上拉加载实现精选壁纸墙 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度壁纸客户端(二)--主页自 ...

  9. python实现动态壁纸_python学习笔记 | macOS Big Sur动态壁纸食用指南

    目录 前言 北京时间23日凌晨1点,苹果WWDC2020大会开幕.在发布会上,苹果正式发布了新版macOS,并将其命名为"Big Sur". 相比于外界争议最大的UI界面,令我更为 ...

  10. Android中关于Volley的使用(二)加载Json数据

    前面一篇关于Volley的文章中,我们学习了如何利用ImageRequest去网络中加载图片,那么今天我们就来学习一下如何利用volley去网络中加载Json格式数据,并将其展示在一个ListView ...

最新文章

  1. ARM NEON 编程简单入门1
  2. linux下zip2
  3. Windows消息机制要点
  4. ABAP 740里的新语法 - LET表达式
  5. Python爬虫:爬取instagram,破解js加密参数
  6. 生产环境下,oracle不同用户间的数据迁移。第三部分
  7. 支付宝又要改版了:首页顶栏新增了这个模块
  8. 转:POJ先做完这50题再说
  9. 【金融量化分析】#BSM formula 的推导(解随机微分方程)
  10. 计算机屏幕显示故障,计算机显示器常见故障的原因和解决方法
  11. 四核64位处理器,MIMX8MQ5DVAJZAB 满足智能设备应用
  12. 解压压缩包的时候要求输入密码
  13. win7和win10哪个好用
  14. python爬取链家新房_Python爬虫实战:爬取链家网二手房数据
  15. mysql查询专业术语,英文术语MySQL查询
  16. switchyomega插件自动切换代理
  17. 计算机思维典型方法有抽象,传说中的四大编程思维 一篇彻底搞清楚
  18. (SQL语句)查询排序,顺序和倒序
  19. MYSQL之DQL(数据库查询语言)
  20. Putty的使用及登录

热门文章

  1. 博客留言外链是否有用?
  2. 18位身份证号码含义及验证算法代码
  3. JAVA:18位身份证号码验证工具类(识别性别和生日、计算年龄)
  4. 国中假期 part 1
  5. 我的python学习(前言 初生牛犊不怕虎)
  6. 域名Whois查询API,域名Whois,域名历史Whois
  7. 而立之年,时间都去哪儿
  8. 硬件--如何安全删除USB后不重新插拔而自动重连
  9. 1114 计算营业额
  10. 关于ICP和EDI许可证,你了解多少?