excel怎样定义内涵用户类型-英雄云拓展知识分享
418
2024-02-01
【摘要】 你的Android12适配工作完成了吗?!
10 月 4 日,谷歌将Android12源代码推送至 Android 开源项目 (AOSP)。自从2021年2月发布Android12第一个预览版以来,历经9个月时间测试和优化,正式版本的Android12终究来了!不但在UI方面做了很多升级,Android12对个人隐私可靠的保护也得到了进一步增强。整体来说,Android12更加智能、高效率和安全,感兴趣的开发者可以登录官网下载源码测试学习。
个推服务开发者多年,打磨SDK产品的同时,一直密切关心和跟进行业发展趋势。Android12稳定版发布后,我们使用摹拟器进行了研究和适配测试。本文将从安全变更、权限变化、性能更新等方面来谈谈 Android12 新特质,以帮助开发者更快捷、更便捷地上手适配Android新系统。
从事Android开发的同学都知道,Android有4大组件,分别是活动(Activity)、服务(Service)、广播接收器(Broadcast Receive)和内容提供器(Content Provider)。Activity组件为用户提供可视化操作界面;服务组件在后台运行,支持各类功能的实现;广播接收器顾名思义主要用于接受各种广播;内容提供器主要支持多个利用中存储和读取数据,相当于一个数据库。
这4大组件赋予了App各种各样丰富的功能,因此不管是对App还是用户来说,它们的安全性都相当重要。**在App开发进程中,会有一些特定需求使用到第3方SDK,如支付、消息推送等,这些都会触及到组件导出的问题。**为保护隐私和改良整体用户体验,Android12对组件的导出有了更严格的要求。
使用Android12的开发者需要关心,**如果您对4个组件配置了intent 过滤器,则务必要在代码中显式声明android:exported 属性。**如果未设置该属性,那利用将没法安装在 Android12 上。
android:exported 属性声明朝码示例:
<service android:name="com.example.app.backgroundService"
android:exported="false">
<intent-filter>
<action android:name="com.example.app.START_BACKGROUND" />
</intent-filter>
</service>
复制代码
PendingIntent是一种特殊的Intent,和Intent的区分在于Intent是立刻履行的,而PendingIntent不是,可以被理解为一种异步处理机制。PendingIntent履行的操作实质上是参数传进来的Intent操作,像通知栏消息的发送就是使用PendingIntent实现。
为了提升利用的安全性,Android12新特质要求利用创建的每一个PendingIntent对象都要指定可变性, 使用PendingIntent.FLAG_MUTABLE 或PendingIntent.FLAG_IMMUTABLE标志。
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),
REQUEST_CODE,
intent,
PendingIntent.FLAG_IMMUTABLE);
复制代码
如果不设置任一可变性标志, 系统将会抛出IllegalArgumentException异常,报错内容以下:
java.lang.IllegalArgumentException:XXX: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
复制代码
而对一般的intent而言,开发者如何确保其安全性呢?Android12为开发者们提供了一种调试功能,如果利用以不可靠的方式启动intent,此功能将会发出正告。具体实现也比较简单,开发者在application中添加以下代码便可:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
// Other StrictMode checks that you've previously added.
// ...
.detectUnsafeIntentLaunch().penaltyLog()
// Consider also adding penaltyDeath()
.build());
}
复制代码
这里要非常注意嵌套intent。嵌套intent是在其他intent中作为extra传递的intent。如果有以下行动,系统将产生StrictMode背规正告:
①从intent的extra中解析提取嵌套intent。
②使用该嵌套intent启动利用组件,例如将intent传递给startActivity()。
关于嵌套 intent 安全问题, 这篇文章写得比较详细,感兴趣的开发者可以深入浏览:blog.csdn.net/m0\_5754698…
为了更好地保障用户的个人信息,Android12引入了大致位置选项、利用休眠、ADB备份限制等新的隐私功能。
Android12之前,用户在授与位置信息访问权限时只能允许系统层面的设置,如果想要更改某一特定利用的位置权限,则需要找到相应的设置界面进行手动处理。为了更好地保护用户隐私,Android12引入了“大致位置”选项。当利用需要访问位置权限时,弹窗将会出现“确切位置”和“大致位置”两个选项供用户进行授权:
确切位置,通常精确到几米以内。
大致(粗略)位置,通常是几百米。
位置信息一共有3种授权方式:仅在使用该利用时允许、仅限这一次和不允许。个推对这些授权方式进行了实测:
①如果Manifest 配置了且要求了Manifest.permission.ACCESS_COARSE_LOCATION位置弹框:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
}
}
复制代码
在前端界面将会出现弹框以下:
②Android12要求,必须同时申请大致(粗略)位置和确切位置的权限,才能完成ACCESS_FINE_LOCATION 确切位置权限的授权。所以,如果Manifest没有配置<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION" />但是要求Manifest.permission.ACCESS_FINE_LOCATION 弹框, 则前端界面会弹出和 ① 情况一致的弹框,即“大致(粗略)位置弹框”。
③如果Manifest配置了 和<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION" /> ,且同时要求两个位置权限的弹框:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
}
// 和以下代码调用, 弹框一致
requestPermissions(new String[] {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 1);
@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
}
复制代码
在前端界面将会出现弹框以下:
④ 在第③种情况下,针对用户的选择,会出现以下几种情况:
a. 如果用户选择了“确切位置”, 同时选择了“仅在使用该利用时允许”或“仅限这⼀次”,onRequestPermissionsResult 参数int[] grantResults 两个返回值均为0,表示已授权,利用重启后权限将仍保持授权状态。
★ 也就是说,“仅限这一次”并不是严格意义上的仅限这一次授权。对当前利用完成授权后,下次重启该利用将还是已授权状态。
b. 如果位置选择了“大致位置”, 同时选择了“仅限这⼀次”, onRequestPermissionsResult参数int[] grantResults返回值为0 和⑴,意味着此次“大致位置”已授权, 但“确切位置”仍未授权。下次启动再次调用requestPermissions(new String[] {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 1), 则弹框以下: 从“大致位置”改成“确切位置”弹框询问,此时“大致位置”已默许授权。
如果用户选择 “继续使用大致位置”, 则int[] grantResults 返回值仍为0和⑴ , 下次要求还会出现一样弹框内容。
如果选择“仅限这一次”, 则int[] grantResults返回值为0和0 ,下次启动利用时,两个位置权限将仍保持授权状态。
以上测试总结以下:
关于权限申请这块,Google给我们提供了很好的示例, 以下代码, 感兴趣的开发者可以针对“位置”选择和“选项列表”选择分别调试看看效果。更多关于Android12的位置权限变更内容,可参考:developer.android.com/about/versi…
ActivityResultLauncher<String[]> locationPermissionRequest =registerForActivityResult(new ActivityResultContracts
.RequestMultiplePermissions(), result -> {
Boolean fineLocationGranted = result.getOrDefault(
Manifest.permission.ACCESS_FINE_LOCATION, false);
Boolean coarseLocationGranted = result.getOrDefault(
Manifest.permission.ACCESS_COARSE_LOCATION,false);
if (fineLocationGranted != null && fineLocationGranted) {
// Precise location access granted. }
else if (coarseLocationGranted != null && coarseLocationGranted) {
// Only approximate location access granted. } else {
// No location access granted.
}
} );
locationPermissionRequest.launch(new String[] {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION});
复制代码
★ Android12的位置权限变更对旅游出行、地
另外,Android12还对Android11 “自动撤消权限”功能进行了升级,引入了“利用休眠”功能。App自动休眠功能代码由谷歌于今年一月份在AOSP系统项目中提交。这项功能可让用户自行标记出一个利用列表,受标记的利用如果几个月未被使用,则系统会自动取消其权限、停止各种后台通知,将该利用置于休眠状态,以省电并移除其占有的利用空间。Android12的该功能不但有助于释放手机存储空间,还将极大提升用户体验。
★对用户交互频率较低的特定类型利用而言,开发者可以调用包括 Intent.ACTION_APPLICATION_DETAILS_SETTINGS intent 操作的intent,向用户发送要求,让其准予利用免于休眠和自动重置权限限制。
同时,为了帮助保护私有利用数据,Android12还更改了adb backup命令的默许行动。对以Android12为目标平台的利用,当运行adb backup命令时,从装备导出的其他任何系统数据都不会包括利用的数据。
如果测试或开发工作流程依赖于使用adb backup的利用数据,则可以选择在AndroidManifest文件中将android:debuggable设置为true来导出利用数据。注意,release线上版本务势必android:debuggable设置为false。
性能优化是Android系统每次版本更新的重点内容。Android12改进了利用程序启动时间并优化了I/O,以加快利用程序加载速度。同时,为改进用户体验,Android12对通知trampoline、前台服务启动和闹钟权限等均进行了限制。
当用户点击通知后,会启动一个组件来响利用户的点击操作, 一般终究会打开一个界面。这个界面组件就是通知trampoline。
斟酌⼀种情形, 如果通知构造的PendingIntent使用了PendingIntent.getService或 PendingIntent.getBroadcast, 那末,当打开通知时后台可能需要做一些耗时操作或要求网络等, 等处理完成以后再跳转到目标页面。但有时候网络、耗时操作等各种缘由会造成等候时间较长, 进而致使界面弹出较晚, 以致几秒后才跳转出⼀个页面, 这类体验相对而言比较差。
为了改进用户体验,以Android12为目标平台的利用没法从用作通知 trampoline的服务或广播中启动activity,也就是说利用构造的通知 setContentIntent()参数必须是 PendingIntent.getActivity。
个推对该功能进行了测试:
创建通知, setContentIntent() PendingIntent参数使用 PendingIntent.getService或PendingIntent.getBroadcast构造 PendingIntent;
通知触发的目标组件, 也就是点击通知后启动的Service或Broadcast, 启动某个Activity;
弹出通知后, 利用切换到后台, 此时再点击通知, 会报以下毛病, 且终究页面没法被启动
system_process E/NotificationService: Indirect notification activity start (trampoline) from com.gt.brand.push.tst1 blocked ... system_process E/ActivityTaskManager: Abort background activity starts from 10146
对大部份App开发者来说,实现通知trampoline的兼容,只需要将利用构造的通知 setContentIntent()参数修改成 PendingIntent.getActivity便可。
但是对有特殊功能需求的开发者来说,如果之前的业务逻辑是点击通知以后需启动服务/广播,并在服务/广播中完成⼀些动作(比如打点或发送回执)后才启动目标 Activity,那末直接将setContentIntent()参数改成 PendingIntent.getActivity,同时这个目标Activity正好是第3方页面的话,点击通知后,直接启动的就是第3方页面,而开发者本身的业务需求则将没法得到处理。
针对此情况,个推提出了两个可参考的方案:
①在SDK中新增⼀个透明中转 Activity, 通知点击启动这个透明Activity 以后, 在透明Activity onCreate 方法中再启动目标服务或广播, 后续逻辑保持⼀致。theme务必配置成android:style/Theme.Translucent.NoTitleBar, 透明activity务必记得要在onCreate最后调用finish方法烧毁这个页面。
<activityandroid:name="透明中转 activity"
android:excludeFromRecents="true"
android:exported="false"
android:taskAffinity="xxx"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
</activity>
复制代码
②新增一个BaseActivity, 在BaseActivity完成业务逻辑,目标Activity继承这个BaseActivity, 并让目标Activity调用super方法。
相比第2种方案,第一种方案对客户来说无需做额外处理,集成起来更加方便。因此,这种情况下,个推SDK产品使用的就是第一种方案进行Android12适配。
除一些特殊情况外,以 Android12 为目标平台的利用将没法在后台运行时启动前台服务。如果利用尝试在后台运行时启动前台服务,将会引发异常。针对此情况,Android12官网也给出了前台服务的推荐替换方案:WorkManager。感兴趣的开发者可进入官网了解详情:developer.android.google.cn/about/versi…
闹钟是利用安排定时工作的重要方式。在大多数情况下,利用应当使用非精确闹钟(inexact alarms),这样可以减少电池消耗。但是对提供时间管理、日程安排等服务的App而言,必须使用精确的闹钟权限才能实现相干功能。精确闹钟功能非常方即可靠,但也会加大电量消耗。为增加用户的自主权,提升用户体验,Android12 对精确的闹钟权限进行了限制。
在Android12系统下,开发者如果想要使用精确闹钟,则需要****在 AndroidManifest.xml 文件中添加该权限的申请:
setAlarmClock()
setExact()
setExactAndAllowWhileIdle()
以下设置>利用>特殊利用权限>闹铃和提示 可以看到需要精确闹钟权限的利用列表:
并且,用户可以为某一特定利用手动关闭或打开该权限:
Android12的新特质还有很多,比如添加了 SplashScreen API,让App开发者可以自主设置启动利用的画面主题和外观;提供通知的丰富MessagingStyle() 和 BigPictureStyle() 通知中提供动画 后续,个推还将延续关心安卓系统和行业发展动态,与开发者们交换相干开发知识和技术原理,共同推动移动互联网的快捷发展。
🌟 选择英雄云hpapaas 开启自动化、智能化企业转型未来 🌐 >>>>作为一款提供hpaPaaS平台服务的英雄云,有什么优势呢?面对数字化转型的挑战与机遇,选择一个适合自己企业的高度信息化、智能化和自动化的管理系统尤为重要。英雄云是一个值得考虑的选择。英雄云提供了一系列独特的优势,使其成为企业智能管理的首选。下面是英雄云的八大优势:
: 英雄云的平台无需编程知识,即可操作自定义的管理系统:ERP系统、CRM系统、进销存系统、人事行政OA系统、WMS系统等。这意味着用户无需拥有编程技能,也能轻松操控自己的系统。
: 英雄云允许用户根据自己的业务需求、企业规模、成员人数、所需系统等等,进行高度定制服务;三大业务引擎:云表单(进阶版Excel)、工作流程(智能自动触发流程)以及仪表盘(可视化报表),帮助企业进行更简易的业务操作。
:无论是数据录入、审批流程还是报表生成,都可以轻松自动化,使员工能够专注于更有价值的任务。这种减免重复工作的方式不仅提高了工作效率,还降低了错误发生的可能性,为企业节省了时间和资源。
: 英雄云与其他常用企业应用和工具具有良好的生态系统集成能力,可以轻松集成与第三方系统,如财务软件、邮件服务等,实现全面的业务支持。
: 英雄云提供先进的数据分析工具如数据加工工厂,帮助用户更好地理解业务趋势和数据。这使得企业能够做出更明智的战略决策,优化业务流程。
: 英雄云不断进行系统的更新和改进,以适应不断变化的业务环境和技术趋势。这意味着您始终能够使用最新的功能和性能提升。
: 英雄云提供了多样化的部署选项,用户可以根据自身需求选择合适的部署方式,无需自主运维。无论是选择云端部署、私有云部署还是本地部署,英雄云都能提供灵活的解决方案。这意味着用户无需担心硬件维护、系统更新等问题,能够更专注于业务运营,降低了IT运营成本和风险。
: 英雄云提供免费版本,用户可以在免费版本中获得一定数量的表单数据量和企业数据总量,为小型企业提供了经济实惠的选择。
选择英雄云作为您的数字化管理系统,将带来高度的灵活性、可定制性和效率提升。不管您的企业规模如何,英雄云都能满足您的需求,助力您的仓库管理更上一层楼。不妨注册一个英雄云账户,亲自体验这些优势,并让您的企业管理更加智能化和高效化。
免责声明:
本网址(www.yingxiongyun.com)发布的材料主要源于独立创作和网友匿名投稿。此处提供的所有信息仅供参考之用。我们致力于提供准确且可信的信息,但不对材料的完整性或真实性作出任何保证。用户应自行验证相关信息的正确性,并对其决策承担全部责任。对于由于信息的错误、不准确或遗漏所造成的任何损失,本网址不承担任何法律责任。本网站所展示的所有内容,如文字、
发表评论
暂时没有评论,来抢沙发吧~