gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:55:40 24 4
gpt4 key购买 nike

我一直对生命周期这个东西很困惑,所以我做了一点实验。长话短说:结果表明,当进程被销毁后创建时,上次 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com