android - 如何完全关闭android应用程序以便回收所有内存?
问题描述
我正在开发一个只有 1 个主要活动的应用程序。
该应用程序创建一个执行 C++ 代码的新线程,一旦线程返回,我需要完全关闭该应用程序,因此当用户尝试从手机中的任何位置再次使用它时,该应用程序将在没有内存的情况下打开 - 就像以前一样从后台删除并重新开始。
调用activity.finish()
应用程序时没有完全销毁,所以我System.exit(1)
在方法的末尾添加了OnDestroy
,但这导致了来自谷歌播放的罕见ANR报告,我无法重现。
我的问题是:
我如何才能以正确的方式完全关闭应用程序而不会导致任何 anr/stuck 部分锁定或其他任何事情?
在anr报告中,c ++线程不存在-它返回了-因此我非常确定它是由应用程序关闭逻辑引起的
anr 日志:
#00 pc 00000000000177ac /system/lib/libc.so (syscall+28)
#01 pc 00000000000b643d /system/lib/libart.so (_ZN3art17ConditionVariable16WaitHoldingLocksEPNS_6ThreadE+92)
#02 pc 00000000003f045b /system/lib/libart.so (_ZN3artL12GoToRunnableEPNS_6ThreadE+230)
#03 pc 00000000003f034b /system/lib/libart.so (_ZN3art12JniMethodEndEjPNS_6ThreadE+8)
#04 pc 000000000062c225 /system/framework/arm/boot-framework.oat (Java_android_os_BinderProxy_transactNative__ILandroid_os_Parcel_2Landroid_os_Parcel_2I+152)
at android.os.BinderProxy.transactNative (Native method)
at android.os.BinderProxy.transact (Binder.java:615)
at jz.b (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:2)
at xm.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060)
at xi.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:6)
at no.b (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:3)
at on.b (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:10)
at on.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:1)
at pe.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:1)
at pb.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:19)
at com.google.android.gms.ads.safebrowsing.b.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:7)
at pb.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:53)
- locked <0x06c91611> (a java.lang.Object)
at op.g (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:11)
at op.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:30)
at pe.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:7)
at oa.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:3)
at rw.m_ (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060)
at rj.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:14)
at rb.c (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060)
at rc.handleMessage (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:35)
at android.os.Handler.dispatchMessage (Handler.java:102)
at vw.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060)
at vw.dispatchMessage (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060)
at android.os.Looper.loop (Looper.java:154)
at android.app.ActivityThread.main (ActivityThread.java:6317)
at java.lang.reflect.Method.invoke! (Native method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:872)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:762)
解决方案
这是部分答案;
如果您需要擦除的内存部分属于 c++ 代码,并且您可以在 c++ 代码中对其进行管理:只需编写一个 jni 函数,将相关内存和指针清零(在 c++ 中是允许的)并在 activity.finish 之前调用它;
如果您需要擦除的内存部分属于 c++ 代码,而您无法在 c++ 代码中对其进行管理;在新进程中分叉并运行代码;这将使您能够通过调用以下方法从父进程的 java 代码中杀死它(擦除内存):
android.os.Process.killProcess(the_childs_process_id)
推荐阅读
- amazon-quicksight - 如何获取特定用户拥有的 Amazon QuickSight 资源列表?
- php - 将 .htaccess 文件转换为 nginx
- r - 迭代 r 中列的行名
- data-structures - 在二叉树中,兄弟节点一定是有序的吗?
- python - Pandas pd.series 返回一个数据框
- html - 在从上到下排序的 2 列中显示 div
- php - 参数 1 传递给 Symfony\Component\VarDumper\Server\Connection::__construct() ... 在第 49 行的 DumpServerServiceProvider.php 中调用
- c# - 在 .NET 中,什么时候调用 getter 和 setter?
- python - 重组 pandas 数据框,将 Column 变成新的 Header,原始 Header 成为具有预先存在的 Column 的多索引的一部分
- angular - 如何与重定向共享令牌验证功能?