重新启动应用程序以释放堆内存

时间:2013-10-11 08:05:35

标签: android android-intent application-restart

在我的应用程序中的特定时间点,我想完全重启应用程序,即终止与应用程序关联的进程,然后再次重新启动它。我想这样做是为了释放堆空间,因为我的应用程序包含很多位图。

我使用this SO link获得最高投票答案,并按照以下附加活动创建:

/** This activity shows nothing; instead, it restarts the android process */
public class MagicAppRestart extends Activity {
    // Do not forget to add it to AndroidManifest.xml
    // <activity android:name="your.package.name.MagicAppRestart"/>
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        System.exit(0);
    }
    public static void doRestart(Activity anyActivity) {
        anyActivity.startActivity(new Intent(anyActivity.getApplicationContext(), MagicAppRestart.class));
    }
}

并从另一项活动中的所需位置将此活动称为MagicAppRestart.doRestart(this);

现在,问题是这在Android 2.3上工作正常,但在4.0上,此代码仅退出应用程序但不重新启动

我做错了吗?是否存在适用于所有操作系统的此问题的解决方案?

另外,我已经尝试过以下代码,它重新启动但不是进程,因此不会释放堆,所以对我来说没用:

Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);

任何帮助表示赞赏!

修改

我的应用中有7项活动,包括家庭活动。除家庭活动外,其他6项活动使用ViewFlipper和5-8个屏幕。

我在每个活动的onStop()onDestroy()中使用 unbindDrawables(),但它只释放了一小部分内存。

因此,我希望完全重启应用程序流程。

编辑2

我刚看到这个:

此外,Android改变了位图内存的分配方式。在Android 3.0之前,位图在本机内存中分配,Java堆上只保留了一个小的描述符;现在整个位图是从Java堆分配的。如果多个位图保留在内存中,这可能会导致Java堆快速耗尽。

我想这就是为什么我的方法在2.3OS设备上运行而不在4.0 OS设备上的原因。

5 个答案:

答案 0 :(得分:1)

你不应该致电System.exit(0)。退出并重新启动应用程序是一个坏主意。

https://groups.google.com/forum/#!topic/android-developers/G_D3pKnGLt0

引用Romain Guy

(Romain Guy):用户没有,系统会自动处理。这就是活动生命周期(特别是onPause / onStop / onDestroy)的用途。 无论你做什么,都不要放“退出”或“退出”应用程序按钮。它与Android的应用程序模型无关。这也与核心应用程序的工作方式相反

了解更多信息请查看以下链接

Is quitting an application frowned upon?

您应该以不会遇到内存泄漏的方式编写代码。

管理位图内存

http://developer.android.com/training/displaying-bitmaps/manage-memory.html

另请查看内存管理

上的此链接

https://www.youtube.com/watch?v=_CruQY55HOk

编辑:

您可以将onResume中的drawable与onPause中的unbind绑定。

答案 1 :(得分:1)

您无法清除堆。阅读this以便更好地理解。

希望它有所帮助。

答案 2 :(得分:0)

试试这个。它对我有用:

Intent it = new Intent();

it.setComponent(new ComponentName(YourActivity.this.getPackageName(),YourActivity.class.getName()));
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_SINGLE_TOP);
YourActivity.this.getApplicationContext().startActivity(it);

答案 3 :(得分:0)

根据某些人的建议,我得出结论,当应用程序运行时,通过代码退出/重启应用程序并不理想/建议。

所以,我所做的是 - 设置一个标志来识别主页按钮点击ieexit of app

那时,我致电android.os.Process.killProcess(android.os.Process.myPid());完全取消当前应用的流程并避免在后台运行应用。

全部谢谢!

答案 4 :(得分:0)

how to programmatically "restart" android app?中尝试Oleg Koshkin的最高投票答案。希望这会对你有所帮助。

Intent mStartActivity = new Intent(context, StartActivity.class);
int mPendingIntentId = 123456;
PendingIntent mPendingIntent = PendingIntent.getActivity(context,  mPendingIntentId,    mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
System.exit(0);