在我的应用中的某一点,用户从嵌入到选择活动中的Gallery小部件中选择一个图像。选择后,下一个活动加载。
下一个活动使用更多位图。为了保持堆大小不变,我试图在不再需要它之后销毁选择活动。使用DDMS,我注意到当我调用finish()
时,活动没有被杀死。然后我开始将活动剥离到最低限度,活动似乎仍未完成。下面显示我剩下的内容
public class ImageSelectActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.selectionpage);
}
public void buttonClick(View v){
Intent intent = new Intent(ImageSelectActivity.this, MainActivity.class);
intent.putExtra("imageID", 0);
startActivity(intent);
finish();
}
在DDMS上发现ImageSelectActivity
仍然活着之后。我查看了GC根的路径并获得了以下内容:
Java.lang.Thread
+- android.app.ContextImpl
+- app.myapplication.ImageSelectActivity
另一件事,如果我按回应用程序关闭。我完全迷失了。有什么想法吗?
答案 0 :(得分:1)
finish()最终会导致活动被销毁。你在buttonClick方法中触发的意图保留了旧活动,我想这就是为什么它不会立即被破坏。但不要担心。只要您不保留对View元素或类似内容的静态引用,GC就会到达它。
答案 1 :(得分:1)
这就是Android的工作原理。当你调用“完成()”时,基本上就是退出活动。 Android不会从运行进程列表中提取它,直到出于性能原因绝对必须(为什么浪费资源转储不需要的资源?)。它将存在于内存中,直到需要内存为止。然而,它就像死了一样好。
这个例外(我现在可以想到)就是你有一个线程在运行。线程将持续运行或直到它们结束,但它们将在调用finish()后继续运行。
关于你的最后一件事,如果你在应用程序的第一个Activity
,按下后退按钮应该关闭它(类似于调用finish()
)。
答案 2 :(得分:0)
无论如何在完成()后你应该使用一个返回声明。