前言

上一篇跟了一下《简单记录MediaSessionService的启动》但这里只是介绍了启动,很多方法都没涉及,因此今天就简单的通过MediaSession的使用去了解进一步跟一下MediaSessionService的源码

记录一下,方便自己查阅。

流水账,随意记录而已。

正文

之前有介绍过《MediaSession的简单使用》,我们就从中摘录一下MediaSession的使用,然后开始跟进源码。

  1. MediaSession mMediaSession = new MediaSession(MusicApp.getContext(), TAG);
  2. mMediaSession.setCallback(mediaSessionCallback);
  3. private final MediaSession.Callback mediaSessionCallback = new MediaSession.Callback() {
  4.   //略
  5. }
复制

MediaSession.java

  1. frameworks\base\media\java\android\media\session\MediaSession.java
复制

上面初始化对象时用的构造函数

MediaSession()
  1. public MediaSession(@NonNull Context context, @NonNull String tag) {
  2.   this(context, tag, null);
  3. }
复制

调用的是3个参数的构造函数

MediaSession()
  1. public MediaSession(@NonNull Context context, @NonNull String tag,
  2.       @Nullable Bundle sessionInfo) {
  3. //略
  4. //初始化MediaSessionManager
  5.   MediaSessionManager manager = (MediaSessionManager) context
  6.           .getSystemService(Context.MEDIA_SESSION_SERVICE);
  7.   try {
  8. //创建Binder
  9.       mBinder = manager.createSession(mCbStub, tag, sessionInfo);
  10.       mSessionToken = new Token(Process.myUid(), mBinder.getController());
  11. //创建MediaController对象
  12.       mController = new MediaController(context, mSessionToken);
  13.   } catch (RemoteException e) {
  14.       throw new RuntimeException("Remote error creating session.", e);
  15.   }
  16. }
复制

这重点的有

  1. MediaSessionManager

  2. mBinder

  3. MediaController [这个暂时不关注]

隐藏内容!
付费阅读后才能查看!
2.5
4
多个隐藏块只需支付一次

MediaSessionService.java

FullUserRecord是在MediaSessionService中定义的。

FullUserRecord.onMediaButtonSessionChanged()
  1. @Override
  2. public void onMediaButtonSessionChanged(MediaSessionRecordImpl oldMediaButtonSession,
  3.       MediaSessionRecordImpl newMediaButtonSession) {
  4.   synchronized (mLock) {
  5.       if (oldMediaButtonSession != null) {
  6.           mHandler.postSessionsChanged(oldMediaButtonSession);
  7.       }
  8.       if (newMediaButtonSession != null) {
  9.       //保存MediaButton的接收者
  10.           rememberMediaButtonReceiverLocked(newMediaButtonSession);
  11.           mHandler.postSessionsChanged(newMediaButtonSession);
  12.       }
  13.       pushAddressedPlayerChangedLocked();
  14.   }
  15. }
复制

这里即使通知新和旧的MediaButtonSession变化。

一般日志都有相关打印

  1. Media button session is changed to com.biumall.video/VideoApp_MusicService (userId=0)
  2. Media button session is changed to com.biumall.music/MusicApp_MusicService (userId=0)
复制

暂时先跟到这,后续根据app继续分析。

要判断哪个接收MediaButton,看[Media button session is changed]日志最后一个即可。

参考文章

相关文章

1 条评论

  • 城堡大人
    城堡大人 管理员

    大家不用看,写得有点乱。

    中国广东
    回复