服务的灵活使用,音乐框架,混合模式开启服务
程序员文章站
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 是防止错误的一种方式。
上一篇: 在vue中如何使用cdn优化