如何使用接口在两个活动之间进行通信
Posted
技术标签:
【中文标题】如何使用接口在两个活动之间进行通信【英文标题】:How to use interface to communicate between two activities 【发布时间】:2013-10-02 07:40:34 【问题描述】:我正在尝试在两个活动Act1 and Act2
之间创建侦听器接口。 Act1
将启动 Act2
。如果Act2
发生了一些事件,它会通知Act1
。问题是我正在使用 Intent 开始新的活动,那么 Act1 将如何将自己分配为 Act2 接口的侦听器?
Act1.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
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);
注意:请不要建议我使用片段。我目前想使用活动。
【问题讨论】:
【参考方案1】:我建议创建一个model 类。举个例子吧:
模型类:
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 输出:
Current state: false
MainActivity says: Model state changed: true
【讨论】:
我稍后会在其他地方使用它。感谢您的建议:) 这是最好的办法。 非常感谢!最好的方法和真棒它是:D ^ upvote @vilpe89,郊区,这是***历史上最聪明的答案 有史以来最糟糕的主意......你永远不应该将 Activity 引用存储在一些单例中......而stateChanged
中的简单Log
statment 可能会起作用......不允许任何 UI 交互!跨度>
【参考方案2】:
您是否考虑过使用LocalBroadcastManager?
在 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"));
在 Act1 的 onDestroy 中:
LocalBroadcastManager.getInstance(this).unregisterReceiver(act2InitReceiver);
在 Act2 的 onCreate 中:
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("activity-2-initialized"));
如果代码无法编译,请给我评论,我是手写的。
【讨论】:
这个答案帮助我更好地理解本地广播。 ***.com/a/8875292/437146 这不是问题的答案。问题不同,答案不同 这个答案现在已经很老了,7年后。 LocalBroadcastManager 已被弃用。一种更新的方法是拥有一个共享模型对象(可能是一个单例)并让两个活动都使用它来共享数据。不过,您应该小心不要将 Activity 引用存储在该模型中!【参考方案3】:最好、最短和最简单的方法是使用静态变量,如下所示:
class Main extends Activity
static String message = "Hi";
class Another extends Activity
public onCreate()
Log.i(Main.message); // implementation of the message, 'Hi'
【讨论】:
嘿嘿这是安卓 它有效,但这种方法会在活动生命周期方面出现问题,并会导致依赖性问题 它不会引起任何问题,因为它是“静态的”,因此不依赖于活动对象实例,因为它是一个类级别的变量。 它仍然是 Java。 是的,这是完成这项工作的最简单方法,没有任何问题。以上是关于如何使用接口在两个活动之间进行通信的主要内容,如果未能解决你的问题,请参考以下文章