自定义接口利用观察者模式在第二个页面向第一个页面发送数据

这里不用Intent传值,主要简单介绍下interface的使用

效果如下:



首先新建两个页面MainActivity和HomeActivity,布局很简单,TextView和Button,看也看出来了,不多说了

接着创建一个观察者接口:

public interface Watcher {
    void update(String str);
}

然后是被观察者:

public interface Watched {
    public void addWatcher(Watcher wtcher);

    public void notifyWatcher(String str);
}


然后声明具体的被观察者:

public class ConcreateWatched implements Watched {
    private List<Watcher> list = new ArrayList<>();

    @Override
    public void addWatcher(Watcher watcher) {
        list.add(watcher);
    }

    @Override
    public void notifyWatcher(String str) {
        for (Watcher watcher : list) {
            watcher.update(str);
        }
    }
}


紧接着,声明具体的观察者,也就是我们的MainActivity:

public class MainActivity extends AppCompatActivity implements Watcher{
    private static final String TAG = "TAG";
    @BindView(R.id.tv_first)
    TextView tvFirst;

   public static String text = "数据:";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    @OnClick(R.id.btn_firstJump)
    public void onViewClicked() {
        Intent intent = new Intent(this,HomeActivity.class);
        startActivity(intent);
    }


    @Override
    public void update(String str) {
        text = str;
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG, "onResume: " );
        tvFirst.setText(text);
    }



    private long exitTime = 0;//点击2次返回,退出程序

    //点击两次退出
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK
                && event.getAction() == KeyEvent.ACTION_DOWN) {
            if ((System.currentTimeMillis() - exitTime) > 2000) {//两秒内再次点击返回则退出
                Toast.makeText(getApplicationContext(), "再按一次退出程序",
                        Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            } else {
                System.exit(0);
            }
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }
}

最后在HomeActivity里回调接口就可以了:

public class HomeActivity extends AppCompatActivity {
    Watched watched;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        ButterKnife.bind(this);
        watched = new ConcreateWatched();
        Watcher watcher = new MainActivity();
        watched.addWatcher(watcher);
        watched.notifyWatcher("数据:我是第二个页面的数据");
    }

    @OnClick(R.id.btn_return)
    public void onViewClicked() {
        finish();
    }
}

这里只是简单介绍接口的用法,一般用在Activity上点击,然后fragment某个控价发生变化时可以用,那个时候intent不能用了吧!

仅供参考,有不对的欢迎提出。


点击下载源码


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值