Java 在ViewPager的片段中使用BroadcastReceiver

Java 在ViewPager的片段中使用BroadcastReceiver,java,android,android-fragments,android-viewpager,android-broadcastreceiver,Java,Android,Android Fragments,Android Viewpager,Android Broadcastreceiver,根据本教程,我正在尝试为Android制作一个音乐播放器应用程序: 我已经更改了代码,所以歌曲列表(包含设备上找到的所有歌曲的列表)现在是一个片段。调用MusicService的onCreate()方法时,我使用了LocalBroadcastManager发送的意图。我在SongListFragment中添加了一个BroadcastReceiver。意图包含MusicService本身,因此片段可以调用它(例如,当用户选择一首歌曲时,用于播放歌曲)。它工作得很好,直到我在main活动中添加了一

根据本教程,我正在尝试为Android制作一个音乐播放器应用程序:

我已经更改了代码,所以歌曲列表(包含设备上找到的所有歌曲的列表)现在是一个片段。调用MusicService的onCreate()方法时,我使用了LocalBroadcastManager发送的意图。我在SongListFragment中添加了一个BroadcastReceiver。意图包含MusicService本身,因此片段可以调用它(例如,当用户选择一首歌曲时,用于播放歌曲)。它工作得很好,直到我在main活动中添加了一个ViewPager(SongListFragment是ViewPager中的一个片段)。 应用程序正在正常启动,MusicService发送意图,但BroadcastReceive的onReceive()从未运行

以下是MusicService的代码:

public class MusicService extends Service implements
     MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener, Serializable{

public MediaPlayer player;
private ArrayList<Song> songs;
private int songPosn;
private ArrayList<String> playlist = new ArrayList<String>();
private long currSong=0; //currently playing song id, default==0
private NotificationService notificationService;

private String songTitle="";
private static final int NOTIFY_ID=1;
private static final String LOG_TAG = MusicService.class.getSimpleName();

private boolean shuffle=false;

private AudioManager audioManager;

private IBinder musicBind = new MusicBinder();

public void onCreate(){
    super.onCreate();
    songPosn=0;

    Intent intent = new Intent(Constants.ACTION.BIND_FRAG_ACTION);
    intent.putExtra(Constants.ACTION.MUSIC_SERVICE_EXTRA, this);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
    Log.v(LOG_TAG, "Intent with musicService Extra sent.=============");

    player = new MediaPlayer();
    initMusicPlayer();
    Random rand = new Random();
    audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
}
公共类MusicService扩展服务实现
MediaPlayer.OnErrorListener,MediaPlayer.OnCompletionListener,可序列化{
公共媒体播放器;
私人雅乐歌曲;
私家车;
private ArrayList playlist=新建ArrayList();
private long currSong=0;//当前正在播放的歌曲id,默认值==0
私人通知服务通知服务;
私有字符串songTitle=“”;
私有静态final int NOTIFY_ID=1;
私有静态最终字符串LOG_TAG=MusicService.class.getSimpleName();
私有布尔洗牌=false;
私人音频经理;
private IBinder musicBind=新的MusicBinder();
public void onCreate(){
super.onCreate();
songPosn=0;
意向意向=新意向(常量.ACTION.BIND\u FRAG\u ACTION);
intent.putExtra(Constants.ACTION.MUSIC\u SERVICE\u EXTRA,this);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
Log.v(Log_标签,“发送额外音乐服务的意向”;
player=新媒体播放器();
initMusicLayer();
Random rand=新的Random();
audioManager=(audioManager)getSystemService(Context.AUDIO\u服务);
}
以及歌曲列表片段:

public class SongListFragment extends Fragment implements MediaController.MediaPlayerControl, AdapterView.OnItemClickListener {

private ArrayList<String> orderedSongsId = new ArrayList<String>();
private ArrayList<Song> songList;
private MusicService musicService;
private NotificationService notificationService;
private Menu menu;

private View rootView;
private ListView songListView;

private boolean musicBound = false;
private MusicController controller;
private boolean paused = false, playbackPaused = false;

private static final String LOG_TAG = SongListFragment.class.getSimpleName();
private static final String TAG = SongListFragment.class.getSimpleName();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);   

LocalBroadcastManager.getInstance(this.getActivity().getApplicationContext()).registerReceiver(mMusicServiceReceiver,
            new IntentFilter(Constants.ACTION.BIND_FRAG_ACTION)); 
}

@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {

    rootView = inflater.inflate(R.layout.songs_list_fragment, container, false);
    Log.v(LOG_TAG, "Fragment view is created ------------------------------");
    songList = new ArrayList<Song>();
    getSongList();
    Collections.sort(songList, new Comparator<Song>() {
        public int compare(Song a, Song b) {
            return a.getTitle().compareTo(b.getTitle());
        }
    });
    for (int i = 0; i < songList.size(); i++) {
        orderedSongsId.add(String.valueOf(songList.get(i).getId()));
    }

    SongAdapter adapter = new SongAdapter(getActivity(), songList);
    songListView = (ListView) rootView.findViewById(R.id.song_list);
    songListView.setAdapter(adapter);
    songListView.setOnItemClickListener(this);
    if (controller == null)setController();
    return rootView;
}

private BroadcastReceiver mMusicServiceReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        MusicService ms = (MusicService) intent.getSerializableExtra(Constants.ACTION.MUSIC_SERVICE_EXTRA);
        if (ms != null) Log.v(LOG_TAG, "MusicService received-------------------------------");
        else Log.v(LOG_TAG, "MusicService not received----------------------------");
        musicService = ms;
        musicService.setList(songList);
    }
};
公共类SongListFragment扩展片段实现MediaController.MediaPlayerControl、AdapterView.OnItemClickListener{
private ArrayList orderedSongsId=new ArrayList();
私人ArrayList歌曲列表;
私人音乐服务;
私人通知服务通知服务;
私人菜单;
私有视图rootView;
私有列表视图;
私有布尔值musicBound=false;
专用音乐控制器;
private boolean paused=false,playbackPaused=false;
私有静态最终字符串LOG_TAG=SongListFragment.class.getSimpleName();
私有静态最终字符串标记=SongListFragment.class.getSimpleName();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
LocalBroadcastManager.getInstance(this.getActivity().getApplicationContext()).registerReceiver(mMusicServiceReceiver,
新的IntentFilter(Constants.ACTION.BIND_FRAG_ACTION));
}
@凌驾
创建视图上的公共视图(更平坦的充气机,
视图组容器,捆绑包savedInstanceState){
rootView=充气机。充气(R.layout.songs\u list\u片段,容器,false);
Log.v(Log_标记,“创建了片段视图---------------------------------------------------”);
songList=newarraylist();
getSongList();
Collections.sort(songList,newcomparator(){
公共整数比较(歌曲a、歌曲b){
返回a.getTitle().compareTo(b.getTitle());
}
});
对于(int i=0;i
我认为问题在于线路 LocalBroadcastManager.getInstance(this.getActivity().getApplicationContext())。。。
在Fragments OnCreate()中。是否需要更改其中的上下文?

使用getActivity()代替此。getActivity()您还可以使用事件总线库来解决问题。