zoukankan      html  css  js  c++  java
  • 本地安装apk后直接打开,按下Home键再重新打开,然后按下返回键时页面展示错误的处理方法

    情景:

    1、下载apk到手机本地,点击本地apk开始安装

    2、安装完成后,一般会有 “完成” 和 “打开” 两个按钮,点击 “完成” 按钮时是没有问题的,不管它

    3、点击 “打开” 按钮,进入到首页(比如MainActivity),打开其他页面(比如GameActivity),然后按下Home键

    4、返回桌面后,再次点击桌面上的app图标

    • 我们的期望是:重新打开app之后,应该能看到 GameActivity 页面
    • 然而事实是:重新打开app之后,展示的是 MainActivity,当点击返回时,才看到GameActivity。也就是说,重新启动应用后,之前的页面也没有被kill掉,相当于打开了两个相同的应用。第一感觉就是 onCreate() 方法被反复调用,onResume() 没发挥作用。

    解决方法:

      网上都是说将第二个页面的launchMode属性设置为singleTask,比如说有两个页面,第一个是登录界面,第二个为主界面,将主界面的启动模式设置为singleTask,这样虽然按照之前的操作流程,在第二次打开应用,进到主界面的时候,只有一个,但是这样每次都要到登录界面再到主界面,情况虽然有所改善,但还是没有完美解决。

    下面介绍一种比较好的处理方法:

    1 protected void onCreate(Bundle savedInstanceState) {  
    2        super.onCreate(savedInstanceState);  
    3        int flag=getIntent().getFlags();  
    4        System.out.println("getFlags---"+flag+"------"+(flag&Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT));  
    5        if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {    
    6                 finish();  
    7                 return;  
    8            }  
    9     }  

       在手机上按照情景描述那样操作,能看到下面的输出。第一行表示正常打开时 flag 标志是268435456,Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT 标志是0;第二行表示重新打开app的结果,很明显 Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT 标志不再是0,所以我们在setContentView()之前直接finish掉它或者执行onResume()方法来恢复之前的页面。

      另外也可以检查一下另一个标志:FLAG_ACTIVITY_RESET_TASK_IF_NEEDED。这个没使用过,没什么体会,仅供参考吧!

    参考资料:How to return to the latest launched activity when re-launching application after pressing HOME

  • 相关阅读:
    3.6 符号表的应用
    将博客搬至CSDN
    webpack打包vue项目IE报错,“对象不支持“use”属性或方法”
    移动端解决input被输入法挡住的问题
    javascript中对象的深复制的几种方法
    如何随机洗牌一个数组
    setInterval中this指向的问题
    css中的各种常见布局写法
    vue设置全局变量或函数
    【nodejs爬虫】使用async控制并发写一个小说爬虫
  • 原文地址:https://www.cnblogs.com/mgzc-1508873480/p/8582086.html
Copyright © 2011-2022 走看看