如何完全关闭android应用,以便将其所有内存都回收?

问题描述 投票:0回答:1

正在使用只有1个主要活动的应用程序。

该应用程序创建了一个执行c ++代码的新线程,一旦该线程返回,我需要完全关闭该应用程序,因此当用户尝试从手机中的任何位置再次使用该应用程序时,该应用程序将无内存打开-像它一样已从后台删除并重新启动。

当调用activity.finish()时,应用程序并未完全销毁,因此我在System.exit(1)方法的末尾添加了OnDestroy,但这导致了Google Play上罕见的ANR报告,我无法复制。

我的问题是:

我如何以正确的方式完全关闭应用程序,而又不引起任何anr /卡住的部分锁定或其他任何事情?

在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@[email protected]:2)
at xm.a (com.google.android.gms.policy_ads_fdr_dynamite@[email protected])
at xi.a (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:6)
at no.b (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:3)
at on.b (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:10)
at on.a (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:1)
at pe.a (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:1)
at pb.a (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:19)
at com.google.android.gms.ads.safebrowsing.b.a (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:7)
at pb.a (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:53)
- locked <0x06c91611> (a java.lang.Object)
at op.g (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:11)
at op.a (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:30)
at pe.a (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:7)
at oa.a (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:3)
at rw.m_ (com.google.android.gms.policy_ads_fdr_dynamite@[email protected])
at rj.a (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:14)
at rb.c (com.google.android.gms.policy_ads_fdr_dynamite@[email protected])
at rc.handleMessage (com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:35)
at android.os.Handler.dispatchMessage (Handler.java:102)
at vw.a (com.google.android.gms.policy_ads_fdr_dynamite@[email protected])
 at vw.dispatchMessage (com.google.android.gms.policy_ads_fdr_dynamite@[email protected])
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)
android
1个回答
0
投票

这是部分答案;

如果您需要擦除的内存部分属于c ++代码,并且可以在c ++代码中进行管理:只需编写一个jni函数即可使相对内存和指针(在c ++中是允许的)为空,并在活动之前调用它。完成;

如果您需要擦除的内存部分属于c ++代码,则无法在c ++代码中进行管理;分叉并在新进程中运行代码;这将使您能够通过调用以下命令从父进程的Java代码中杀死它(擦除内存):

android.os.Process.killProcess(the_childs_process_id)
© www.soinside.com 2019 - 2024. All rights reserved.