Android上唤起 APP 场景的思考总结,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(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:
Android上唤起 APP 场景的思考总结,flutter通知推送

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

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

-c6jO9oOb-1643523789386)]

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

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

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

上一篇:【C#附源码】数据库文档生成工具支持(Excel+Html)


下一篇:linux——进程状态