您的位置:首页 > 其它

Activity和Broadcase的通信

2016-08-25 10:18 246 查看
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();

}
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);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: