实验7 BindService模拟通信

实验报告

课程名称

基于Android平台移动互联网开发

实验日期

2016年4月22日

实验项目名称

BindService模拟通信

实验地点

S3010

实验类型

□验证型    √设计型    □综合型

学  时

4

一、实验目的及要求(本实验所涉及并要求掌握的知识点)

1.目的:实现启动端和BindService之间的双向通信

2.要求:实现从启动端传递一个数据至BindService端;

实现使用BindService服务播放项目源文件中的音乐;

实现在启动端通过“增加”和“降低”两个按钮控制音频音量大小。

实现在启动端通过“暂停”按钮控制音频暂停播放。

 

二、实验环境(本实验所使用的硬件设备和相关软件)

(1)PC机

(2)操作系统:Windows XP

(3)软件: Eclipse, JDK1.6,Android SDK,ADT

三、实验内容及步骤

1)   导入工程Sodoku

2)   添加以下的Activity类

3)   添加以下layout资源文件

4)   完成设计后,界面运行如下

 

四、实验结果(本实验源程序清单及运行结果或实验结论、实验设计图)

代码:

BackmusicService.java

package com.example.sukodu;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Binder;
import android.os.IBinder;

public class BackmusicService extends Service {
    MediaPlayer mediaplayer;
    Mybinder binder=new Mybinder();
    AudioManager  audioManager;
    int current;
    boolean isSilent=false;
public class Mybinder extends Binder{
    public BackmusicService getService(){
        return BackmusicService.this;
    }
}
    public int getvolum(){
        current =audioManager.getStreamVolume(AudioManager.STREAM_MUSIC );
        return current;
        
    }

    public void setsilent(boolean isSilent){
        if(isSilent){
            getvolum();
            audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,0,0);
            
            }else{
            audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,current,0);//tempVolume:音量绝对值
            }

    }
    public void setvolum(int setting){
        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,setting,0);
        current=setting;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return binder;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        mediaplayer = MediaPlayer.create(BackmusicService.this,
                R.raw.nanshannan);
        mediaplayer.start();
         audioManager=(AudioManager) getSystemService(Context.AUDIO_SERVICE);

        super.onCreate();        
        mediaplayer.setOnCompletionListener(new OnCompletionListener() {
            
            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                mediaplayer.start();
            }
        });
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        mediaplayer.start();
        return super.onStartCommand(intent, flags, startId);

    }


    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        if(mediaplayer.isPlaying()){
            mediaplayer.stop();
        }
    }

}

MusicsetActivity.java

package com.example.sukodu;

import com.example.sukodu.BackmusicService.Mybinder;

import android.R.string;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.os.IBinder;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast;

public class MusicsetActivity extends Activity{
    Bundle bd;
    CheckBox btnsilent;
    SeekBar sbar;
    BackmusicService binde;
    double setting;
    @SuppressLint("NewApi") 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActionBar actionbar=getActionBar();
        actionbar.setDisplayShowHomeEnabled(true);
        actionbar.setDisplayHomeAsUpEnabled(true);
        setContentView(R.layout.musicsetting);
        bd=getIntent().getExtras();
        btnsilent=(CheckBox) findViewById(R.id.mcset_quit);
        int current =bd.getInt("volum");
        sbar=(SeekBar) findViewById(R.id.mcset_seekBar);
        int music=(int) (((double)current/14)*100);
        sbar.setProgress(music);
        binde=((Mybinder) bd.getBinder("backmusic")).getService();
        
        Toast.makeText(this, "current volum:"+String.valueOf(music), Toast.LENGTH_LONG).show();
        sbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
            
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                // TODO Auto-generated method stub

                Toast.makeText(MusicsetActivity.this, "current volum:"+String.valueOf((int)setting), Toast.LENGTH_LONG).show();
            }
            
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                // TODO Auto-generated method stub
                btnsilent.setChecked(false);
            }
            
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
                // TODO Auto-generated method stub
                

                setting=(((double)progress/100)*14);
                binde.setvolum((int)setting);
            }
        });
        btnsilent.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                binde.setsilent(isChecked);
            }
        });
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        switch (item.getItemId()){
            case  android.R.id.home:{
                finish();
                break;
            }
        }
        return super.onOptionsItemSelected(item);
    }


    
}

main

    ServiceConnection conn=new ServiceConnection() {
        
        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
            
        }
        
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            binder=(Mybinder)service;
            bs = binder.getService();
            int volum=bs.getvolum();
//            Toast.makeText(MainActivity.this, "current volum:"+String.valueOf(volum), Toast.LENGTH_LONG).show();
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bd = getIntent().getExtras();
        Intent itmusic=new Intent();
        itmusic.setClass(MainActivity.this, BackmusicService.class);
        bindService(itmusic, conn, Context.BIND_AUTO_CREATE);

运行结果:(截图)

 

 

五、实验总结(对本实验结果进行分析,实验心得体会及改进意见)

    经过本次的实验,对我对service类有了一定的了解,从中懂得了一些安卓界面结构的编写方法,但对于android的具体结构了解还是很表面,日后需要多看,多练编写android程序。

实验评语

 

实验成绩

 

指导教师签名:              年   月   日

           
原文地址:https://www.cnblogs.com/cckuang/p/5452987.html