Android大作业确实挺难的,断断续续半个月到现在还有几个功能没有完成(中间又去忙了点其他事),到现在为止最强烈的感受是学习安卓是非常需要经验的活计,而且资料也不像之前学习的算法,c++之类的非常详实(像刷oj一搜poj****全是题解,而且都是正确的)我按照网上的博客一模一样照打的都能报错....(巨坑啊)
我个人参考的是《第一行代码》这本书,它对于初学者相当友好,不过在背景音乐的播放中出现了些困难.
现在要求是在任意演示页面都应该播放背景音乐,很明显如果直接写在activity中,那么一旦service停止了(跳转到其他页面)就会关闭背景音乐,而且也很难处理在需要的时候关闭音乐(放视频,退出app)故应将音乐的播放写在service中.
为了用户的体验(毛的用户啊,估计老师也就随便瞄两眼....),我们在开始设置一个提问框,询问是否开启音乐
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.widget.ImageView;
public class question extends BaseActivity{//question.class
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_question);//布局文件叫layout_question
AlertDialog.Builder dialog = new AlertDialog.Builder(question.this);//弹出对话框,判断是否需要开启音乐
dialog.setTitle("注意");
dialog.setMessage("是否播放音乐");
dialog.setCancelable(false);
dialog.setPositiveButton("否",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
Intent intent = new Intent(question.this,MainActivity.class);
intent.putExtra("extra_data","0");//向MainActivity传递值
startActivity(intent);
}
});
dialog.setNegativeButton("是",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface arg0, int arg1) {
Intent intent = new Intent(question.this,MainActivity.class);
intent.putExtra("extra_data","1");//向MainActivity传递值
startActivity(intent);
}
});
dialog.show();
}
}
这里有一个向后面传值的过程,因为我要知道前面一个activity用户选择的值,因为我不知道如何传递布尔类型的值,所以直接传了两种字符串过去,是"1"就开启音乐,是"0"就暂时不开启音乐
MainActivity.class
public class MainActivity extends BaseActivity {
private Button button1;//成长历程
private Button button2;//兴趣爱好
private Button button3;//一键关注
private Button button4;//退出
private boolean MusicSwitch;//判断音乐是否开启(true为播放,false为不播放)
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = getIntent();
String s=intent.getStringExtra("extra_data");//获得上一次的是否开启音乐的值
if (s.equals("1")) MusicSwitch=true;
else MusicSwitch=false;
imageView = (ImageView) findViewById(R.id.image_view);//实例化对应的插图
if (MusicSwitch) {
Intent intentSV=new Intent(MainActivity.this,MyService.class);
startService(intentSV);
imageView.setImageResource(R.drawable.music_start);
}
else imageView.setImageResource(R.drawable.music_off);
imageView.setOnClickListener(new OnClickListener() {//当图标被按时可以开关音乐
@Override
public void onClick(View arg0) {
if (MusicSwitch) {
imageView.setImageResource(R.drawable.music_off);
MusicSwitch = false;
Intent intentSV=new Intent(MainActivity.this,MyService.class);
stopService(intentSV);
}
else {
imageView.setImageResource(R.drawable.music_start);
MusicSwitch = true;
try{
Intent intentSV=new Intent(MainActivity.this,MyService.class);
startService(intentSV);
}catch(Exception e){
e.printStackTrace();
}
}
}
});
//后面省略无关代码
}
}
}
这里我用了两个个插图,如果MusicSwitch为真就播放音乐,同时表现音乐开启的图标,否则就不播放音乐,展示音乐关闭的图标,而每一次点击关闭和开启都会改变MusicSwitch的值.
另外说下插图一般在res下的draw****的第一个文件夹下,直接将图片移进去就好.
而本文的重点就是
Intent intentSV=new Intent(MainActivity.this,MyService.class);
startService(intentSV);
Service是什么,个人感觉说白了就是一些你希望只要在某个页面开启后,在后台默默持续工作,知道某个页面可以随时关闭的无名英雄.而音乐就是只闻其声不见其人所以两者绝配啊。
里面有onCreate,onStartCommand,onDestroy,onBind等方法
一旦知道用户要开启音乐,我们可以调用startService(),它会调用在onStartCommand时创建一个MediaPlayer对象来放音乐,而一旦知道用户要关闭音乐,我们可以调用
stopService,它会调用onDestory销毁MediaPlayer对象,由于我对于Service的操作是随时随地的,而且只要不操作这个Service将一直跑下去,那么就符合我们的要求.
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
public class MyService extends Service{
private MediaPlayer mp;
@Override
public void onCreate(){
super.onCreate();//继承onCreate方法
try{
mp= new MediaPlayer();
mp=MediaPlayer.create(MyService.this,R.raw.music);
}catch(IllegalStateException e){
e.printStackTrace();
}
}
@Override
public IBinder onBind(Intent intent){
return null;
}
@Override
public int onStartCommand(Intent intent,int flags,int startId){
mp.start();
mp.setOnErrorListener(new MediaPlayer.OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
// TODO Auto-generated method stub
// 释放资源
try {
mp.release();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
});
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy(){//服务停止时停止播放音乐并释放资源
mp.stop();
mp.release();
mp=null;
super.onDestroy();
}
}
音乐我是在res下新建一个raw文件夹,将mp3文件直接放进去即可,用法是
mp=MediaPlayer.create(MyService.this,R.raw.music);
第一个是活动名(这里是服务名)。
当然不要忘记注册这个Service.