Activity和Broadcase的通信

版权声明:本文为博主原创文章,未经博主允许不得转载。 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.关闭广播

扫描二维码关注公众号,回复: 3621491 查看本文章
@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);
    }
};

猜你喜欢

转载自blog.csdn.net/u010823818/article/details/52311742
今日推荐