我的Android库定义了一个用于注册库以获取回调的接口。我需要我的应用程序来实现接口。但这会导致循环依赖,如何在不调用循环依赖的情况下实现这一点。 项目结构:
MyApp- /。
class LibraryImpl实现了接口寄存器
MyLib- /。
接口寄存器。
示例代码段
MyLib 。
ActivityStarter.java
public interface ActivityStarter {
void startHelpActivity();
}
ActivityStarterModule.java
public class ActivityStarterModule extends ReactContextBaseJavaModule {
@ReactMethod
void navigateToExample() {
//Start an activity
}
}
MyApp 。
ActivityStarterImpl.java
public class ActivityStarterImpl extends BaseActivity implements ActivityStarter {
public void startHelpActivity(){
Intent intent = new Intent(this, HelpActivity.class);
startActivity(intent);
}
}
如何从MyLib函数中的navigateToExample触发调用MyApp中的startHelpActivity函数?
答案 0 :(得分:0)
myLib如何知道哪个类正在实现该接口?
选项#1:MyApp将其作为参数传递给MyLib。这与你将其传递给Intent
的方式相同:通过Java Class
对象。
选项#2:对于某些自定义隐式<intent-filter>
操作,活动有Intent
。 MyLib为隐式Intent
操作创建Intent
,并使用setPackage()
将Intent
的范围限制为应用程序自己的包。然后,使用Intent
启动活动。
选项#3:对于某些自定义隐式<intent-filter>
操作,活动有Intent
。 MyLib为隐式Intent
操作创建Intent
,并使用setPackage()
将Intent
的范围限制为应用程序自己的包。然后,通过PackageManager
和resolveActivity()
查找活动。使用该信息构建显式Intent
(具有活动的ComponentName
的那个)。然后,使用明确的Intent
启动活动。
选项#4:没有两个单独的模块;所有这些都是一个应用程序模块。然后,以前在MyLib中的代码可以直接访问以前在MyApp中的代码。
答案 1 :(得分:0)
基于CommonsWare提供的建议的解决方案。
MyLib。
ActivityStarter.java
public interface ActivityStarter {
void startHelpActivity();
}
ActivityStarterModule.java
public class ActivityStarterModule extends ReactContextBaseJavaModule {
ActivityStarter mActivityStarter;
@ReactMethod
void navigateToExample() {
//Start an activity
mActivityStarter.startHelpActivity();
}
}
MyApp。 ActivityStarterImpl.java
public class ActivityStarterImpl extends BaseActivity implements ActivityStarter {
public void startHelpActivity(){
Intent intent = new Intent(this, HelpActivity.class);
startActivity(intent);
}
}
public class BaseActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityStarterModule.mActivityStarterModule = new ActivityStarterImpl() {
@Override
public void startHelpActivity() {
super.startHelpActivity();
}
}
}