zoukankan      html  css  js  c++  java
  • 安卓开发app在后台运行时页面数据被系统清除后操作之重启APP

    在安卓开发过程中,当点击HOME键,将app运行在后台时,然后再点击app图标进入时,遇到了如下两种情况:

    1、每次打开时,app的入口页面总是被执行。

    2、当运行内存被其它应用占用完时,在进入app时,home时的当前页面数据没有被清除(待进一步确认),此时页面正常,点击返回键之后显示的页面数据被清除了,而导致应用崩溃。

    下面将针对这两个问题的处理方式进行相对应的说明。

    一、如果activity的启动方式是singleTask,则会出现此问题。如果是默认的standard方式,则没有这样的问题(待进一步确认)。但是很多时候都需要使用singleTask方式启动界面,这时需要在app入口的界面的oncreate()方法中做以下处理。

    if (!isTaskRoot()){
    finish();
    return;
    }
    说明:isTaskRoot():用来判断当前Activity是不是该任务栈中的根Activity,也就是说是不是一个启动的Activity。并且该activity是否被启动过。
        moveTaskToBack(boolean momRoot):是把当前的Activity退到后台,不是finish,并不会走ondestory()。参数nonRoot表示的含义是此方法对非根activity是否有效,也就是说true表示对所有activity均有效,false表示只对根activity有效。
        此时要注意该界面销毁时所做的操作,要避免空指针异常。
    二、这里要讲两个方法:
    1、
    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);
    outState.putBoolean(SaveState,true);
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(SaveState,true);
    }
    onSaveInstanceState方法有这两个,第一个使用在非FragementActivity中,而第二个用在FragementActivity中。
    该方法会在系统自动清除组件里的数据时会被调用。
    2、
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    savedInstanceState.putBoolean(SaveState,true);
    }
    该方法会在系统销毁组件时会被调用。
    用这两个方法保存的变量,可以在组件的onCreate(Bundle savedInstanceState)方法中取出。每次界面数据被清理掉之后,再显示到前台时,都会重新走生命周期。Fragement有自己的生命周期,也需要做处理。
  • 相关阅读:
    Eclipse无法导入一些相关类的方法,出现Multiple markers at this line
    查看共享命令
    eclipse历史版本的下载地址
    MyEclipse的快捷键
    Hibernate的隔离级别
    eclipse插件下载地址
    UML类图几种关系的总结
    Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace
    回滚段的学习
    Oracle 字符集的查看和修改
  • 原文地址:https://www.cnblogs.com/qynprime/p/9594331.html
Copyright © 2011-2022 走看看