是否需要添加一些东西以避免在活动之间切换时出现内存泄漏?

时间:2014-02-10 00:32:59

标签: java android memory-leaks android-activity

我正在试图弄清楚如何在我的应用程序中进行多项活动。我把它条纹化到最低的元素,以便很容易看到我在做什么并理解我的问题。

当程序运行时,它会显示一个显示“多个活动示例(屏幕1)”的屏幕(活动)。它有一个“按钮1”点击查看下一个活动。

单击按钮1将转到另一个活动屏幕,其中显示“多个活动示例(屏幕2)”。它有一个按钮2,按下后将返回到屏幕1。

我试图弄清楚某种类型的返回方法回到上一个屏幕,但无法弄明白。

所以,我的担忧/问题是,是否存在某种类型的内存泄漏,使用此方法会更深入到需要某种类型返回的层中?

附上了代码。

MainActivity:

package apollo.MultipleActivities;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void button1_click(View v) {
        Intent myIntent = new Intent(this, SecondActivity.class);
        startActivity(myIntent);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

第二项活动:

package apollo.MultipleActivities;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class SecondActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.secondactivity);
    }

    public void button2_click(View v) {
        Intent myIntent = new Intent(this, MainActivity.class);
        startActivity(myIntent);
    }
}

主要活动XML布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/screen1" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button1" android:onClick="button1_click"/>

</LinearLayout>

第二个活动XML布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/screen2" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="button2_click"
        android:text="@string/button2" />

</LinearLayout>

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="apollo.MultipleActivities"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="apollo.MultipleActivities.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SecondActivity"></activity>        
    </application>

</manifest>

该应用程序运行完美,正是我正在努力做到的。我关注的是Android整体的完整性。如果程序继续运行并且被大量使用,那么我在内存泄漏方面会崩溃。

谢谢!

1 个答案:

答案 0 :(得分:1)

  

我试图弄清楚某种类型的返回方法回到上一个屏幕,但无法弄明白。

选项#1:在finish()中呼叫startActivity()而不是SecondActivity。这将破坏当前活动并将控制权返回到前一个活动,在本例中为MainActivity

选项#2:添加FLAG_ACTIVITY_REORDER_TO_FRONT on the Intent,用于从MainActivity启动SecondActivity,将现有的MainActivity实例置于后端堆栈的顶部。从那里按BACK将返回SecondActivity,这可能不是你的想法。