1、掌握服务的基本概念,能编写服务过程并进行调用; 2、掌握广播的基本概念,能实现广播通信。 3、需实现的具体功能为: 短信到来时自动产生的系统广播→激活音乐播放服务程序→活动组件程序使得停止按钮可用。 实现思路 • MainActivity启动服务,将播放、暂停、停止、切换信号发送广播给Service • MusicService 调用函数Prepareandplay()播放音乐,发送广播给MainActivity返回歌曲id • PrepareAndPlay() 定向操作 打开并播放音乐文件 注意的点 • 记得在配置文件中注册服务 • 注意findViewById在Fragment的使用方法 • 在Fragment中给ImageButton绑定事件监听器要重写onActivityCreated方法
第一步:在tab02中添加按钮组件以及文本框
第二步,在frdFragment中添加对按钮的监听并发送广播
public class frdFragment extends Fragment implements View.OnClickListener {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
TextView title, author;
ImageButton play, stop,last,next;
ActivityReceiver activityReceiver;
public static final String CTL_ACTION=
"org.jay.action.CTL_ACTION";
public static final String UPDATE_ACTION=
"org.jay.action.UPDATE_ACTION";
int status = 0x11;
String[] titleStrs = new String[] { "Legends Never Die", "约定", "美丽新世界","???"};
String[] authorStrs = new String[] {"英雄联盟", "周蕙", "伍佰","???"};
创建fragment类并继承监听接口
public void onClick(View view) {
Intent intent = new Intent(CTL_ACTION);
//在主界面按下对应按钮,传递给service对应参数
switch (view.getId())
{
case R.id.play:
intent.putExtra("control",1);
break;
case R.id.stop:
intent.putExtra("control",2);
break;
case R.id.last:
intent.putExtra("control",3);
break;
case R.id.next:
intent.putExtra("control",4);
break;
}
getActivity().sendBroadcast(intent);
}
配置监听到点击时的触发事件
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
activityReceiver = new ActivityReceiver();
IntentFilter filter = new IntentFilter(UPDATE_ACTION);
getActivity().getApplicationContext().registerReceiver(activityReceiver,filter);
Intent intent = new Intent(getActivity(),MusicService.class);
getActivity().startService(intent);
}
创建intent
class ActivityReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取来自receive中intent的update消息,代表播放状态
int update = intent.getIntExtra("update",-1);
//获取来自receive中intent的curruent消息,代表正在播放的歌曲
int current = intent.getIntExtra("current",-1);
//如果状态为正在播放歌曲或暂停
if(current>=0 && (update == 0x12 || update == 0x13))
{
title.setText(titleStrs[current]);
author.setText(authorStrs[current]);
}
//如果状态为未播放歌曲
else if (update == 0x11)
{
title.setText("未播放歌曲");
author.setText("未播放歌曲");
}
switch (update)
{
//如果未播放歌曲,则播放图标为播放
case 0x11:
play.setImageResource(R.drawable.play);
status=0x11;
break;
//如果正在播放歌曲,则播放图标为暂停
case 0x12:
play.setImageResource(R.drawable.pause);
status=0x12;
break;
case 0x13:
play.setImageResource(R.drawable.play);
status=0x13;
break;
}
}
}
接收广播并控制播放器的状态
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.tab02,container,false);
// 监听需要添加在onCreateView()中,而非onCreate()。
//找到对应控件
play = view.findViewById(R.id.play);
stop = view.findViewById(R.id.stop);
next = view.findViewById(R.id.next);
last = view.findViewById(R.id.last);
title = view.findViewById(R.id.name);
author = view.findViewById(R.id.singer);
//添加监听
play.setOnClickListener(this);
stop.setOnClickListener(this);
next.setOnClickListener(this);
last.setOnClickListener(this);
return view;
}
}
获取组件 第三步,配置音乐播放器
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int control =intent.getIntExtra("control",-1);
switch (control)
{
//播放或暂停
case 1:
//原来处于没有播放状态
if (status==0x11)
{
//准备并播放音乐
prepareAndPlay(musics[current]);
status=0x12;
}
//原来处于播放状态
else if (status==0x12)
{
//暂停
mPlayer.pause();
//改变为暂停状态
status=0x13;
}
//原来处于暂停状态
else if (status==0x13)
{
//播放
mPlayer.start();
//改变状态
status=0x12;
}
break;
//停止声音
case 2:
//如果原来正在播放或暂停
if (status==0x12||status==0x13) {
//停止播放
mPlayer.stop();
status = 0x11;
}
break;
case 3:
//原来处于没有播放或暂停状态
if (status==0x11||status==0x13)
{
if(current==0) {
current=3;
}
//准备并播放音乐
else {
current=current-1;
}
prepareAndPlay(musics[current]);
status=0x12;
}
//原来处于播放状态
else if (status==0x12)
{
//上一首//准备并播放音乐
if(current==0) {
current=3;
}
else {
current=current-1;
}
prepareAndPlay(musics[current]);
}
break;
case 4:
//原来处于没有播放或暂停状态
if (status==0x11||status==0x13)
{
if(current==3) {
current=0;
} //准备并播放音乐
else {
current=current+1;
}
prepareAndPlay(musics[current]);
status=0x12;
}
else if (status==0x12)
{
if(current==3) {
current=0;
}
else {
current=current+1;
}
prepareAndPlay(musics[current]);
}
break;
}
//广播通知Activity更改图标、文本框
Intent sendIntent=new Intent(frdFragment.UPDATE_ACTION);
sendIntent.putExtra("update",status);
sendIntent.putExtra("current",current);
//发送广播,将被Activity组件中的BroadcastReceiver接收
sendBroadcast(sendIntent);
}
}
接收frdFragment的控制信息并对于不同状态下的播放器执行对于不同控制信息的事件,并发送播放器的状态和歌曲编号给fragment
private void prepareAndPlay(String music)
{
try
{
//打开指定音乐文件
AssetFileDescriptor afd=am.openFd(music);
mPlayer.reset();
//使用MediaPlayer加载指定的音乐文件
mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
//准备声音
mPlayer.prepare();
//播放
mPlayer.start();
}catch (IOException e) {
e.printStackTrace();
}
}
}
实验小结 1.对于sendBroadCas的intent对象,需要设置其actionname; 2.推荐使用显式指明receiver,在配置文件指明; 3.一个receiver可以接收多个action; 4.每次接收广播都会重新生成一个接收广播的对象,再次调用onReceive; 5. 在Broadcast中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity或者Service去处理。