Java 从不同模块中的类从MainActivity调用函数
我只有一个名为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
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。例如: