扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
为降低功耗,无论应用的目标 SDK 版本为何, Android 8.0 都会对后台应用检索用户当前位置的频率进行限制。
创新互联服务项目包括尖扎网站建设、尖扎网站制作、尖扎网页制作以及尖扎网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,尖扎网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到尖扎省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
系统会对前台应用和后台应用进行区分。应用满足以下任一条件即视为前台应用:
如果应用在运行 Android 8.0 的设备上处于前台,其位置更新行为将与 Android 7.1.1 (API 级别 25)及更低版本上相同。
调用 startForeground(NOTIFY_ID, noHelper.getNotification()); ,让服务运行于前台,此方法采用两个参数:唯一标识通知的整型数和状态栏的 Notification 。
但是,如果您在服务正在前台运行时将其停止,则通知也会被移除。
FrontNotificationHelper 类构建一个通知,并通过 getNotification() 将 Notification 返回到 FrontService 。
目前主要使用的定位功能是 GPS 定位和百度地图的定位服务。
我们不在 FrontService 直接调用 GPSLocationProvider 或者 BaiduLocationProvider ,而是另外再封装一层 LocationHelper ,在 LocationHelper 中调用位置服务。
这样做的好处是可以在 FrontService 切换使用 GPSLocationProvider 或者 BaiduLocationProvider ,而且 FrontService 中调用不变。
1.通知中心
用户在通知界面可以发现顶部的快捷键有了更充裕的空间,并且根据网络大数据的用户使用频繁度调整了这几个快捷键的顺序;并且长按推送消息可以看到一个开关,操作它可以开启和关闭这个该应用的未来所有通知。
2.设置菜单
在新的AndroidO系统中,设置的界面有了大幅变化,主菜单的覆盖性变得更广,更多的功能将在子菜单中体现,并且在菜单界面中重新设计了很多图标。
3.PinnedShortcuts
iPhone6S中添加了一个苹果的“独家秘方”——3DTouch,自然安卓系统也不会放过这个好用的功能,于是就创造出了PinnedShortcuts功能,长按一个软件后可以弹出子菜单,然后就可以通过这个方式快捷的使用该应用的部分功能。
4.图标形状
新的系统中开发者可以使用不同的应用图标,比如圆角矩形或者圆形图标,不过所有的图标需要保证是同一个形状,不能有一个方一个圆这样“个性”的样式出现。
5.后台限制
AndroidO将进一步优化后台
画中画功能
程序,减少应用在没完全退出后占用系统的资源,并且减少电量的消耗,进一步向iOS学习。
6.安装限制
新系统中用户可以在权限设置中添加安装限制功能,这样可以有效的避免带有中国特色的“全家桶”行为。
7.TensorFlowLite
这个新功能并不会直接体现在手机和系统中,它是谷歌的一项新技术,用来把人工智能在更多的软件上继续拓展,并提高工作处理的效率,让你的手机更“聪明”。
8.分屏
在AndroidO中,分屏画中画功能得到了强化,变得更加流畅,而且悬浮窗可以随意拖动位置,然后在主屏幕中继续工作[2] 。
Notification Dots
正在播放视频的窗口可以悬浮在其他正在使用的App上方,用户可以完成多任务操作。此前,三星和LG等手机厂商自行“改造”安卓系统,已经融入这一功能好多年[3] 。
9.NotificationDots
在谷歌的Pixel手机上,安卓8还新加了通知功能Notification Dots,会标出用户的行程、信息等,有些通知还可以被设定为稍后提醒。此外长按某个应用图标现在可以显示一些信息,与iOS上的3D Touch类似,这项功能在安卓7.0上已经有所体现[3] 。
10.SmartTextSelection
系统将会预测用户将使用某些电话或者其他选项出现在将会用到的应用中,举个例子就是如果邀请朋友来吃饭,系统会根据发送的地址来开启地图并且导航[2] 。
11.自动保存密码
这个功能将会保存用户的部分帐号和密码,用于在网站或者应用中的快速登录,效率提升了不少[2] 。
12.GooglePlayProtect
这个功能主要用于GooglePlay中,下载的应用和游戏将会经过它的排查,来看看是否是有害甚至携带病毒的应用,不过国内用户可能不能访问GooglePlay[2] 。
13.应用加速
在AndroidO中,大部分应用的启动速度将会快上一倍,这个要归
符合Unicode 10标准的表情符号
功于新系统的优化,使后台占用资源减少,并且对并发进程等问题的处理更加出色,也是个相当有用的功能[2] 。
14.字体优化
AndroidO中谷歌还增加了对系统字体的更多支持,开发者可以自行更改字体样式,让用户有了更多字体的选择[2] 。
15.表情符号
安卓8还带来了符合Unicode 10标准的表情符号,比原来新加超过60个表情符,这也是比较明显的改变之一
谷歌刚刚发布了Android O技术预览版,为了提升续航和减少耗电,Android进一步限制了后台服务的运行。本文将为大家介绍Android O新增的后台服务限制,翻译自Android O开发者博客,原文在 这里 。
当应用在后台运行时,仍然会占用系统的内存。如果在后台运行的应用比较多,并且用户正在玩游戏或者看视频的时候,那么很容易会导致系统卡顿。为了提升用户体验,Android O增加了对后台应用的限制。这篇文章将介绍系统对后台应用运行的限制,以及开发者应该如果修改应用以适应这个限制。
在Android系统中,很多应用和服务是可以同时运行的。比如说,用户可以在一个窗口中玩游戏,在另一个窗口中浏览网页,同时使用第三个应用来听音乐。同时运行的应用越多,系统的负载就越大。如果又有其他的应用或者服务在后台运行的话,那么又会增加系统的负载,最后导致系统卡顿,影响到用户体验,比如正在播放的音乐会突然停止。
为了减少系统卡顿,Android O限制那些用户不再直接交互应用的运行。针对targetSdkVersion是Android O的应用,Android增加了以下两种方式的限制:
大多数情况下,应用可以使用 JobScheduler 的Jobs来绕开上述的限制。即使应用没有处于运行状态,应用可以安排 JobScheduler 的Jobs来执行什么工作,系统会在不影响用户体验的情况下,调度这些Jobs的运行。
后台服务会占用系统资源,这个会导致糟糕的用户体验。为了解决这个问题,Android O对应用的后台服务增加了一堆的限制。注意这些限制仅仅是针对targetSdkVersion为Android O的应用,targetSdkVersion为25或者以下的应用不受影响。
系统会区分前台和后台应用。当满足以下任意一个条件时,系统判定应用是前台的:
以上条件都不满足,那么应用就被系统认为是后台应用。
前台应用可以自由地运行前台和后台服务。当应用进入后台之后,它仍然有几分钟的时间窗口来启动和运行服务。当这个时间窗口到期时,应用就进入空闲状态,系统将停止应用的后台服务运行,这个操作和服务的 Service.stopSelf() 方法被调用类似。
某些情况下,后台应用会被临时加入到白名单中运行几分钟。应用在白名单中时,它可以启动服务而不受限制,并且后台服务也被运行。当需要处理对用户可见的任务时,应用将被添加到白名单中,比如:
大多数时候,你的应用都可以用 JobScheduler 替换掉后台服务。比如,CoolPhotoApp需要检查用户是否接收到好友分享的图片,即使应用不在前台运行。按照之前的做法,应用需要使用后台服务去执行这个任务。升级到Android O后,开发者需要用按一定周期运行的Job替换掉后台服务来执行,查询服务器,完成后退出。
在Android O之前,创建一个前台服务的通常做法是先创建一个后台服务,然后将其提升到前台 。但这个做法到了Android O已经失效了。Android O提供了另外一个方法[ NotificationManager.startServiceInForeground() ]( (android.content.Intent , int, android.app.Notification)),来创建前台服务。用这个方法创建的新服务永远不会进入后台,所以不会受到后台服务的运行限制。
如果应用注册了广播,那么只要有广播发送,应用的广播接收器就会自动运行,占用系统资源。当很多应用都注册了某个系统事件广播时,那么就会出现性能问题,因为当系统事件触发广播时所有的应用的接收器在很短的时间内都会被顺序运行,这样就会影响用户体验。为了解决这个问题,Android 7.0增加了对广播的限制。Android O进一步加强了这个限制。
大多数情况下,应用之前注册的隐式广播可以用功能类似的 JobScheduler 的job替代。比如,一个社交图片类- -应用经常会在设备充电时,清除使用过程中产生的数据。该应用会在Manifest注册ACTION_POWER_CONNECTED广播,当接收到这个广播是,执行清理的工作。升级到Android O时,应用需要删除注册的这个广播,然后使用一个清理的job,这个job会在设备空闲并且充电时自动触发执行。
有一部分隐式广播是不受这个限制的,应用可以继续在Manifest中注册使用,不管应用的targetSdkVersion是多少。这部分不受限制的广播,可以查看 Implicit Broadcast Exceptions 。
上面介绍的这些变化不会影响到targetSdkVersion是25或者以下的应用 。但是如果应用是targetSdkVersion是Android O对应的API级别,需要修改应用以遵守这些新的限制。
如果应用在空闲状态仍然在运行后台服务,那么你需要替换掉这些后台服务。可以采用如下的方案:
检查在Manifest注册的广播,替换掉隐式广播:
Android O 允许以画中画 (PIP) 模式启动操作组件。PIP 是一种特殊的多窗口模式,最常用于视频播放。目前,PIP 模式可用于 Android TV,而 Android O 则让该功能可进一步用于其他 Android 设备。
当某个 Activity 处于 PIP 模式时,它会处于暂停状态,但仍应继续显示内容。因此,您应确保您的应用在 onPause() 处理程序中进行处理时不会暂停播放。相反,您应在 onStop() 中暂停播放视频,并在 onStart() 中继续播放。如需了解详细信息,请参阅 多窗口生命周期 。
要指定您的 Activity 可以使用 PIP 模式,请在清单中将 android:supportsPictureInPicture 设置为 true。(从 Android O 开始,如果您打算在 Android TV 或其他 Android 设备上支持 PIP 模式,则无需将 android:resizeableActivity 设置为 true;只有在您的 Activity 支持其他多窗口模式时,才需要设置 android:resizeableActivity。)
多窗口模式不会更改 Activity 生命周期 。
在多窗口模式中,在指定时间只有最近与用户交互过的 Activity 为活动状态。 该 Activity 将被视为顶级 Activity。 所有其他 Activity 虽然可见,但均处于暂停状态。 但是,这些已暂停但可见的 Activity 在系统中享有比不可见 Activity 更高的优先级。 如果用户与其中一个暂停的 Activity 交互,该 Activity 将恢复,而之前的顶级 Activity 将暂停。
Android O 引入一种新的对象 PictureInPictureParams ,您可以将该对象传递给 PIP 函数来指定某个 Activity 在其处于 PIP 模式时的行为。此对象还指定了各种属性,例如操作组件的首选纵横比。
现在, 在添加画中画 中介绍的现有 PIP 函数可用于所有 Android 设备,而不仅限于 Android TV。此外,Android O 还提供以下函数来支持 PIP 模式:
您的应用可以决定何时触发 PIP 模式。以下是一些关于何时进入 PIP 模式的示例:
PIP 窗口为 240x135 dp,在屏幕角落的最顶层显示,由系统在四个角落中选择一个角落。 用户可以调出 PIP 菜单,将 PIP 窗口切换为全屏,或通过按下遥控器上的主页按钮关闭 PIP 窗口。 如果主屏幕开始播放另一个视频,PIP 窗口将自动关闭。 用户还可以通过“最近使用记录”关闭 PIP 窗口。
PIP 利用 Android N 中提供的多窗口 API 显示固定视频层叠窗口。 如需将 PIP 添加到应用,您需要注册支持 PIP 的 Activity,然后根据需要将 Activity 切换到 PIP 模式,并确保隐藏所有 UI 元素,且 Activity 处于 PIP 模式时视频继续播放。
默认情况下,系统并不自动为应用提供 PIP 支持。如果想要应用支持 PIP,请将 android:supportsPictureInPicture 和 android:resizeableActivity 设置为 true,在清单中注册视频 Activity。 此外,应明确指定 Activity 处理布局配置变更,这样,在 PIP 模式过渡期间发生布局变更时,Activity 不会重新启动。
在注册 Activity 时,请记住,在 PIP 模式中,您的 Activity 在电视屏幕上的小层叠窗口中显示。 视频播放 Activity 结合以尽量小的 UI 可以实现最佳用户体验。 在切换到 PIP 模式后,UI 元素较小的 Activity 带来的用户体验可能较差,因为用户在 PIP 窗口中看不到 UI 元素的详细信息。
在需要将 Activity 切换到 PIP 模式时,请调用 Activity.enterPictureInPictureMode()。在下面的示例中,当用户选择媒体控制栏上的专用 PIP 按钮时,系统切换到 PIP 模式:
在媒体控制栏上添加 PIP 按钮可以方便用户在控制视频播放的同时切换到 PIP 模式。
Android N 中包含一个新的 PlaybackControlsRow.PictureInPictureAction 类,它可以定义控制栏 PIP 操作并使用 PIP 图标。
在 Activity 进入 PIP 模式时,Activity 应仅显示视频播放。 在 Activity 进入 PIP 模式前删除 UI 元素,当 Activity 再次全屏显示时恢复这些元素。重写 Activity.onPictureInPictureModeChanged() 或 Fragment.onPictureInPictureModeChanged(),并根据需要启用或禁用 UI 元素,例如:
在 Activity 切换到 PIP 模式时,系统会认为 Activity 处于暂停状态,并调用 Activity 的 onPause() 方法。 如果 Activity 因为 PIP 模式暂停,视频播放不应暂停,而是应继续播放。 在 Activity 的 onPause() 方法中检查 PIP,并对播放做相应处理,例如:
当 Activity 退出 PIP 模式并回到全屏模式时,系统会恢复 Activity 并调用 onResume() 方法。
在您的应用中,用户可以在浏览主屏幕中的内容时选择一个新的视频,视频播放 Activity 处于 PIP 模式。 在现有播放 Activity 中全屏模式下播放新视频,而不是启用可能使用户感到困惑的新 Activity。
若要确保视频播放请求使用的是单个 Activity 并根据需要进入或退出 PIP 模式,在您的清单中将 Activity 的 android:launchMode 设置为 singleTask:
在您的 Activity 中,替换 Activity.onNewIntent(),处理新视频,如果需要,停止任何现有视频播放。
PIP 用于全屏播放视频的 Activity。在 Activity 切换到 PIP 模式时,应避免显示除视频外的其他内容。根据处理画中画模式中的 UI 中所述,在 Activity 进入 PIP 模式时进行跟踪,并隐藏 UI 元素。
由于 PIP 窗口悬浮在屏幕的角落,因此应避免在主窗口被 PIP 窗口遮挡的任何区域显示重要信息。
当 Activity 处于 PIP 模式时,其默认不获取输入焦点。要在 PIP 模式中接收输入事件,请使用 MediaSession.setMediaButtonReceiver()。
Android系统环境是64bit, 最近在预制一个第三方app, 发现预制完之后运行有问题,没有按照自己期望的32bit运行,而且按照默认64bit方式运行,导致加载的库错误,启动闪退, 编译的时候有添加LOCAL_MULTILIB := 32。
根据google官网,之前添加LOCAL_MULTILIB := 32一般都没有问题,于是很好奇,就查了下这个问题原因。网上搜索说android系统会把同一个uid进程,调整为同一个abi,也就是说系统签名(uid=system)app要么全是32bit,要么全是64bit。
打开PackageManagerService里面打印,跟踪下平台ABI适配情况,从打印看因为launch默认是64bit运行的,所以把其他system进程也全部调整为64bit。
从上面的日志,大概可以知道为什么这个app变成了64bit位运行了,下面也了解下android系统是怎么运行32/64bit 应用和加载对应的32/64bit库。
/data/system/packages.xml记录了系统安装的apk信息,primaryCpuAbi="armeabi-v7a" 是32bit安装,primaryCpuAbi="arm64-v8a 指示64bit安装,dumpsys package xxx 也可以查看安装信息。如果是64位安装就会64bit运行,加载64bit运行库。
这篇文档对Android.mk里面LOCAL_MULTILIB分析写的比较到位,也做了很多实验,总体结论是,LOCAL_MULTILIB :=32会拷贝32bit库到apk安装的路径,根据上面apk‘运行cpu api确定流程’可以知道,系统会根据lib库确定是32bit还是64bit, 如果确定了是32bit,最后还要根据系统同一个组uid的进程,调整cpu api, 这样最终确定当前apk安装的abi, 所以LOCAL_MULTILIB是间接影响apk最终是32bit,还是64bit运行,主要是保证拷贝abi库位数正确。
Android L开始 APK 64bit 32bit 运行环境原理及决定运行环境的规则
不带库的apk把LOCAL_PREBUILT_JNI_LIBS 相关的删除掉,带库的根据abi需要修改下lib/armeabi-v7a目录。
Android官网 - 了解 64 位版本
Android内置系统apk问题_Letcos-程序员信息网
Android 64bit系统中app以32bit运行
Android源码预制基础
Android L开始 APK 64bit 32bit 运行环境原理及决定运行环境的规则
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流