Java 在ViewPager的片段中使用BroadcastReceiver
根据本教程,我正在尝试为Android制作一个音乐播放器应用程序: 我已经更改了代码,所以歌曲列表(包含设备上找到的所有歌曲的列表)现在是一个片段。调用MusicService的onCreate()方法时,我使用了LocalBroadcastManager发送的意图。我在SongListFragment中添加了一个BroadcastReceiver。意图包含MusicService本身,因此片段可以调用它(例如,当用户选择一首歌曲时,用于播放歌曲)。它工作得很好,直到我在main活动中添加了一个ViewPager(SongListFragment是ViewPager中的一个片段)。 应用程序正在正常启动,MusicService发送意图,但BroadcastReceive的onReceive()从未运行 以下是MusicService的代码: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活动中添加了一
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()您还可以使用事件总线库来解决问题。