ADeveloperH Blog

Meet a better self !

Android 周边技术分享


Android 适配相关

1 Android Icon 设置

Android应用图标微技巧,8.0系统中应用图标的适配

Android O 新特性介绍:自适应图标(Adaptive Icons)

[Android O 自适应图标的意义何在?Google 设计师给你答案 科普](https://sspai.com/post/40230)

Android Asset Studio

使用 Image Asset Studio 创建应用图标(官网)

图标在线生成工具Android Asset Studio的使用

Android神兵利器之Image Asset Studio

阿里巴巴矢量图库

Android O 新特性介绍:自适应图标(Adaptive Icons)

2 Android 启动页适配

冷启动设置的启动页的方案:

Android APP启动优化

用layer-list实现图片旋转叠加、错位叠加、阴影、按钮指示灯

resource xml 使用官方文档

问题描述:
启动页设置 “android:windowBackground” 后在部分宽高比下显示被拉伸。

解决方案: Android 启动背景图怎么适配?【已解决】


<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque">

    <item android:drawable="@color/black"/>

    <item>
        <bitmap android:src="@drawable/splash_bg" android:gravity="center"/>
    </item>
</layer-list>

注意:全屏的启动页建议使用.9图,否则使用 layer-list 显示效果仍然不佳。.9图文件大小过大,微信启动不设置 windowBackground ,通过设置 SplashActivity  ImageView scaletype  centerCrop 来适配

3 Android StatusBar 适配

StatusBarUtil

问题:

  1. 状态栏遮挡 contentView 显示的内容

解决Android Toobar与状态栏重叠

Android沉浸状态栏(StatusBar)兼容方案

4 Android 屏幕适配

Android 目前最稳定和高效的UI适配方案

dimens_sw

一种极低成本的Android屏幕适配方式(头条)

支持多种屏幕(官方)

Android 屏幕适配从未如斯简单(8月10日最终更新版)

屏幕适配问题汇总及解决

骚年你的屏幕适配方式该升级了!-今日头条适配方案

5 Android 权限适配

Android M 运行时权限实践全解析

一句代码搞定权限请求,从未如此简单

Android6.0动态权限shouldShowRequestPermissionRationale的含义

官:在运行时请求权限

官:系统权限

6 进程保活相关(应用锁需求)

Android进程保活招数概览

Tinker隐藏Notification方案

android进程保活实践

android进程保活实践:下篇

Android通过JobScheduler与设置前台服务实现进程保活

Android应用保活四步曲

Android 进程保活–无限播放音乐

Android 进程常驻(0)—-MarsDaemon使用说明

后台执行限制

进程保活方案

关于 Android 进程保活,你所需要知道的一切

Android AppLock(应用锁)开发

通过 ANDROID 辅助功能「ACCESSIBILITY SERVICE」 检测任意前台界面

7 添加 Window 权限适配

总结:
API <= 24(7.0) 使用 TYPE_TOAST 漏洞可以不用申请权限,直接显示
API >= 25(7.1.1) TYPE_TOAST 漏洞已修复,需要申请“允许显示在其他应用上层”权限,使用 TYPE_SYSTEM_ALERT
API >= 26(8.0) 系统将会限制 TYPE_TOAST 的使用,会直接抛出异常,使用 TYPE_APPLICATION_OVERLAY

Android 悬浮窗权限各机型各系统适配大全

FloatWindowPermission

Android悬浮窗遇到的那些坑

FFloater

Android判断应用或Activity是否存在

根据机型适配跳转到权限设置页面

根据机型适配跳转到权限设置页面2

根据机型适配跳转到权限设置页面3

根据机型适配跳转到权限设置页面4

7.1 Window 全屏设置


实现:当手机开启导航栏时仍然全屏

 public WindowManager.LayoutParams getWindowParams() {
        WindowManager.LayoutParams layoutParams;
        if (!PermissionUtil.isOverMarshmallow()) {
            // < 6.0 使用 TYPE_TOST
            if (RomUtils.checkIsOppoRom()) {
                layoutParams = new WindowManager.LayoutParams(-1, -1, WindowManager.LayoutParams.TYPE_PRIORITY_PHONE, 263176, TRANSLUCENT);
            } else {
                layoutParams = new WindowManager.LayoutParams(-1, -1, WindowManager.LayoutParams.TYPE_TOAST, 263176, TRANSLUCENT);
            }
        } else {
            if (PermissionUtil.isOverO()) {
                // >= 8.0
                layoutParams =  new WindowManager.LayoutParams(-1, -1, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, 263176, TRANSLUCENT);
            } else {
                layoutParams = new WindowManager.LayoutParams(-1, -1, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 263176, TRANSLUCENT);
            }
        }
        layoutParams.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
		//布局不受限制
        layoutParams.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
        layoutParams.x = 0;
        layoutParams.y = 0;
        NoxApplication context = NoxApplication.getInstance();
        WindowManager mWm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = mWm.getDefaultDisplay();
        Point p = new Point();
        display.getRealSize(p);
        int statusHeight = ScreenUtil.getStatusHeight(NoxApplication.getInstance());
        Log.d("hj", "WindowPermissionHelper.getWindowParams: statusHeight:" + statusHeight);
        int navigationHeight = ScreenUtil.getNavigationHeight(NoxApplication.getInstance());
        Log.d("hj", "WindowPermissionHelper.getWindowParams: navigationHeight:" + navigationHeight);
        layoutParams.width = p.x;
        layoutParams.height = p.y + navigationHeight;
        Log.d("hj", "WindowPermissionHelper.getWindowParams: height:" + p.y);
        Log.d("hj", "WindowPermissionHelper.getWindowParams: width:" + p.x);
        return layoutParams;
    }

	
	View childAt = topBar.getChildAt(0);
    LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) childAt.getLayoutParams();
    layoutParams.topMargin = ScreenUtil.getNavigationHeight(this);

Android 如何让悬浮窗口覆盖显示在导航栏之上?

像360悬浮窗那样,用WindowManager实现炫酷的悬浮迷你音乐盒(上)

7.2 Window 中监听返回键

在Activity,Service,Window中监听Home键和返回键的一些思考,如何把事件传递出来的做法!

官网:Window 各种 Flag 详解


注意:主要的限制在 FLAG_NOT_FOCUSABLEWindowManager.LayoutParams.flags 中不能设置该 flag,否则监听不到返回键
可以使用:windowParams.flags &= ~FLAG_NOT_FOCUSABLE 消除该 flag

8 Android 7.0 FileProvider 适配

Android 7.0 行为变更 通过FileProvider在应用间共享文件吧

解决 Android N 7.0 上 报错:android.os.FileUriExposedException

使用FileProvider解决file:// URI引起的FileUriExposedException

Android打开指定文件实践 工具类

9 AlarmManager 使用

关于android的alarmmanager使用过程中的坑(包括魅族手机休眠后无法启动闹钟的问题)

定时任务,AlarmManager使用

10 AccessibilityService 使用

Android辅助功能AccessibilityService的使用

Android辅助功能原理与基本使用详解-AccessibilityService

AccessibilityService 从入门到出轨

Android自动化测试中AccessibilityService获取控件信息(1)

AccessibilityService分析与防御

11 Android 自定义应用选择器

Android-自定义应用选择器

12 迎接 Androidx

问题:

Androidx和Android support库共存问题解决

Android:你好,androidX!再见,android.support

参考:

support 库官网

AndroidX Overview 官网

原包转换为androidx(Migrating to AndroidX)

13 Notification 监听

NotificationListenerService的那些事儿

NotificationListenerService不能监听到通知,研究了一天不知道是什么原因?

NotificationCollectorMonitorService.java

一次 NotificationListenerService 体验

Android利用NotificationListenerService实现消息盒子功能

13.1 通知栏适配

Android通知栏介绍与适配总结

Android推送通知权限判断及跳转到权限设置界面(完善兼容8.0)

android 8.0 获取通知栏开关状态

最近的文章

leetcode 初级算法相关

领扣 算法初级题库 1 数组1.1 从排序数组中删除重复项问题描述:从排序数组中删除重复项给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,0,1,...…

继续阅读
更早的文章

Kotlin 项目(二)

1 常见问题1.1 please select android sdk问题描述:提示选择 sdk 版本,但是已经配置 sdk。as 清理缓存、clean 都不行,external libraries 中没有 Android API 只有一个 Kotlin SDK解决方案:在主 module 下 app.iml 中替换如下:<orderEntry type="jdk" jdkName="Kotlin SDK" jdkType="KotlinSDK" />替换为:<order...…

继续阅读