Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >关于安卓Activity LifeTimes

关于安卓Activity LifeTimes
EN

Stack Overflow用户
提问于 2013-10-22 06:36:15
回答 3查看 209关注 0票数 0

我想研究Acitvity,然后我有两个活动,名为MainActivity和SecondActivity,我将启动模式设置为singleTask模式,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends Activity {

/** Called when the activity is first created. */
public static final String PREFS_NAME = "MyPrefsFile";
private TextView tv;
private Button bt;
private final static String TAG = "MainActivity";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.e(TAG+"onCreate", "onCreate");
    setContentView(R.layout.activity_main);
    findViews();
    tv.setText("MainActivity ID:" + this.toString());
    bt.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(MainActivity.this,
                    SecondActivity.class);
            startActivity(intent);

        }
    });
}

private void findViews() {
    // TODO Auto-generated method stub
    tv = (TextView) findViewById(R.id.textView);
    bt = (Button) findViewById(R.id.turnBt);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onRestoreInstanceState(savedInstanceState);
    Log.e(TAG+"onRestoreInstanceState", "onRestoreInstanceState");
}
@Override
protected void onRestart() {
    // TODO Auto-generated method stub
    super.onRestart();
    Log.e(TAG+"onRestart", "onRestart");
}
@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    Log.e(TAG+"onStart", "onStart");
}
@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    Log.e(TAG+"onResume", "onResume");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
    Log.e(TAG+"onSaveInstanceState", "onSaveInstanceState");
}
@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    Log.e(TAG+"onPause", "onPause");
}
@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Log.e(TAG+"onDestroy", "onDestroy");
}
@Override
protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();
    Log.e(TAG+"onStop", "onStop");
}

}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SecondActivity extends Activity{
private TextView tv;
private Button bt;
private final static String TAG = "SECONDACTIVITY";
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    Log.e(TAG, "onCreate");
    setContentView(R.layout.second_layout);
    findViews();
    tv.setText("第二个界面的ID:"+this.toString()); 
    bt.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
             Intent intent = new Intent(SecondActivity.this, MainActivity.class);  
                startActivity(intent); 

        }
    });
}

private void findViews() {
    // TODO Auto-generated method stub
    tv = (TextView)findViewById(R.id.textView);
    bt = (Button) findViewById(R.id.turnBt);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onRestoreInstanceState(savedInstanceState);
    Log.e(TAG, "onRestoreInstanceState");
}
@Override
protected void onRestart() {
    // TODO Auto-generated method stub
    super.onRestart();
    Log.e(TAG, "onRestart");
}
@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    Log.e(TAG, "onStart");
}
@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    Log.e(TAG, "onResume");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
    Log.e(TAG, "onSaveInstanceState");
}
@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    Log.e(TAG, "onPause");
}
@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Log.e(TAG, "onDestroy");
}
@Override
protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();
    Log.e(TAG, "onStop");
}

}步骤1:启动MainActivity,logcat显示如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10-22 13:56:59.704: E/MainActivityonCreate(4649): onCreate
10-22 13:56:59.735: E/MainActivityonStart(4649): onStart
10-22 13:56:59.736: E/MainActivityonResume(4649): onResume

步骤2:从MainActivity到SecondActivity;logcat如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10-22 14:03:52.452: E/MainActivityonPause(4884): onPause
10-22 14:03:52.462: E/SECONDACTIVITY(4884): onCreate
10-22 14:03:52.485: E/SECONDACTIVITY(4884): onStart
10-22 14:03:52.485: E/SECONDACTIVITY(4884): onResume
10-2214:03:52.773:E/MainActivityonSaveInstanceState(4884): onSaveInstanceState
10-22 14:03:52.774: E/MainActivityonStop(4884): onStop

第3步:从SecondActivity到MainActivity,logcat显示如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10-22 14:05:14.561: E/SECONDACTIVITY(4884): onPause
10-22 14:05:14.574: E/MainActivityonCreate(4884): onCreate
10-22 14:05:14.592: E/MainActivityonStart(4884): onStart
10-22 14:05:14.593: E/MainActivityonResume(4884): onResume
10-22 14:05:14.877: E/SECONDACTIVITY(4884): onSaveInstanceState
10-22 14:05:14.877: E/SECONDACTIVITY(4884): onStop

步骤4:从MainActivity到SecondActivity,日志文件如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10-22 14:05:51.049: E/MainActivityonPause(4884): onPause
10-22 14:05:51.061: E/SECONDACTIVITY(4884): onRestart
10-22 14:05:51.061: E/SECONDACTIVITY(4884): onStart
10-22 14:05:51.061: E/SECONDACTIVITY(4884): onResume
10-22 14:05:51.330: E/MainActivityonStop(4884): onStop
10-22 14:05:51.330: E/MainActivityonDestroy(4884): onDestroy

我的问题是:为什么第4步,MainActivity调用onDestroy()方法?谁来帮帮我?

EN

回答 3

Stack Overflow用户

发布于 2013-10-22 07:19:27

我尝试了您的代码,但是我的onDestroy()方法没有被调用。在本例中,我猜是因为系统希望在Step4之后清除一些内存,所以会调用onDestroy。backStack如下所示

方法4之后的后堆栈如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SecondActivity  Step 4
MainActivity    Step 3
SecondActivity  Step 2
MainActivity    Step 1

根据developer website的说法

调用的onDestroy方法

在您的活动被销毁之前,您收到的最后一个呼叫。这可能是因为活动正在结束(有人对其调用finish() ),也可能是因为系统临时销毁了该活动的此实例以节省空间。您可以使用isFinishing()方法区分这两个场景。

票数 1
EN

Stack Overflow用户

发布于 2013-10-22 07:24:51

在系统调用stop方法之后,将为活动调用destroy方法,何时调用destroy方法由设备决定。

stop方法不会删除设备上活动的内存,但该活动不再工作,但一旦调用destroy方法,该活动的所有内存分配都会被销毁。

票数 1
EN

Stack Overflow用户

发布于 2013-10-22 08:46:07

它完全依赖于正在运行的应用程序的设备和数量。如果您有一个高端设备(内存大于1 1GB;您可能不会看到调用onDestroyed()。这是因为Android可以在更多的内存中运行更多的应用程序。

同样,您可以通过终止来自TaskManager的任务来强制调用onDestroy()。或者,您可以在ICS+设备上设置开发人员选项“不保留活动”。每当你离开你的应用程序时,这总是会毁掉它。

onStop()和onDestroy()之间的主要区别是onStop()只挂起您的活动(UI和UI线程),但它不会触及您正在运行的线程(如网络线程、服务、接收者e、g)。因此,即使调用了onStop(),您的应用程序仍然可以在后台工作(播放音乐或下载内容)。

onDestroy()被安卓系统调用来占用内存空间(用于新的活动调用或自身),它将销毁位于ActivityStack底部的活动。您可以将onDestroy()视为来自系统的正常关闭请求。如果调用了onDestroyed(),则应该停止所有操作。在这个调用之后,你的每个线程都将被终止。

希望这能有所帮助,致敬。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19510695

复制
相关文章
js获取iframe中的内容(iframe内嵌页面)
在父页面中定义函数,再到子页面中调用。 父页面parent.html function getFrameId(f){ var frames = document.getElementsByTagName(“iframe”); //获取父页面所有iframe for(i=0;i
全栈程序员站长
2022/08/01
24.7K0
js获取iframe中的内容(iframe内嵌页面)
iframe跨域应用 - 使用iframe提交表单数据
之前我们提到了iframe跨域,今天我们在原有的基础之上进行“实例”的讲解。通过iframe跨域实现表单数据的提交。如果想了解iframe跨域,可以发送“iframe跨域”到“HTML5学堂”公众号。 为何提交数据还要跨域? 在使用iframe跨域之前,可能你的脑海中就出现了这样一个问题:为何提交表单数据还需要跨域呢? 首先我们要知道,网站的数据是存放在服务器上的,而当一个网站很大型,拥有很多的数据时,通常会进行分类,然后将不同类的内容放置在不同的子域名中。 表单数据的提交模式 今天会使用到MD5的知识,因
HTML5学堂
2018/03/12
5.3K0
adminLte解决iframe高度问题
adminLte默认是全局刷新,也就是不存在frame页面,经过修改,可以很容易实现右边内容框用frame实现页面刷新,这样就不需要整个页面全局刷新,点击相应菜单时,只会刷新frame窗口,但是有一个问题就是frame默认高度只有一丁点,百度之后用了自适应也会有各种问题,比如高度只能拉伸不会缩短,在解决的道路上真的是没有一个完美的解决方案,经过自己研究,发现一个非常简单的方法,那就是用js获取window的innerHeight,代码实现window.innerHeight,然后出去顶部的状态栏,以及空白部分,经过测试,窗口高度减去90是最合适的,也可以根据你自己的情况加减,最后调至一个最完美高度,发现任何分辨率都不会有问题!
全栈程序员站长
2022/09/18
9410
vue项目iframe的传值问题
  所以。我把插件的使用封装了一个html页面。vue项目则利用iframe的方式引入。
Dawnzhang
2019/11/21
1.8K0
pyppeteer对于iframe中的滑块
import asyncio import time import numpy, random import pyppeteer async def main(): ip = "xxxxxx" #代理ip port = "xxxx" #代理端口 browser = await pyppeteer.launch({'headless': False, 'args': [
小小咸鱼YwY
2020/12/21
2.8K0
【HTML】Iframe中的onload事件
当iframe.src重新指定一个url时会重新执行iframe的onload事件 <iframe id="indexFrame" name="index" width="800" onload='iFrameHeight("indexFrame");'                 frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> html生成时,会执行iframe中的onload事件 当iframe.sr
悟空聊架构
2018/05/18
3.4K0
DNS在远程调用执行中的应用
纯属蹭log4j2热度文,和安全没有直接的关系,本文只谈DNS以及日志应用; 通过dnslog.cn的截图,分析dnslog.cn的原理,基于此,介绍了可以获取更多信息的ceye的功能;在应用场景上,我们通过该原理提供了用户出口IP同本地DNS递归出口IP的对应关系,延伸出了排障场景和数据分析场景。
hermanzeng
2021/12/14
6K3
DNS在远程调用执行中的应用
深入剖析iframe跨域问题
HTML5学堂:本文当中我们介绍了跨域的基本知识,讲解到了跨域的相关种类,并讲解了解决跨域中的一种方法——如何使用iframe跨域。讲解了iframe跨域的基本原理与流程,并配以实战~ 利利的独白:跨域,是我们的课程中必不可少的一部分,但是我们一直都是在讲解JSONP的跨域方式,虽然也提到了iframe的跨域方式,但是由于时间因素,并没有办法放置到课程中。 本文仅仅讲明了iframe的跨域问题,想了解更多关于iframe标签的基本知识,直接发送 “iframe标签” 到 “HTML5学堂” 的微信。 什么是
HTML5学堂
2018/03/12
14.6K0
深入剖析iframe跨域问题
layui打开iframe窗口不刷新的问题
这个问题可能是我工作以来,最死磕不算bug的一个了,晚上熬夜到三点钟,终于找到了解决的办法。
王小婷
2019/04/29
4K0
layui打开iframe窗口不刷新的问题
网页嵌入Iframe中
<iframe id="reportFrame" width="900" height="400" src="https://www.baidu.com/"></iframe> 如果把第三方网页嵌到iframe中,下面以百度为例 Refused to display 'https://www.baidu.com/' in a frame because it set 'X-Frame-Options' to 'sameorigin'. 开发时通过配置代理 <iframe id="reportFra
tianyawhl
2022/08/07
1.8K0
深度学习在环境远程遥感中的应用
本文是关于深度学习在环境远程遥感方面的应用研究进展及面临的挑战。简要介绍由武汉大学张良培教授团队的这篇综述文章。
bugsuse
2020/04/21
1K0
深度学习在环境远程遥感中的应用
JavaScript 处理Iframe自适应高度的问题
 用到的就是iframe嵌套的页面加载完毕的时候,运用onload事件来获取嵌套在iframe中网页的高度,然后赋值给Iframe的高度即可。
aehyok
2018/09/11
1.6K0
iframe编程的一些问题
前几天做一个用iframe显示曲线图的demo,发现对iframe的contentDocument绑定 onclick事件都无效,而在页面中对iframe.contentDocument的onclick 属性为undefined;而当iframe去掉src属性后,在对其绑定onclick事件,该事件生效; 对比之下才发现原来当对iframe.contentDocument绑定事件时,iframe还没有加载 完毕,此时对于contentDocument虽然可以绑定该事件处理函数,但是却无法执行, 因为此时co
欲休
2018/03/15
9610
【JS应用】Iframe 解决跨域
跨域的东西, 简直不要接触太多,网上相关内容一抓一大把,但是突然学习到一个关于前端解决跨域的方式
神仙朱
2019/11/07
15.5K0
【JS应用】Iframe 解决跨域
如何在 WordPress 中嵌入 iFrame
Iframe 是一种将网页嵌入到另一个页面的内容中的方法。这是通过使用 HTML 元素、外部网站的 URL 以及窗口在您的网站上的外观参数来实现的。
海拥
2022/12/11
2.4K0
如何在 WordPress 中嵌入 iFrame
jQuery控制iframe中对象的方法
jQuery中的$()方法很容易获取到DOM中的元素。但是这个方法不适用于引用iframe中的元素。 如下面的html a.htm
EltonZheng
2021/01/26
2.1K0
IE中iframe跨域访问
本文主要讲述了IE浏览器中iframe跨域访问的问题以及如何解决。主要包括三个方面:1.什么是跨域,以及跨域引发的问题;2.如何解决跨域问题,分别从浏览器和服务器两个方面给出方案;3.浏览器和服务器在解决跨域问题的过程中需要注意的一些细节。
高爽
2017/12/28
4.3K0
IE中iframe跨域访问
JavaScript中给 iframe 中的元素添加点击事件
最近在开发一个浏览器插件,需要抓取掌中云平台的数据,由于该平台的页面结构是采用iframe嵌套的方式加载的, 所以在添加事件的时候遇到了一点小麻烦,现特此将解决方法记录如下,以供大家复制粘贴。
越陌度阡
2022/11/27
3.6K0
点击加载更多

相似问题

.Net城域应用中的MarkUpExtension

10

未触发BackgroundTask的城域应用程序问题

12

城域WinRT应用中的AesManaged解密

20

WindowsBase组件结构在城域应用中的应用

13

分组CollectionViewSource在windows 8城域应用中的应用

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文