【问题标题】:Best way to start same activity and destroy the previous one开始相同活动并销毁前一个活动的最佳方式
【发布时间】:2014-10-16 11:27:01
【问题描述】:

我正在制作一些 webview 活动,这些活动将从主要活动中加载。有没有一种方法可以运行,假设每 1 小时有一些方法会在后台启动 webview 活动 #2,杀死 #1 webview 活动并尽可能从 #2 无缝切换到 #1 ,可能会出现一秒钟的白屏或其他什么,因为 webview 中存在一些内存泄漏,我需要偶尔销毁 activitiy,但希望尽可能顺利地过渡一切?

提前谢谢你!

【问题讨论】:

  • 你为什么要做这样的事情?
  • 每当您谈到一些在特定间隔后会唤醒的后台工作时,请联系Service
  • 因为我需要不时销毁活动,因为如果活动没有被销毁,android webView 会泄漏内存......

标签: android android-activity webview


【解决方案1】:

这段代码可能对你有用。当我的用户更改应用程序的语言时,我使用它来重新启动我的应用程序。

Intent intent = new Intent(getActivity(), StartUpActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
                                    getActivity(),
                                    123456,             //request code ??? some dummy numbers.
                                    intent,
                                    PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
manager.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent);
System.exit(0);

您可以在此处阅读有关 PendignIntent 类的信息:http://developer.android.com/reference/android/app/PendingIntent.html

我不完全确定request code 是什么。我正在使用一些虚拟数字,它可以工作。

【讨论】:

    【解决方案2】:

    如果您绝对必须这样做,我建议将您的活动包装在“父”活动中,并且每次您需要终止“子”(即当前)活动时,只需转换到父活动(使用 Intent.FLAG_ACTIVITY_CLEAR_TOP标志),然后让父级生成您的活动的新实例。这样您就不必做任何时髦的事情,并且与 android 活动的工作方式一致。

    【讨论】:

    • 每次我开始另一个活动时,内存使用量都会跳跃,我该如何清除?
    • 这是 Android 的有趣功能之一,需要时间来适应。基本上,如果您启动 Activity A,然后从 A 启动 B,从 B 启动 C(A->B->C),那么您很可能会将所有活动都保存在内存中。这样做的原因是您的导航返回正常工作(意味着 Android 能够导航到上一个活动)。要解决此问题,如果您从 A->B->A 开始,您可以创建带有标志 (intent.addFlag(FLAG_ACTIVITY_CLEAR_TOP);) 的 B->A 意图,该标志告诉 android Activity B 现在可以被杀死和释放。
    • 如果不这样做,您现在将在内存中拥有 A、B 和另一个 A(A1、B、A2,其中 A1 是 A 的一个实例,A2 是另一个实例)。但是,如果您只是通过指定该标志来“返回”导航,那么您的 B 活动将被清除(因为实际上,A1->B->A1 意味着 B 可以被杀死并重用 A1)。如果不清楚,请告诉我。请把这个和一粒盐一起吃。这不科学,我只是在经过数小时的内存分析调试后才放下自己的观察结果。
    • 从 B -> A 出发的另一种方法是简单地在 B 上调用 finish() ,它会自动将你带回 A (它还会在 B 上调用 onDestroy() 来清理在你自己之后)。 CLEAR_TOP 版本更稳定,当 finish() 不起作用时,对于某些用例几乎是必需的,因为它也适用于 A->B->C->D 的情况,现在你必须回到 A,有效地杀死 B和 C 和 D。
    猜你喜欢
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多