Android Studio中library模块如何调用主app模块的refresh刷新函数
实现方案
因主app模块依赖library模块,不能反向依赖,采用以下两种解耦方案实现跨模块调用,按需选择即可:
方案一:利用Activity返回结果实现(无需修改library核心逻辑,推荐)
你当前的library代码在校验成功后已经执行了setResult(RESULT_OK),直接在主app侧监听Activity返回结果即可实现需求:
- 首先修改主app模块
BaseActivity中refresh()方法的可见性,从private改为protected:
// 主app模块 BaseActivity.kt protected fun refresh() { //原有刷新逻辑 }
- 在
BaseActivity中注册Activity返回结果监听,替换原有启动逻辑:
open class BaseActivity : AppCompatActivity() { lateinit var pref: PreferenceManager lateinit var repository: BasicRepository // 注册验证码页面返回结果监听 private val pinCodeLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { // 验证码校验成功,触发刷新 refresh() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) pref = PreferenceManager(this) setupContentWindow() } override fun onResume() { super.onResume() if (pref.checkCredential()) { val intent = PinCodeActivity.intent(this, true, pref.token()) // 用注册的launcher启动页面,替换原有startActivity pinCodeLauncher.launch(intent) } else { // 无需跳验证码时直接刷新 refresh() } } protected fun refresh() { //原有刷新逻辑 } }
注意:原
onResume逻辑不管是否跳转验证码都会执行refresh(),此处做了逻辑优化,避免跳转前多余刷新,若需要保留原有逻辑可自行调整。
方案二:接口回调方案(适合校验成功后无需等待页面销毁就要回调的场景)
- 首先在library模块定义公共回调接口(注意和library代码语言统一用Java定义):
// library模块 VerificationCallback.java public interface VerificationCallback { void onVerificationSuccess(); }
- 修改library模块的
PinCodeActivity,支持传入回调、校验成功触发回调:
// library模块 PinCodeActivity.java public class PinCodeActivity extends Activity { private static VerificationCallback verificationCallback; // 对外暴露设置回调的静态方法 public static void setVerificationCallback(VerificationCallback callback) { verificationCallback = callback; } private void checkCode(String pin, String token) { APIManager.getInstance().verifyCode(token, pin, new Callback<String>() { @Override public void onResponse(Call<String> call, Response<String> response) { String responseUser = response.body(); if (response.code() == 200) { // 注意Java字符串比较要使用equals,不要用== if ("true".equals(responseUser)) { setResult(RESULT_OK); // 校验成功触发回调 if (verificationCallback != null) { verificationCallback.onVerificationSuccess(); // 用完置空避免内存泄漏 verificationCallback = null; } finish(); } else { //原有逻辑 } } else { //原有逻辑 } } @Override public void onFailure(Call<String> call, Throwable t) { //原有逻辑 } }); } // 页面销毁时清空回调避免内存泄漏 @Override protected void onDestroy() { super.onDestroy(); verificationCallback = null; } }
- 在主app模块的
BaseActivity中设置回调实现:
open class BaseActivity : AppCompatActivity() { lateinit var pref: PreferenceManager lateinit var repository: BasicRepository override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) pref = PreferenceManager(this) setupContentWindow() // 设置验证码校验成功回调 PinCodeActivity.setVerificationCallback(object : VerificationCallback { override fun onVerificationSuccess() { refresh() } }) } override fun onResume() { super.onResume() if (pref.checkCredential()) { val intent = PinCodeActivity.intent(this, true, pref.token()) startActivity(intent) } refresh() } protected fun refresh() { //原有刷新逻辑 } override fun onDestroy() { super.onDestroy() // 页面销毁时清空回调避免内存泄漏 PinCodeActivity.setVerificationCallback(null) } }
内容的提问来源于stack exchange,提问作者14079_Z
相关产品推荐
相关产品推荐

