Java 从不同模块中的类从MainActivity调用函数

Java 从不同模块中的类从MainActivity调用函数,java,android,Java,Android,我只有一个名为MainActivity的活动。它有一个必须从不同模块中的另一个类调用的函数 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Over

我只有一个名为MainActivity的活动。它有一个必须从不同模块中的另一个类调用的函数

public class MainActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

 @Override
      public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}


public void tag_proc(String s1)
{

    System.out.println("working i guess"+s1)

}
}
必须从另一个模块的另一个类调用此函数

public class NewCls {
       MainAcitivity mact= new MainActivity();

      public void dothis()
       {
  String s="new";
       mact.tag_proc(s);

              }

 }

这无法完成,因为它们位于不同的模块中。对于这一点,最好且简单的解决方案是什么。如果界面是一个解决方案,如何最好地使用它

并不清楚您到底想要实现什么,但永远不要这样做:

MainAcitivity mact= new MainActivity();
您只能通过
Intent
s创建活动,而不是您自己

如果您想要一个紧密耦合的模块,只需在构造函数中传递活动即可

public NewCls(MainActivity activity) {
    myActivityReference = activity
}

public void dothis() {
    ...
    myActivityReference.tag_proc(s);
}
如果您提取一个接口并使用它而不是activity类本身,这将是最好的,但是为了简单起见,我用了一种简单的方式展示了它

如果你想要一个更松散耦合的通信,你可以使用本地广播。只需在活动中注册一个接收器,然后像这样从NewCls发送广播

public void dothis() {
  Intent intent = new Intent("custom-event-name");
  intent.putExtra("myString", "This is my message!");
  LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
在你的活动中

@Override
public void onCreate(Bundle savedInstanceState) {

  ...

  // Register to receive messages. We are registering an observer (mMessageReceiver) to receive Intents with actions named "custom-event-name".
  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("custom-event-name"));
}

// Our handler for received Intents. This will be called whenever an Intent with an action named "custom-event-name" is broadcasted.
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    String s1= intent.getStringExtra("myString");
    tag_proc(s1);
  }
};

@Override
protected void onDestroy() {
  // Unregister since the activity is about to be closed.
     LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
      super.onDestroy();
}

.

在我看来,像这样调用方法可能是一种不好的做法。您可以将该方法设置为静态,但是您应该确定这是否适合这种情况。我认为最好的选择可能是使用EventBus,它既有效又有简单的API。例如: