Activity调用isDestroyed()方法报出,java.lang.NoSuchMethodError

本文探讨了在Android应用中遇到的NoSuchMethodError错误,特别是针对Activity中的isDestroyed()方法在旧版本Android上的调用问题。文章提供了版本检查的解决方案,并分享了避免此类错误的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在測试App的过程中,Activity调用了isDestroyed()方法,报出了java.lang.NoSuchMethodError错误。

自己手机MI 2S,版本号4.1.1。

事实上原因就是isDestroyed()这种方法是在4.2引入的,所以在4.1.1上调用此方法会报错。

须要做一下版本号的推断了,Build.VERSION.SDK_INT < 17。


那么问题来了。怎样推断某个函数引入的版本号呢?从android开发人员站点就能够发现。

事实上想在源代码里面看到,但是源代码里面没有说明。

https://developer.android.com/reference/android/app/Activity.html#isDestroyed()



总结:调用方法的时候须要注意几点:

(1)注意此方法引入的API版本。

(2)最好不要调用@Deprecated标记类和方法之类的。由于第三方可能会删除被@Deprecated标记的源代码;

(3)标记@Hide的也最好不要调用,记得初学的时候,蛮多人使用反射的方式获取私有的数据和调用对应的方法,当时认为还蛮具有研究精神的;


重点:当自己如今站在维护的角度,非常多用户在用你的产品,各种不同的手机、型号的出现,导致出现的不同的bug。遵守上述的规则,就显得非常有意义了。


附上一些比較好的文章:

精神哥讲Crash(一):UnsatisfiedLinkError

精神哥讲Crash(二): java.lang.NoSuchMethodError

小萝莉说Crash(一):Unrecognized selector sent to instance xxxx



AndroidRuntime: Shutting down VM AndroidRuntime: FATAL EXCEPTION: main AndroidRuntime: Process: com.longcheertel.fasttest, PID: 2435 AndroidRuntime: java.lang.NoSuchMethodError: No static method setRotationLock(Landroid/content/Context;Z)V in class Lcom/android/internal/view/RotationPolicy; or its super classes (declaration of 'com.android.internal.view.RotationPolicy' appears in /system/framework/framework.jar!classes5.dex) AndroidRuntime: at com.longcheertel.fasttest.Acce.onResume(Acce.java:87) AndroidRuntime: at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1733) AndroidRuntime: at android.app.Activity.performResume(Activity.java:9375) AndroidRuntime: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5755) AndroidRuntime: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:5801) AndroidRuntime: at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:57) AndroidRuntime: at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:60) AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeLifecycleItem(TransactionExecutor.java:237) AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:110) AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:84) AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2921) AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:107) AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:249) AndroidRuntime: at android.os.Looper.loop(Looper.java:337) AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:9544) AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:648) AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1005)
03-08
*** FATAL EXCEPTION IN SYSTEM PROCESS: main 06-27 15:50:50.222 17748 17748 E AndroidRuntime: java.lang.NoSuchMethodError: No virtual method isPlaybackDisplay()Z in class Lcom/android/server/wm/SrDisplayContent; or its super classes (declaration of 'com.android.server.wm.SrDisplayContent' appears in /system/framework/services.jar!classes3.dex) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.mediatek.server.wm.playback.SrPlaybackExtImpl.isPlaybackDisplay(SrPlaybackExtImpl.java:62) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.wm.DisplayContent.isPlaybackDisplay(DisplayContent.java:6558) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.wm.DisplayContent.shouldSleep(DisplayContent.java:6562) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.wm.RootWindowContainer.hasAwakeDisplay(RootWindowContainer.java:3128) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.wm.ActivityTaskManagerService.updateSleepIfNeededLocked(ActivityTaskManagerService.java:5109) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.wm.TaskDisplayArea.addChildTask(TaskDisplayArea.java:336) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.wm.TaskDisplayArea.addChild(TaskDisplayArea.java:311) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.wm.Task$Builder.build(Task.java:6789) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.wm.TaskDisplayArea.createRootTask(TaskDisplayArea.java:1010) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.wm.TaskDisplayArea.createRootTask(TaskDisplayArea.java:984) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.wm.TaskDisplayArea.getOrCreateRootHomeTask(TaskDisplayArea.java:1569) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.wm.RootWindowContainer.setWindowManager(RootWindowContainer.java:1293) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.wm.ActivityTaskManagerService.setWindowManager(ActivityTaskManagerService.java:1077) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.am.ActivityManagerService.setWindowManager(ActivityManagerService.java:2155) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.SystemServer.startOtherServices(SystemServer.java:1655) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.SystemServer.run(SystemServer.java:947) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.server.SystemServer.main(SystemServer.java:662) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:601) 06-27 15:50:50.222 17748 17748 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:940) 06-27 15:50:52.105 17862 17862 D AndroidRuntime: >>>>>> START com.android.internal.os.ZygoteInit uid 0 <<<<<< 06-27 15:50:52.109 17863 17863 D AndroidRuntime: >>>>>> START com.android.internal.os.ZygoteInit uid 0 <<<<<< 06-27 15:50:52.114 17862 17862 I AndroidRuntime: Using default boot image 06-27 15:50:52.114 17862 17862 I AndroidRuntime: Leaving lock profiling enabled 06-27 15:50:52.118 17863 17863 I AndroidRuntime: Using default boot image 06-27 15:50:52.118 17863 17863 I AndroidRuntime: Leaving lock profiling enabled 06-27 15:50:55.185 18066 18066 D AndroidRuntime: Shutting down VM 为什么会有这种问题
最新发布
06-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值