版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010823818/article/details/52311742
A.activity向BroadCast实时通讯,比如activity里的一个控件的点击事件,希望Fragment做一个操作,此时可以使用广播机制
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(); }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); } };