实现库中定义的接口

时间:2018-03-28 15:25:53

标签: java android

我的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函数?

2 个答案:

答案 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的范围限制为应用程序自己的包。然后,通过PackageManagerresolveActivity()查找活动。使用该信息构建显式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();
            }
        }
    }