mli*_*liu 5 android in-app-purchase in-app-billing
我有一个包含许多活动的应用程序。活动之一是显示购买选项。
在帐单库的示例应用程序(https://github.com/googlesamples/android-play-billing)中,使用了BillingClientLifecycle和BillingManager,它们都与单个活动相关联,因此在以下情况下打开/关闭连接活动已创建/销毁。
但是,在具有许多活动的应用程序中,针对不同的活动分别执行此操作似乎并不理想。我还想在应用启动时检查订阅是否有效。
我正在考虑在应用程序的Application子类中创建BillingClient。但是,如果这样做,我只会打开BillingClient连接,而不会关闭它(因为那里没有onDestroy方法)。有人做过此事并且遇到任何问题吗?另外,这是否违反最佳做法,是否会导致网络/性能出现问题?
我通读了BillingClientImpl.javain的来源billing-1.2.2-sources.jar,我相信将其BillingClient用作应用程序单例是安全的,即使这意味着永远不会调用BillingClient.endConnection().
BillingClientImpl.javaActivity在其构造函数中不需要/使用 an ;它使用 a Context,它所做的只是调用context.getApplicationContext()来存储应用程序上下文。该launchBillingFlow方法确实有一个Activity参数,但不存储活动;它的唯一目的是activity.startActivity(intent)带着计费意图打电话。
BillingClient.startConnection调用context.registerReceiver将自己注册BillingBroadcastReceiver为 a BroadcastReceiver,然后调用context.bindService绑定服务连接。(同样,这两个调用都是针对应用上下文执行的mApplicationContext,而不是针对任何特定的Activity。)
只要应用程序的整个生命周期都需要计费客户端,调用registerReceiverand bindServiceinApplication.onCreate()和从不调用unregisterReceiveror就是安全和可接受的unbindService。
如果registerReceiver和/或bindService调用使用Activity上下文,这将是不安全的,因为在销毁ServiceConnection时会泄漏Activity,但是当应用程序被销毁时,其进程终止,并且其所有服务连接都会自动清除。
关于更新的 2.x 版本的计费库,引用来自TrivialDriveKotlin官方演示应用BillingRepository来源:
请注意,到 [playStoreBillingClient] 的连接是使用 applicationContext 创建的。这意味着该实例不是特定于 [Activity] 的。而且由于它也不贵,因此它可以在整个 [应用程序] 的生命周期内保持开放状态。因此,它是为每个 [Activity] 或 [Fragment](重新)创建还是在应用程序的生命周期内保持打开状态是一个选择问题。
我想这也适用于第一个版本。
看起来这可以通过架构组件来完成。即在您的应用程序的 OnCreate 中,调用:
ProcessLifecycleOwner.get().lifecycle.addObserver(billingClient)
只需将 billingClient 注入到需要它的活动中即可。