Commit 1235915f authored by shiyl's avatar shiyl

修改BaseApplication初始化多次,导致的注册服务多次的问题

parent d3d35a13
......@@ -2,234 +2,11 @@ package com.yidian.common
import android.app.Activity
import android.app.Application
import android.content.Context
import android.content.res.Configuration
import android.os.Bundle
import com.orhanobut.hawk.Hawk
import com.scwang.smart.refresh.footer.ClassicsFooter
import com.scwang.smart.refresh.header.ClassicsHeader
import com.scwang.smart.refresh.layout.SmartRefreshLayout
import com.scwang.smart.refresh.layout.constant.SpinnerStyle
import com.yidian.common.http.ApiSaveCookiesInterceptor
import com.yidian.common.http.ApiSetCookiesInterceptor
import com.yidian.common.services.AppUpgradeService
import com.yidian.common.services.ImageService
import com.yidian.common.services.XEventService
import com.yidian.common.services.XPageService
import com.yidian.common.services.http.MBHttpReqService
import com.yidian.common.utils.UMConfigUtils
import com.yidian.commonutil.CommonUtilLifecycleModule
import com.yidian.framework.mobile.xdiamond.SecretUtil
import com.yidian.http.ServiceFactory
import com.yidian.news.util.ProcessUtil
import com.yidian.xarc.xbase.utils.XLogger
import com.yidian.xarc.xbrid.*
import com.yidian.xpage.XPageManager
import com.yidian.yac.core.zap.Zap
import com.yidian.yac.core.zap.ZapTicket
import com.yidian.yac.ftdevicefinger.core.FtDeviceFingerManager
import com.yidian.yac.pm.appupdate.PmUpdateApp
import com.yidian.yac.pm.appupdate.YDAppUpdateManager
import org.json.JSONObject
import timber.log.Timber
open class YdBaseApplication : Application() {
private val module: CommonUtilLifecycleModule by lazy {
CommonUtilLifecycleModule(
com.yidian.xarc.xbrid.BuildConfig.DEBUG,
this,
".CommonInfrastructure"
)
}
private val activityLifecycle = object : ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
activityList.add(activity)
}
override fun onActivityStarted(activity: Activity) {
}
override fun onActivityResumed(activity: Activity) {
}
override fun onActivityPaused(activity: Activity) {
}
override fun onActivityStopped(activity: Activity) {
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
}
override fun onActivityDestroyed(activity: Activity) {
activityList.remove(activity)
}
}
override fun onCreate() {
super.onCreate()
// 先初始化日志防止调用时报初始化异常
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
UMConfigUtils.init(this)
if (ProcessUtil.isMainProcess(this)) {
context = this
FtDeviceFingerManager.init(this)
initCommonUtils()
Zap.init(this) {}
XPageManager.init(this)
initXBridManager()
loadService()
registerActivityLifecycleCallbacks(activityLifecycle)
// 初始化磐石SDK
SecretUtil.init(BuildConfig.IS_ENCRYPT_DEBUG_KEY)
// 初始化App升级
initAppUpgrade()
initSmartRefreshLayout()
}
}
/**
* 设置刷新 默认的header和footer
*/
private fun initSmartRefreshLayout() {
//设置全局的Header构建器
SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout ->
layout.setPrimaryColorsId(android.R.color.transparent)//全局设置主题颜色
ClassicsHeader(context) //指定为经典Header,默认是 贝塞尔雷达Header
}
//设置全局的Footer构建器
SmartRefreshLayout.setDefaultRefreshFooterCreator { context, layout ->
layout.setEnableLoadMoreWhenContentNotFull(true) //内容不满一页时候启用加载更多
val footer = ClassicsFooter(context)
footer.setBackgroundResource(android.R.color.transparent)
footer.setDrawableSize(20f)
footer.spinnerStyle = SpinnerStyle.FixedBehind //设置为固定在背后模式
footer //指定为经典Footer,默认是 BallPulseFooter
}
}
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
if (ProcessUtil.isMainProcess(this)) {
module.onBaseContextAttached(base)
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
if (ProcessUtil.isMainProcess(this)) {
module.onConfigurationChanged(newConfig)
}
}
private fun initCommonUtils() {
module.onCreate()
Hawk.init(this).build()
initHttp()
}
private fun initHttp() {
// val header = HashMap<String, String>()
// header["Content-Type"] = "application/json"
// header["charset"] = "UTF-8"
// ServiceFactory.getInstance().addInterceptor(HttpInterceptor(header))
// ServiceFactory.getInstance().init(true, URLs.BASE_URL, 10, 10)
ServiceFactory.getInstance().init(true, BuildConfig.API_URL, 10, 10)
ServiceFactory.getInstance().addInterceptor(ApiSaveCookiesInterceptor())
ServiceFactory.getInstance().addInterceptor(ApiSetCookiesInterceptor())
}
private fun initXBridManager() {
XBridManager.init(
XBridApp(applicationContext) {
assetRoot = "www"//对应assets目录下存放xbrid资源对应的目录名
appId = applicationContext.packageName //当前应用包名
platformId = 16 //需要去平台申请
appVersion = AppConfig.cv//当前应用版本号
deviceFinger = FtDeviceFingerManager.getDeviceFinger()//设备指纹
androidChannel = AppConfig.distribution//对应渠道名
}, 20//webview缓存池数量,默认不缓存
)
XBridManager.registerServiceInvoker(object : OnServiceInvoke {
override fun onCall(
identifier: String, // the identifier assigned when webview created
xWebView: XWebView, // webivew 加载的 js 发起的服务调用请求
request: Request, // 具体的服务请求参数,分为 name 和 params 两个部分
response: Response // 业务方需要借助 response 来回应服务调用结果
) {
val data = request.params as JSONObject
// JS调用Native传递的数据
Timber.tag("xbrid").e("服务名:%s", request.name)
Timber.tag("xbrid").e("JS传递参数:%s", data)
val action = data.optString("action")
val params = data.optJSONObject("params")
val options = data.optJSONObject("options")
// Native调用JS传递的数据
ZapTicket(request.name).withAction(action).withServiceParams(params).withServiceOptions(options).withIdentifier(identifier)
.onResult { result ->
response.result(result.code, result.result ?: "", "")
}.onLost { result ->
response.result(result.code, "", result.mesg)
}.ship()
}
})
XBridManager.registerXPageInvoker(object : OnXPageInvoke {
override fun onCall(identifier: String, xWebView: XWebView, request: XPageRequest) {
val params = mutableMapOf<String, Any>()
(request.params as JSONObject).let { reParams ->
reParams.keys().forEach {
params[it] = reParams[it]
}
}
when (request.action) {
"push" -> XPageManager.push(request.name, params)
"pop" -> XPageManager.pop(params)
"popTo" -> XPageManager.popTo(request.name, params)
"popToRoot" -> XPageManager.popToRoot(params)
}
}
})
}
private fun loadService() {
Zap.addService(XPageService.SERVICE_NAME, XPageService())
Zap.addService(XEventService.SERVICE_NAME, XEventService())
Zap.addService(AppUpgradeService.SERVICE_NAME, AppUpgradeService())
Zap.addService(MBHttpReqService.SERVICE_NAME, MBHttpReqService())
Zap.addService(ImageService.SERVICE_NAME, ImageService())
}
/**
* App升级
*/
private fun initAppUpgrade() {
val logger = XLogger("appUpgrade")
logger.debugOn(BuildConfig.DEBUG)
YDAppUpdateManager.init(PmUpdateApp(this) {
online = BuildConfig.IS_APP_UPGRADE_ONLINE // 线上true、线下false
platformId = AppConfig.TowerProPlatformId // 平台Id
platform = AppConfig.TowerProPlatform // ios/Android
appId = packageName // 应用包名
appVersion = AppConfig.cv // 客户端版本号
deviceFinger = FtDeviceFingerManager.getDeviceFinger() // 设备指纹
androidChannel = AppConfig.distribution // 渠道
this.logger = logger.subLogger("appUpgrade")
})
}
companion object {
......
package com.yidian.common.utils
import android.app.ActivityManager
import android.content.Context
import android.os.Process
import com.yidian.news.util.ProcessUtil
import timber.log.Timber
object AppUtils {
fun getProcessInfo() {
val pid = Process.myPid()
Timber.tag("启动").e("YdBaseApplication onCreate ->>>>> pid: $pid")
val currentProcessName = ProcessUtil.getCurrentProcessName()
Timber.tag("启动").e("YdBaseApplication onCreate ->>>>> processName: $currentProcessName")
}
private fun getCurrentProcessName(context: Context): String? {
val pid = Process.myPid()
val mActivityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
for (appProcess in mActivityManager.runningAppProcesses) {
if (appProcess.pid == pid) {
return appProcess.processName
}
}
return null
}
}
......@@ -3,6 +3,7 @@ package com.yidian.shenghuoquan.commodity.app
import android.content.Intent
import com.yidian.common.XRouterPathConstants
import com.yidian.common.YdBaseApplication
import com.yidian.common.utils.AppUtils
import com.yidian.news.util.ProcessUtil
import com.yidian.shenghuoquan.commodity.service.SelectCategoryService
import com.yidian.shenghuoquan.commodity.ui.coupon.ChooseCategoryActivity
......@@ -21,6 +22,7 @@ class CommodityApplication : YdBaseApplication() {
override fun onCreate() {
super.onCreate()
AppUtils.getProcessInfo()
if (ProcessUtil.isMainProcess(this)) {
Timber.tag("注册").e("开始注册")
registerXPage()
......
......@@ -14,6 +14,7 @@ android {
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
buildConfigField("boolean", "IS_ENCRYPT_DEBUG_KEY", rootProject.ext.android.isEncryptDebugKey)
buildConfigField("boolean", "IS_APP_UPGRADE_ONLINE", rootProject.ext.android.isAppUpgradeOnline)
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
manifestPlaceholders = [qqappid: "101923771"]
......@@ -35,6 +36,7 @@ android {
buildTypes {
debug {
applicationIdSuffix ".debug"
buildConfigField("String", "API_URL", rootProject.ext.buildParams.debug.API_URL)
buildConfigField("String", "PROVIDER_NAME", '\"' + rootProject.ext.android.applicationId + ".debug.fileprovider" + '\"')
manifestPlaceholders = [
app_name : "商家版测试",
......@@ -48,6 +50,7 @@ android {
signingConfig signingConfigs.production
}
release {
buildConfigField("String", "API_URL", rootProject.ext.buildParams.release.API_URL)
buildConfigField("String", "PROVIDER_NAME", '\"' + rootProject.ext.android.applicationId + ".fileprovider" + '\"')
manifestPlaceholders = [
app_name : "生活圈商家版",
......
package com.shenghuoquan.business
import android.app.Activity
import android.content.Context
import android.content.res.Configuration
import android.os.Bundle
import com.orhanobut.hawk.Hawk
import com.scwang.smart.refresh.footer.ClassicsFooter
import com.scwang.smart.refresh.header.ClassicsHeader
import com.scwang.smart.refresh.layout.SmartRefreshLayout
import com.scwang.smart.refresh.layout.constant.SpinnerStyle
import com.yidian.common.AppConfig
import com.yidian.common.YdBaseApplication
import com.yidian.common.http.ApiSaveCookiesInterceptor
import com.yidian.common.http.ApiSetCookiesInterceptor
import com.yidian.common.services.AppUpgradeService
import com.yidian.common.services.ImageService
import com.yidian.common.services.XEventService
import com.yidian.common.services.XPageService
import com.yidian.common.services.http.MBHttpReqService
import com.yidian.common.utils.AppUtils
import com.yidian.common.utils.UMConfigUtils
import com.yidian.commonutil.CommonUtilLifecycleModule
import com.yidian.framework.mobile.xdiamond.SecretUtil
import com.yidian.http.ServiceFactory
import com.yidian.news.util.ProcessUtil
import com.yidian.xarc.xbase.utils.XLogger
import com.yidian.xarc.xbrid.*
import com.yidian.xpage.XPageManager
import com.yidian.yac.core.core.YacAppSpec
import com.yidian.yac.core.zap.Zap
import com.yidian.yac.core.zap.ZapTicket
import com.yidian.yac.ftdevicefinger.core.FtDeviceFingerManager
import com.yidian.yac.pm.appupdate.PmUpdateApp
import com.yidian.yac.pm.appupdate.YDAppUpdateManager
import org.json.JSONObject
import timber.log.Timber
@YacAppSpec
......@@ -9,6 +42,202 @@ class YdSubwayApplication : YdBaseApplication() {
override fun onCreate() {
super.onCreate()
if (ProcessUtil.isMainProcess(this)) {
Timber.tag("启动").e("onCreate 开始执行")
context = this
// 先初始化日志防止调用时报初始化异常
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
UMConfigUtils.init(this)
FtDeviceFingerManager.init(this)
initCommonUtils()
Zap.init(this) {}
XPageManager.init(this)
initXBridManager()
loadService()
registerActivityLifecycleCallbacks(activityLifecycle)
// 初始化磐石SDK
SecretUtil.init(BuildConfig.IS_ENCRYPT_DEBUG_KEY)
// 初始化App升级
initAppUpgrade()
initSmartRefreshLayout()
Timber.tag("启动").e("onCreate 执行完成")
}
}
/**
* 设置刷新 默认的header和footer
*/
private fun initSmartRefreshLayout() {
//设置全局的Header构建器
SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout ->
layout.setPrimaryColorsId(android.R.color.transparent)//全局设置主题颜色
ClassicsHeader(context) //指定为经典Header,默认是 贝塞尔雷达Header
}
//设置全局的Footer构建器
SmartRefreshLayout.setDefaultRefreshFooterCreator { context, layout ->
layout.setEnableLoadMoreWhenContentNotFull(true) //内容不满一页时候启用加载更多
val footer = ClassicsFooter(context)
footer.setBackgroundResource(android.R.color.transparent)
footer.setDrawableSize(20f)
footer.spinnerStyle = SpinnerStyle.FixedBehind //设置为固定在背后模式
footer //指定为经典Footer,默认是 BallPulseFooter
}
}
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
if (ProcessUtil.isMainProcess(this)) {
module.onBaseContextAttached(base)
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
if (ProcessUtil.isMainProcess(this)) {
module.onConfigurationChanged(newConfig)
}
}
private fun initCommonUtils() {
module.onCreate()
Hawk.init(this).build()
initHttp()
}
private val module: CommonUtilLifecycleModule by lazy {
CommonUtilLifecycleModule(
com.yidian.xarc.xbrid.BuildConfig.DEBUG,
this,
".CommonInfrastructure"
)
}
private val activityLifecycle = object : ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
activityList.add(activity)
}
override fun onActivityStarted(activity: Activity) {
}
override fun onActivityResumed(activity: Activity) {
}
override fun onActivityPaused(activity: Activity) {
}
override fun onActivityStopped(activity: Activity) {
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
}
override fun onActivityDestroyed(activity: Activity) {
activityList.remove(activity)
}
}
private fun initHttp() {
// val header = HashMap<String, String>()
// header["Content-Type"] = "application/json"
// header["charset"] = "UTF-8"
// ServiceFactory.getInstance().addInterceptor(HttpInterceptor(header))
// ServiceFactory.getInstance().init(true, URLs.BASE_URL, 10, 10)
ServiceFactory.getInstance().init(true, BuildConfig.API_URL, 10, 10)
ServiceFactory.getInstance().addInterceptor(ApiSaveCookiesInterceptor())
ServiceFactory.getInstance().addInterceptor(ApiSetCookiesInterceptor())
}
private fun initXBridManager() {
XBridManager.init(
XBridApp(applicationContext) {
assetRoot = "www"//对应assets目录下存放xbrid资源对应的目录名
appId = applicationContext.packageName //当前应用包名
platformId = 16 //需要去平台申请
appVersion = AppConfig.cv//当前应用版本号
deviceFinger = FtDeviceFingerManager.getDeviceFinger()//设备指纹
androidChannel = AppConfig.distribution//对应渠道名
}, 20//webview缓存池数量,默认不缓存
)
XBridManager.registerServiceInvoker(object : OnServiceInvoke {
override fun onCall(
identifier: String, // the identifier assigned when webview created
xWebView: XWebView, // webivew 加载的 js 发起的服务调用请求
request: Request, // 具体的服务请求参数,分为 name 和 params 两个部分
response: Response // 业务方需要借助 response 来回应服务调用结果
) {
val data = request.params as JSONObject
// JS调用Native传递的数据
Timber.tag("xbrid").e("服务名:%s", request.name)
Timber.tag("xbrid").e("JS传递参数:%s", data)
val action = data.optString("action")
val params = data.optJSONObject("params")
val options = data.optJSONObject("options")
// Native调用JS传递的数据
ZapTicket(request.name).withAction(action).withServiceParams(params).withServiceOptions(options).withIdentifier(identifier)
.onResult { result ->
response.result(result.code, result.result ?: "", "")
}.onLost { result ->
response.result(result.code, "", result.mesg)
}.ship()
}
})
XBridManager.registerXPageInvoker(object : OnXPageInvoke {
override fun onCall(identifier: String, xWebView: XWebView, request: XPageRequest) {
val params = mutableMapOf<String, Any>()
(request.params as JSONObject).let { reParams ->
reParams.keys().forEach {
params[it] = reParams[it]
}
}
when (request.action) {
"push" -> XPageManager.push(request.name, params)
"pop" -> XPageManager.pop(params)
"popTo" -> XPageManager.popTo(request.name, params)
"popToRoot" -> XPageManager.popToRoot(params)
}
}
})
}
private fun loadService() {
Zap.addService(XPageService.SERVICE_NAME, XPageService())
Zap.addService(XEventService.SERVICE_NAME, XEventService())
Zap.addService(AppUpgradeService.SERVICE_NAME, AppUpgradeService())
Zap.addService(MBHttpReqService.SERVICE_NAME, MBHttpReqService())
Zap.addService(ImageService.SERVICE_NAME, ImageService())
}
/**
* App升级
*/
private fun initAppUpgrade() {
val logger = XLogger("appUpgrade")
logger.debugOn(BuildConfig.DEBUG)
YDAppUpdateManager.init(PmUpdateApp(this) {
online = BuildConfig.IS_APP_UPGRADE_ONLINE // 线上true、线下false
platformId = AppConfig.TowerProPlatformId // 平台Id
platform = AppConfig.TowerProPlatform // ios/Android
appId = packageName // 应用包名
appVersion = AppConfig.cv // 客户端版本号
deviceFinger = FtDeviceFingerManager.getDeviceFinger() // 设备指纹
androidChannel = AppConfig.distribution // 渠道
this.logger = logger.subLogger("appUpgrade")
})
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment