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

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。 是的,这是完成这项工作的最简单方法,没有任何问题。

以上是关于如何使用接口在两个活动之间进行通信的主要内容,如果未能解决你的问题,请参考以下文章

如何在嵌套片段内的两个子片段之间进行通信

Android:如何在 2 个活动之间进行通信

如何在 NAT 后面的两个节点之间进行通信?

如何在 Android 选项卡之间进行通信

活动/服务和小部件提供者之间的通信?

android - 在活动和后台服务之间进行通信的最佳方式