ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android上唤起 APP 场景的思考总结,flutter通知推送

2022-01-30 14:33:43  阅读:244  来源: 互联网

标签:TASK AppStartType APP ACTIVITY FLAG flags RECEIVER Android flutter


FLAG_ACTIVITY_NEW_TASK

FLAG_RECEIVER_FOREGROUND

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS

3.第三方推送在 APP 被完全杀死前提下拉起

FLAG_ACTIVITY_NEW_TASK

FLAG_RECEIVER_FOREGROUND

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_REORDER_TO_FRONT

FLAG_RECEIVER_REPLACE_PENDING

4.APP 在后台被拉起,但不同推送 SDK 可能出现回调不一样的情况

onNewIntent方法 中回调

FLAG_ACTIVITY_NEW_TASK

FLAG_RECEIVER_FOREGROUND

FLAG_RECEIVER_REPLACE_PENDING

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_CLEAR_TOP

FLAG_RECEIVER_REPLACE_PENDING

FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT

onCreate方法 中回调

FLAG_ACTIVITY_NEW_TASK

FLAG_RECEIVER_FOREGROUND

FLAG_RECEIVER_REPLACE_PENDING

FLAG_ACTIVITY_SINGLE_TOP

FLAG_RECEIVER_FROM_SHELL

FLAG_ACTIVITY_BROUGHT_TO_FRONT

FLAG_ACTIVITY_REORDER_TO_FRONT

从上述4个场景中可知 任意一次拉起都会同时包含 FLAG_ACTIVITY_NEW_TASK 和 FLAG_RECEIVER_FOREGROUND。在符合这两个条件我们选择优先判断是否同时包含 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 和 FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS,其次再判断是否为 被动冷启动被动热启动

下面封装了一段代码可以直接使用。

public enum AppStartType {

NONE, //不属于拉起

AFTER_INSTALL, //安装后启动

LAUNCHER, //Launcher启动

COOL_BE_OPEN, //被动冷拉

HOT_BE_OPEN //被动热拉

}

@NonNull

public static AppStartType parseStartType(Intent intent) {

parseIntent(intent, “打印intent”);

if (intent != null) {

int flags = intent.getFlags();

if ((flags & FLAG_ACTIVITY_NEW_TASK) == FLAG_ACTIVITY_NEW_TASK && (flags & FLAG_RECEIVER_FOREGROUND) == FLAG_RECEIVER_FOREGROUND) {

flags = flags ^ FLAG_ACTIVITY_NEW_TASK ^ FLAG_RECEIVER_FOREGROUND;

if (flags != 0) {

if ((flags & FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == FLAG_ACTIVITY_RESET_TASK_IF_NEEDED && (flags & FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS) == FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS) {

return AppStartType.LAUNCHER;

} else if ((flags & FLAG_RECEIVER_REPLACE_PENDING) == FLAG_RECEIVER_REPLACE_PENDING) {

if (((flags & FLAG_ACTIVITY_CLEAR_TOP) == FLAG_ACTIVITY_CLEAR_TOP && (flags & 0x04000000) == 0x04000000) || (flags & 0x00400000) == 0x00400000) {

return AppStartType.HOT_BE_OPEN;

}

if ((flags & FLAG_ACTIVITY_REORDER_TO_FRONT) == FLAG_ACTIVITY_REORDER_TO_FRONT) {

return AppStartType.COOL_BE_OPEN;

}

return AppStartType.NONE;

} else {

return AppStartType.NONE;

}

} else {

return AppStartType.AFTER_INSTALL;

}

}

}

return AppStartType.NONE;

}

值得注意的是,被动热拉 在拉起主页面不同厂商的 SDK 回调不一样,因此还需要在 onCreate方法 或者 onNewIntent方法 判断下。

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 防止安装完直接点击打开然后Home键回到桌面再点击图标导致的多个实例

// (getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0

if (!isTaskRoot()) {

ActivityUtils.AppStartType startType = ActivityUtils.parseStartType(getIntent());

if(startType == ActivityUtils.AppStartType.HOT_BE_OPEN){

//处理业务逻辑

总结

最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

-c6jO9oOb-1643523789386)]

[外链图片转存中…(img-wAWgOeRj-1643523789388)]

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

标签:TASK,AppStartType,APP,ACTIVITY,FLAG,flags,RECEIVER,Android,flutter
来源: https://blog.csdn.net/m0_66155658/article/details/122752630

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有