Activity和Broadcase的通信
2016-08-25 10:18
246 查看
A.activity向BroadCast实时通讯,比如activity里的一个控件的点击事件,希望Fragment做一个操作,此时可以使用广播机制
activity里发广播:
Fragment里
1.注册广播,注意最好在onCreate()里就注册广播
2.接收广播
3.关闭广播
很明显,当activity里有一些实时需求Fragment去做时,发广播是一个好选择
B.Fragment项Activity发出实时通讯,这可以使用回调机制
1.先在Fragment注册个回调接口
2.在activity里对接口进行实现
重写方法:
3.为了确保宿主activity实现这个接口, fragment的onAttach() 回调方法(当添加fragment到activity时由系统调用) 通过将作为参数传入onAttach()的Activity做类型转换来实例化一个CallBackValue实例.
如果activity没有实现接口, fragment会抛出 ClassCastException 异常,正常情形下,callBackValue()成员会保持一个到activity的CallBackValue实现的引用,
因此fragment可以通过调用在CallBackValue接口中定义的方法分享事件给activity.例如,
如果fragment是一个 ListFragment的子类, 每次用户点击一个列表项, 系统调用在fragment中的onListItemClick(),然后后者调用
callBackValue() 来分配事件给activity.
4.调用
callBackValue() 来分配事件给activity.
activity里发广播:
musicplaybofang.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent broadcastIntent1 = new Intent(); broadcastIntent1.setAction(BroadCastUtils.MUSIC_BOFANG); int dest = musicplayseekbar.getProgress(); int max = musicplayseekbar.getMax(); broadcastIntent1.putExtra("progress", dest*100/max); sendBroadcast(broadcastIntent1); Log.i("TAG", "=====广播=====musicplaybofang"); } });
Fragment里
1.注册广播,注意最好在onCreate()里就注册广播
@Override public void onCreate(@Nullable Bundle savedInstanceState) { if (myReceiver == null){ myReceiver = new MyReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(BroadCastUtils.MUSIC_BOFANG); intentFilter.addAction(BroadCastUtils.MUSIC_XIAYISHOU); intentFilter.addAction(BroadCastUtils.MUSIC_SEEKBAR); getActivity().registerReceiver(myReceiver, intentFilter); } super.onCreate(savedInstanceState); }
2.接收广播
class MyReceiver extends BroadcastReceiver { private boolean isRegisterReceiver = false; @Override public void onReceive(Context context, Intent intent) { Log.i("TAG", "=====接收广播====="); String action = intent.getAction(); if (action.equals(BroadCastUtils.MUSIC_BOFANG)){ if (myMediaPlayer.isPlaying()){ pauseMusic(); }else { int progress = intent.getIntExtra("progress", 0)*myMediaPlayer.getDuration()/100; playMusic(currentListItem); myMediaPlayer.seekTo(progress); } }else if (action.equals(BroadCastUtils.MUSIC_XIAYISHOU)){ nextMusic(); } 4000 else if (action.equals(BroadCastUtils.MUSIC_SEEKBAR)){ int progress = intent.getIntExtra("progress", 0)*myMediaPlayer.getDuration()/100; if (myMediaPlayer.isPlaying()){ myMediaPlayer.seekTo(progress); } } } };
3.关闭广播
@Override public void onDestroy() { if (myReceiver != null){ getActivity().unregisterReceiver(myReceiver); myReceiver = null; } super.onDestroyView(); }
很明显,当activity里有一些实时需求Fragment去做时,发广播是一个好选择
B.Fragment项Activity发出实时通讯,这可以使用回调机制
1.先在Fragment注册个回调接口
CallBackValue callBackValue;
public interface CallBackValue{ public void SendMessageValue(boolean isPlaying, int progress); }
2.在activity里对接口进行实现
public class MusicPlayActivity extends FragmentActivity implements Local_Music_Fragment.CallBackValue
重写方法:
@Override public void SendMessageValue(boolean isPlaying, int progress) { if (isPlaying){ musicplaybofang.setImageResource(R.mipmap.sf11); }else { musicplaybofang.setImageResource(R.mipmap.sf2); } musicplayseekbar.setProgress(progress * sMax/100); }
3.为了确保宿主activity实现这个接口, fragment的onAttach() 回调方法(当添加fragment到activity时由系统调用) 通过将作为参数传入onAttach()的Activity做类型转换来实例化一个CallBackValue实例.
@Override public void onAttach(Activity activity) { super.onAttach(activity); callBackValue =(CallBackValue)activity; }
如果activity没有实现接口, fragment会抛出 ClassCastException 异常,正常情形下,callBackValue()成员会保持一个到activity的CallBackValue实现的引用,
因此fragment可以通过调用在CallBackValue接口中定义的方法分享事件给activity.例如,
如果fragment是一个 ListFragment的子类, 每次用户点击一个列表项, 系统调用在fragment中的onListItemClick(),然后后者调用
callBackValue() 来分配事件给activity.
4.调用
callBackValue() 来分配事件给activity.
private Runnable myRunnable = new Runnable() { @Override public void run() { isPlaying = true; int position = myMediaPlayer.getCurrentPosition(); int mMax = myMediaPlayer.getDuration(); int i = position*100/mMax; callBackValue.SendMessageValue(myMediaPlayer.isPlaying(), i); mHandler.postDelayed(this, 100); } };
相关文章推荐
- 关于JavaScript的小技巧总结
- 文件操作
- 多线程 Thread 和runnable区别
- Linux内核移植--YAFFS2支持
- 将现有的SQL工作负载迁移至hadoop竟然如此简单!
- CodeForces 651B Beautiful Paintings
- 浅析python 中__name__ = '__main__' 的作用
- Codeforces刷题之路——AIM Tech Round 3 (Div. 2) A. Juicer
- 一说出口就被误解的离职原因,这样补救!
- smack android集成问题记录
- ThinkPHP学习
- 第16章 STM32中断应用概览—零死角玩转STM32-F429系列
- python中输出内容颜色得控制
- django网页按钮权限管理
- 如何在 Git 里撤销(几乎)任何操作
- MVP好文章转载
- install python-pip
- 概要设计&详细设计 的理解
- Can't create handler inside thread that has not called Looper.prepare()
- jni编译时出现:warning: format '%d' expects argument of type 'int', but argument 4 has