欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

安卓开发app在后台运行时页面数据被系统清除后操作之重启APP

程序员文章站 2022-07-24 13:40:23
在安卓开发过程中,当点击HOME键,将app运行在后台时,然后再点击app图标进入时,遇到了如下两种情况: 1、每次打开时,app的入口页面总是被执行。 2、当运行内存被其它应用占用完时,在进入app时,home时的当前页面数据没有被清除(待进一步确认),此时页面正常,点击返回键之后显示的页面数据被 ......

在安卓开发过程中,当点击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有自己的生命周期,也需要做处理。