WXEntryActivity在onResp中调用finish()后,不回调onStart()?
发布于 6 年前 作者 bdu 2449 次浏览 来自 官方Issues

参考微信开放平台提供的demo项目,我创建了<package-name>.wxapi.WXEntryActivity类,并实现了IWXAPIEventHandler接口。

在调用分享图片到微信好友后,返回APP,WXEntryActivity被唤起。

在onCreate()方法中我调用了

wxApi = WXAPIFactory.createWXAPI(applicationContext, , false)

try {
    wxApi?.handleIntent(intent, this)
} catch (e: Throwable) {
    Log.e(TAG, "onCreate ex", e)
}

在回调 fun onResp(resp: BaseResp)方法执行完成后,我调用了finish()方法,结束当前页面。

通过打印日志,我发现方法生命周期只执行了onCreate()和onDestroy()。

class WXEntryActivity : Activity(), IWXAPIEventHandler {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        wxApi = WXAPIFactory.createWXAPI(applicationContext, WxPlatformApp.APP_ID, false)
        try {
            wxApi?.handleIntent(intent, this)
        } catch (e: Throwable) {
            KLog.e(TAG, "onCreate ex", e)
        }
        KLog.d(TAG, "WXEntryActivity onCreate")
    }
    override fun onStart() {
        super.onStart()
        KLog.d(TAG, "WXEntryActivity onStart")
    }

    override fun onResume() {
        super.onResume()
        KLog.d(TAG, "WXEntryActivity onResume")
    }

    override fun onPause() {
        super.onPause()
        KLog.d(TAG, "WXEntryActivity onPause")
    }

    override fun onStop() {
        super.onStop()
        KLog.d(TAG, "WXEntryActivity onStop")
    }

    override fun onDestroy() {
        super.onDestroy()
        KLog.d(TAG, "WXEntryActivity onDestroy")
    } 

    override fun onResp(resp: BaseResp) {
        ...
        finish()
    }
}

打印的日志生命周期只有如下,请问问题出在哪里呢?

05-21 19:46:38.511 3843-3843/ I/qian.BaseApplication: onActivityCreated .wxapi.WXEntryActivity@21b051a6
05-21 19:46:38.512 3843-3843/ D/CrashReport: >>> com.gzlike.qassistant.wxapi.WXEntryActivity onCreated <<<
05-21 19:46:38.515 3843-3843/ D/qian.WXEntryActivity: WXEntryActivity onCreate
05-21 19:46:38.549 3843-3843/ I/qian.BaseApplication: onActivityDestroyed .wxapi.WXEntryActivity@21b051a6
05-21 19:46:38.549 3843-3843/ D/CrashReport: >>> .wxapi.WXEntryActivity onDestroyed <<<
05-21 19:46:38.549 3843-3843/ D/qian.WXEntryActivity: WXEntryActivity onDestroy
1 回复

在onCreate中调用handleIntent方法后,实际上是在当前线程上继续执行onResp回调;

因为handleIntent方法是BaseWXApiImplV10对象的方法,方法中用传进来的的“IWXAPIEventHandler”参数(也就是这里的"WXEntryActivity"对象),调用onResp回调方法。

也就是onResp的回调会在onCreate方法体中执行完成。

所以onResp中调用finish()方法,实际上是在Activity中调用finish()方法。

所以问题变成了在Activity中调用finish()方法,Activity生命周期是怎样的?


只执行onCreate()、onDestory()会有什么影响?

可能会发生内存泄漏。以下是我碰到的问题。

集成阿里云ams后,“com.ali.telescope.internal.plugins.b.c”有个内部类,混淆后的名字是a,继承了“ActivityLifecycleCallbacks”。这个类有个成员变量c,数据结构为HashMap,key为Activity。当回调“onActivityCreated”,c会把当前的activity存放在集合里,当回调“onActivityStarted”,c会把当前activity从集合中移除掉。

如果一个activity走完整生命周期,不会有问题。但是如果只走了onCreate()和onDestoy()就会内存泄漏——activity被c一直持有不能释放。

回到顶部