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.