Java 如何使用接口在两个活动之间进行通信
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19026515/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to use interface to communicate between two activities
提问by NightFury
I am trying to make listener interface between two activities Act1 and Act2
. Act1
will start Act2
. If there is some event occurred in Act2
, it will inform it to Act1
. Problem is that I am starting new activity using Intent, so how Act1 will assign itself as listener to Act2's interface?
我正在尝试在两个活动之间制作侦听器界面Act1 and Act2
。Act1
将开始Act2
。如果有什么事件发生Act2
,它会通知它Act1
。问题是我正在使用 Intent 开始新活动,那么 Act1 如何将自己指定为 Act2 接口的侦听器?
Act1.java
操作1.java
public class Act1 extends ActionBarActivity implements
ActionBar.OnNavigationListener {
ActionBar actionbar;
Intent pizzaIntent;
boolean visibleFirstTime = true;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.menutab);
//set actionbar here
}
@Override
public boolean onNavigationItemSelected(int arg0, long arg1)// item pos,
// itemid
{
switch (arg0) {
case 0:
if(this.visibleFirstTime == false)
{
if(pizzaIntent == null)
{
pizzaIntent = new Intent(this,Act2.class);
//how to call setChangeListener?
}
startActivity(pizzaIntent);
}
else
this.visibleFirstTime = false;
break;
case 1:
System.out.println("selected: " + arg0);
break;
case 2:
System.out.println("selected: " + arg0);
break;
case 3:
System.out.println("selected: " + arg0);
break;
default:
break;
}
return true;
}
}
Act2.java
操作2.java
public class Act2 extends Activity {
selectionChangeListener listener;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pizza_slice_selection);
}
public void setChangeListener(selectionChangeListener listener)
{
this.listener = listener;
}
private interface selectionChangeListener
{
public void selectionMadeAtIndex(int index);
}
}
Note:Please don't suggest me to use fragments. I want to use activities currently.
注意:请不要建议我使用片段。我现在想使用活动。
采纳答案by npace
Have you considered using LocalBroadcastManager?
您是否考虑过使用LocalBroadcastManager?
In Act1's onCreate:
在 Act1 的 onCreate 中:
act2InitReceiver= new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
// do your listener event stuff
}
};
LocalBroadcastManager.getInstance(this).registerReceiver(act2InitReceiver, new IntentFilter("activity-2-initialized"));
In Act1's onDestroy:
在 Act1 的 onDestroy 中:
LocalBroadcastManager.getInstance(this).unregisterReceiver(act2InitReceiver);
In Act2's onCreate:
在 Act2 的 onCreate 中:
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("activity-2-initialized"));
Give me a comment if the code doesn't compile, I'm writing it by hand.
如果代码无法编译,请给我一个评论,我是手工编写的。
回答by vilpe89
I would suggest to create a modelclass. Let me give you an example:
我建议创建一个模型类。让我给你举个例子:
Model class:
模型类:
public class CustomModel {
public interface OnCustomStateListener {
void stateChanged();
}
private static CustomModel mInstance;
private OnCustomStateListener mListener;
private boolean mState;
private CustomModel() {}
public static CustomModel getInstance() {
if(mInstance == null) {
mInstance = new CustomModel();
}
return mInstance;
}
public void setListener(OnCustomStateListener listener) {
mListener = listener;
}
public void changeState(boolean state) {
if(mListener != null) {
mState = state;
notifyStateChange();
}
}
public boolean getState() {
return mState;
}
private void notifyStateChange() {
mListener.stateChanged();
}
}
And here's how you would use this:
以下是您将如何使用它:
// Imports
public class MainActivity extends Activity implements OnCustomStateListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomModel.getInstance().setListener(this);
boolean modelState = CustomModel.getInstance().getState();
Log.d(TAG, "Current state: " + String.valueOf(modelState));
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
}
@Override
public void stateChanged() {
boolean modelState = CustomModel.getInstance().getState();
Log.d(TAG, "MainActivity says: Model state changed: " +
String.valueOf(modelState));
}
}
Changing the member state in second activity:
在第二个活动中更改会员状态:
// Imports
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CustomModel.getInstance().changeState(true);
}
}
LogCat output:
LogCat 输出:
Current state: false
Current state: false
MainActivity says: Model state changed: true
MainActivity says: Model state changed: true
回答by LEMUEL ADANE
The shorter alternative way is to use static variables, like this:
更短的替代方法是使用静态变量,如下所示:
class Main extends Activity {
static String msg = "Hi";
}
class Another extends Activity {
public onCreate() {
Log.i(Main.msg);
}
}