草庐IT

android - 关于 Activity 生命周期和资源删除/分配的问题

coder 2023-12-23 原文

我一直对生命周期这个东西很困惑,所以我做了一点实验。长话短说:结果表明,当进程被销毁后创建时,上次 session 中分配的 UI 对象全部消失,需要重新创建(这是预期的)。但是上次 session 中分配的其他内存空间对于本次 session 仍然可用。

令我惊讶的是:系统的UI对象(如ListView)和我分配的内存空间并没有同时被销毁。为什么他们不同时死去(或活着)???

在这里查看实验:

public class PracticeActivity extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // If there is left-over value in G.count[99], then do not populate
        // the ListView. 
        if (G.count[99] == 0) {
            ListView lv = getListView();
            lv.setAdapter(new ArrayAdapter<String>(this, 
                android.R.layout.simple_list_item_1, m_Starbucks));
        }

        Log.d("TAG", MessageFormat.format("Created, count = {0,number}", G.count[99]));
        Log.d("TAG", MessageFormat.format("Starbucks = {0}", m_Starbucks[0]));
        G.count[99]++;                              // increment the count
        m_Starbucks[0] = "Coffee Frappuccino";      // and change the menu
    }

    @Override public void onRestart() { super.onRestart(); Log.d("TAG", "Restarted"); }
    @Override public void onStart() { super.onStart(); Log.d("TAG", "Started"); }
    @Override public void onResume() { super.onResume(); Log.d("TAG", "Resumed"); }
    @Override public void onPause() { super.onPause(); Log.d("TAG", "Paused"); }
    @Override public void onStop() { super.onStop(); Log.d("TAG", "Stopped"); }

    @Override public void onDestroy() { 
        super.onDestroy();
        if (isFinishing())
            Log.d("TAG", "Destroyed -- someone finished me");
        else
            Log.d("TAG", "Destroyed -- system needs resources");
    }

    private static final String[] m_Starbucks = {
        "Latte", "Cappuccino", "Caramel Macchiato", "Americano", "Mocha", 
        "White Mocha", "Mocha Valencia", "Cinnamon Spice Mocha", 
        "Toffee Nut Latte", "Espresso", "Espresso Macchiato", 
        "Espresso Con Panna"
    };
}

这是 G.java 文件中定义的类 G:

public class G {
    public static int[] count = new int[100];
}

运行此测试产生了以下结果:

Created, count = 0
Starbucks = Latte
Started
Resumed
Paused
Stopped
Destroyed -- someone finished me
Created, count = 1
Starbucks = Coffee Frappuccino
Started
Resumed

在第一个 session 中,count[99] 的值为 0,因此程序去填充 ListView,所以一切正常。

在第 2 个 session 中,count[99] 仍然保留着第一个 session 留下的值,因此程序没有填充 ListView,希望 ListView 也可用。但并不是,结果是黑屏。这意味着上次 session 中的 G.count[] 被保留(m_Starbucks[] 也是如此),但 ListView 没有存活下来。

很明显,系统中只有一个 PracticeActivity 实例,当这个实例消亡时,PracticeActivity 和 G 类也应该消亡。但他们没有,他们仍然保留着上一届 session 的值(value)。

问题:

  1. 如果 count[] 和 m_Starbucks[] 是 仍然可用,那么这意味着 PracticeActivity 和 G 都是 还活着那为什么ListView是 走了?难道他们不应该全部死去还是 同时居住?
  2. 当我看到我的一些类(class)时 成员保持他们的旧值(value)观 上一届 session ,我能相信吗 所有 我类(class)的成员也有效???即,Android 以全有或全无的方式杀死我的资源 时尚?或者,它可以删除一些和 留下一些? (这个问题 最初不应该存在 的地方,但看到的结果 实验,人们开始怀疑。)

任何人都可以阐明这一点吗?非常感谢。

最佳答案

静态类成员的生命周期与 JVM (DVM) 的生命周期一样长——这可能(而且肯定是)比 你的 Activity 生命周期。您的 Activity 可能会被破坏,但静态字段会幸存下来。

关于android - 关于 Activity 生命周期和资源删除/分配的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5190689/

有关android - 关于 Activity 生命周期和资源删除/分配的问题的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  4. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  5. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

    通过ruby​​koans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John

  6. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  7. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  8. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  9. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  10. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

随机推荐