自定义接口利用观察者模式在第二个页面向第一个页面发送数据
这里不用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不能用了吧!
仅供参考,有不对的欢迎提出。