Android-bindService本地服务-音乐播放(后台播放)-下

时间:2023-03-09 21:21:40
Android-bindService本地服务-音乐播放(后台播放)-下

在上一篇  Android-bindService本地服务-音乐播放-上,博客中是不能在后台中播放到,这次博客增加了一个后台播放

通常情况下,Activity切换到后台,Service提升到前台进程,既然Service提升到前台进程就会有一个通知。

      Activity ---> moveTaskToBack(true);

      Service ---> startForeground(1, builder1.getNotification());

进程优先级别:前台进程,可视进程,服务进程,后台进程,空进程  (前台进程是最稳定,系统内存不足是先回收 空进程)

为什么要把服务Service提升为前台进程,在内存不足时,前台进程不会那么容易被系统回收

把 服务进程 提升到 前台进程 会自动绑定通知

UI相关,当在播放当过程中点击返回键,就需要告诉用户是否在后台运行

Android-bindService本地服务-音乐播放(后台播放)-下

点击后台播放,Activity就会被切换到后台,想要再次启动APP就可以点击通知进入:

Android-bindService本地服务-音乐播放(后台播放)-下

由于这个MainActivity会被多次启动,为了保证单任务,需要设置启动模式:android:launchMode="singleTask"

    <activity android:name=".MainActivity5"
android:launchMode="singleTask"> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </activity>

定义Binder扩展接口:

package liudeli.service1.service.inter;

import android.media.MediaPlayer;

public interface IMusicPlay {

    /**
* 播放音乐
* @param musicPath 音乐文件的路径
*/
void playMusic(String musicPath); /**
* 暂停播放
*/
void pausedPlay(); /**
* 继续播放
*/
void continuePlay(); /**
* 停止播放
*/
void stopPlay(); /**
* 让Activity可以获取到服务使用到MediaPlayer
* @return
*/
MediaPlayer getMediaPlayer();
}

Service控制播放:

package liudeli.service1.service;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.Build;
import android.os.IBinder;
import android.support.annotation.RequiresApi;
import android.util.Log; import java.io.IOException; import liudeli.service1.MainActivity5;
import liudeli.service1.R;
import liudeli.service1.service.inter.IMusicPlay; public class MyService5 extends Service { private final String TAG = MyService5.class.getSimpleName(); @RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onCreate() {
super.onCreate(); /**
* 进程优先级别:前台进程,可视进程,服务进程,后台进程,空进程 (前台进程是最稳定,系统内存不足是先回收 空进程)
*
* 为什么要把服务Service提升为前台进程,在内存不足时,前台进程不会那么容易被系统回收
*
* 把 服务进程 提升到 前台进程 会自动绑定通知
*/ // 需要用到通知,用户点击通知栏,就计划APP-->Activity // 这是以前到写法,已经过时
/*Notification notification = new
Notification(R.mipmap.ic_launcher, "我的音乐播放器", System.currentTimeMillis());*/ // 设置事件信息,点击通知可以跳转到指定Activity
Intent intent = new Intent(this, MainActivity5.class); // 设置事件信息,点击通知可以跳转到指定Activity
NotificationManager notificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE); // 设置通知显示相关信息
Notification.Builder builder1 = new Notification.Builder(this);
builder1.setSmallIcon(R.mipmap.ic_launcher); //设置图标
/*builder1.setTicker("显示第二个通知");*/
builder1.setContentTitle("播放中"); //设置标题
builder1.setContentText("我的音乐播放器"); //消息内容
builder1.setWhen(System.currentTimeMillis()); //发送时间
builder1.setDefaults(Notification.DEFAULT_ALL); //设置默认的提示音,振动方式,灯光
builder1.setAutoCancel(true);//打开程序后图标消失 // 延时意图,所谓延时意图就是不是马上执行,需要用户去点击后才执行,其实就是对Intent对封装
PendingIntent pendingIntent =PendingIntent.getActivity(this, 0, intent, 0);
builder1.setContentIntent(pendingIntent);
Notification notification1 = builder1.build();
notificationManager.notify(124, notification1); // 通过通知管理器发送通知 // id=通知到唯一标示 notification=通知
startForeground(1, builder1.getNotification());
} @Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "绑定成功");
return new PlayMusicBinder();
} private MediaPlayer mediaPlayer; /**
* 增强版Binder,扩展出播放音乐