Java 如何使用接口在两个活动之间进行通信

Java 如何使用接口在两个活动之间进行通信,java,android,interface,android-activity,listener,Java,Android,Interface,Android Activity,Listener,我试图在两个活动Act1和Act2之间建立侦听器接口Act1将启动Act2。如果在Act2中发生了一些事件,它将通知它到Act1。问题是我正在使用Intent启动新的活动,所以Act1如何将自己分配为Act2接口的侦听器呢 Act1.java 公共类Act1扩展了ActionBarActivity实现 ActionBar.OnNavigationListener{ ActionBar ActionBar; 意图;意图; 布尔visibleFirstTime=true; 创建时的公共void(Bu

我试图在两个活动
Act1和Act2
之间建立侦听器接口<代码>Act1将启动
Act2
。如果在
Act2
中发生了一些事件,它将通知它到
Act1
。问题是我正在使用Intent启动新的活动,所以Act1如何将自己分配为Act2接口的侦听器呢

Act1.java

公共类Act1扩展了ActionBarActivity实现
ActionBar.OnNavigationListener{
ActionBar ActionBar;
意图;意图;
布尔visibleFirstTime=true;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.menutab);
//在这里设置actionbar
}
@凌驾
公共布尔值onNavigationItemSelected(int arg0,long arg1)//项目位置,
//项目ID
{
开关(arg0){
案例0:
if(this.visibleFirstTime==false)
{
if(pizzaIntent==null)
{
pizzaIntent=新的意图(本,Act2.class);
//如何调用setChangeListener?
}
星触觉(pizzaIntent);
}
其他的
this.visibleFirstTime=false;
打破
案例1:
System.out.println(“所选:“+arg0”);
打破
案例2:
System.out.println(“所选:“+arg0”);
打破
案例3:
System.out.println(“所选:“+arg0”);
打破
违约:
打破
}
返回true;
}
}
Act2.java

公共类Act2扩展活动{
选择改变监听器;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.pizza\u slice\u selection);
}
public void setChangeListener(selectionChangeListener listener)
{
this.listener=listener;
}
私有接口选择ChangeListener
{
公共void selectionMadeAtIndex(int-index);
}
}
注意:请不要建议我使用碎片。我现在想使用活动。

您考虑过使用吗

在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"));
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("activity-2-initialized"));
在Act1的onDestroy中:

LocalBroadcastManager.getInstance(this).unregisterReceiver(act2InitReceiver);
在Act2的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"));
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("activity-2-initialized"));

如果代码没有编译,请给我一个注释,我是手工编写的。

我建议创建一个类。让我举个例子:

模型类:

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();
    }
}
下面是您将如何使用它:

// 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));
    }
}
在第二个活动中更改成员国:

// Imports
public class SecondActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CustomModel.getInstance().changeState(true);
    }
}

LogCat输出:

当前状态:false


main活动说明:模型状态已更改:true

实现这一点的最佳、最短和最简单的方法是使用静态变量,如下所示:

class Main extends Activity {
  static String message = "Hi";
}

class Another extends Activity {
  public onCreate() {
     Log.i(Main.message); // implementation of the message, 'Hi' 
  }
}

稍后我会在其他地方用这个。谢谢你的建议:)这是最好的方法。非常感谢!最棒的方式是:D^upvote@vilpe89,郊区,这是史上最聪明的答案有史以来最糟糕的想法。。。您永远不应该在某些单例中存储活动引用…而
stateChanged
中的简单
station可能会起作用。。。不允许任何UI交互!这个答案帮助我更好地理解当地广播。这不是问题的答案。问题是不同的,答案是不同的。7年后的今天,这个答案已经很老了。LocalBroadcastManager已被弃用。一种更先进的方法是拥有一个共享的模型对象(可能是一个单例对象),并让两个活动都使用它来共享数据。不过,您应该小心不要在该模型中存储活动引用!hehe这是Android,它可以工作,但这种方法会在活动生命周期中出现问题,并会导致依赖性问题。它不会导致任何问题,因为它是“静态”的,因此不依赖于活动对象实例,因为它是一个类级变量。它仍然是Java.yes,这是做这项工作最简单的方法,没有问题。