欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

服务的灵活使用,音乐框架,混合模式开启服务

程序员文章站 2022-03-29 16:15:32
...

混合开启要混合结束才能停止服务
主代码

package com.example.musicplayerframework;

import com.example.musicplayerframework.MusicPlayerService.MyIBinder;
import com.example.musicplayerframework.MusicPlayerService.MyIBinderVip;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends Activity {
    private MyIBinderVip bind;
    private Mymain conn;
//  private MyIBinder vip;
    private IService  inter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 第一步通过Bind混合开启音乐服务
        Intent intent = new Intent(this, MusicPlayerService.class);
        conn = new Mymain();
        bindService(intent, conn, BIND_AUTO_CREATE);
        startService(intent);
    }

    // 播放下一首
    public void pre(View v) {
        bind.pre();
    }

    public void play(View v) {
        bind.play();
    }

    public void pause(View v) {
        bind.pause();
    }

    public void next(View v) {
        bind.next();
    }

    class Mymain implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
//          bind = (MyIBinder) service;//不能使用多态因为onBind方法return的是 new MyIBinderVip();
            bind = (MyIBinderVip) service;
            inter = (IService) service;//接口
            Log.e("tag", "onServiceConnected");
            
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
            Log.e("tag", "----->销毁21312313");
        }

    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        unbindService(conn);
        Log.e("tag", "----->销毁");
        super.onDestroy();

    }
}

布局就四个Button添加点击
服务写

package com.example.musicplayerframework;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class MusicPlayerService extends Service {
    
@Override
public void onCreate() {
    //MediaPlayer
    Log.e("tag","准备一个音乐播放器");
}

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


    class MyIBinderVip extends Binder implements IService{

        public void next(){
            Log.e("tag", "播放下一首..甜蜜蜜");
        } 
        public void pre(){
            Log.e("tag", "播放下一首..一剪梅");
        }
        public void play(){
            Log.e("tag", "播放下一首..播放");
        }
        public void pause(){
            Log.e("tag", "播放下一首..暂停");
        }
        public void Vip(){
            Log.e("tag", "vip高品质播放");
        }
}
@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
    Log.e("tag", "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }
@Override
    public void onDestroy() {
        // TODO Auto-generated method stub
    Log.e("tag", "救命我死了");
        super.onDestroy();
        
    }
}

接口写普通用户

package com.example.musicplayerframework;

public interface IService {
    public void next();
    public void pre();
    public void play();
    public void pause();
}

因为IService 这个借口被MyIBinderVip 给实现了,,在Activity中inter = (IService) service;//给借口赋值,值就是实现借口类,所以可以调用和强转

效果就是退出界面但是服务还开着放歌.只有我们的父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.

往深了讲。子类强制转换为父类对象时,并没有实际丢失它原有内存空间(比父类多的那些部分)只是暂时不可访问。所以能再转回来。
另:父类对象可接受任何子类对象--此时发生自动转型--》转为父类类型--》所以能够再转回来。用instanceof 是防止错误的一种方式。