Android: 从子模块无法向主应用程序广播。这可行吗?

5
我有一个主应用程序,我们称之为“app”,然后有名为“module1”和“module2”的子模块。这些模块是“app”的依赖项。 “app”启动“module1”,它完成其工作后广播一条消息,该消息应该被“app”接收,以便它可以继续其流程。但是,我似乎无法在“app”中成功接收它。 我想知道,是否可能从子模块发送广播消息? 模块应尽可能独立于主应用程序,以便也可以与其他应用程序一起使用,例如插件。这就是为什么我没有在主应用程序的清单中添加与模块相关的内容。模块有自己的清单。 广播在模块内部正常工作。 代码非常直观:
public class MyReceiver extends BroadcastReceiver {

mFilter = new IntentFilter("com.myapp.main.CUSTOM_INTENT");
mReceiver = new MyReceiver();

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(Constants.TAG, "receiver worked");
    }

    // constructor
    public MyReceiver(){

    }
}

在清单文件中:

<receiver android:name=".MyReceiver">
        <intent-filter>
            <action android:name="com.myapp.main.CUSTOM_INTENT" />
        </intent-filter>
    </receiver>

在子模块中:

Intent intent = new Intent("com.myapp.main.CUSTOM_INTENT");
            intent.putExtra("value", 0);
            sendBroadcast(intent);

我在想,从子模块发送广播消息是否可能?是的,不过你应该真的使用LocalBroadcastManager或其他形式的进程内事件总线(例如greenrobot的EventBus,Square的Otto),以获得更好的性能、安全性和简洁性。 - CommonsWare
我也尝试了LocalBroadcastManager,参考了这个答案:https://dev59.com/tWoy5IYBdhLWcg3wD53G,但是没有成功。 - zeeshan
在我的实验中,Context.sendBroadcast可以工作,但LocalBroadcastManager.sendBroadcast无法跨模块工作。 - Alpha Huang
2个回答

3

只需将组件的完整路径和其包设置为接收器即可

Intent intent = new Intent("com.myapp.main.CUSTOM_INTENT");
intent.putExtra("value", 0);
intent.setComponent(new ComponentName(com.pkg","com.pkg.MyReceiver"));

sendBroadcast(intent);

令人惊讶的是,在某些设备上,接收器会在没有设置组件的情况下触发。


0

使用接口怎么样? 您可以在模块中声明一个接口,如下所示:

public class Module1 {
private SessionManager manager;

public interface SessionManager
{
    void onTaskFinished();
}

// in the method to start Module1 something like:

public void startModule(SessionManager manager){
    this.manager = manager;
    //DO STUFF
         ...
    manager.onTaskFinished();
}

将接口实现到启动Module1的托管应用程序类中:

public class App implements SessionManager {
    void launchModule1(){
        Module1.startModule(this);
    }
    void onTaskFinished(){
        Module2.start();
    }

我正试图反向进行,即模块会调用呼叫应用程序中的方法。 - zeeshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接