【问题标题】: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);
    }
}

注意:请不要建议我使用片段。我目前想使用活动。

【问题讨论】:

    标签: java android interface android-activity listener


    【解决方案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,郊区,这是stackoverflow历史上最聪明的答案
    • 有史以来最糟糕的主意......你永远不应该将 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"));
    

    如果代码无法编译,请给我评论,我是手写的。

    【讨论】:

    • 这个答案帮助我更好地理解本地广播。 stackoverflow.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。
    • 是的,这是完成这项工作的最简单方法,没有任何问题。
    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多