1

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

我使用此 SO 链接获得最高投票的答案,并创建了以下额外活动,如下所示:

/** 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 项活动使用ViewFlipper5-8 个屏幕。

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

因此,我希望完全重新启动应用程序进程。

编辑 2

我刚遇到这个:

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

我想这就是为什么我的方法适用于 2.3OS 设备而不是 4.0 OS 设备的原因。

4

5 回答 5

1

您无法清除堆。阅读内容以获得更好的理解。

希望能帮助到你。

于 2013-10-11T08:22:16.247 回答
1

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

引用来自https://groups.google.com/forum/#!topic/android-developers/G_D3pKnGLt0的 Romain Guy

(Romain Guy):用户没有,系统会自动处理。这就是活动生命周期(尤其是 onPause/onStop/onDestroy)的用途。无论您做什么,都不要放置“退出”或“退出”应用程序按钮。它对 Android 的应用程序模型毫无用处。这也与核心应用程序的工作方式背道而驰

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

退出应用程序不受欢迎吗?

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

管理位图内存

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

还要检查这个关于内存管理的链接

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

编辑:

onResume您可以在unbind in中绑定可绘制对象onPause

于 2013-10-11T08:07:40.353 回答
0

在一些人的建议下,我得出结论,在应用程序运行时通过代码退出/重新启动应用程序并不理想/建议。

所以,我所做的是 - 设置一个标志来识别主页按钮单击应用程序的 ieexit

当时,我打电话android.os.Process.killProcess(android.os.Process.myPid());完全杀死当前应用程序的进程并避免应用程序在后台运行。

谢谢大家!

于 2013-10-11T10:31:39.293 回答
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);
于 2013-10-11T08:06:59.413 回答
0

在如何以编程方式“重新启动”android 应用程序中尝试 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);
于 2016-02-08T07:26:23.943 回答