参考微信开放平台提供的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
在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一直持有不能释放。