前言

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

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

流水账,随意记录而已。

正文

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

MediaSession mMediaSession = new MediaSession(MusicApp.getContext(), TAG);
mMediaSession.setCallback(mediaSessionCallback);

private final MediaSession.Callback mediaSessionCallback = new MediaSession.Callback() {
    //略
}

MediaSession.java

frameworks\base\media\java\android\media\session\MediaSession.java

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

MediaSession()
public MediaSession(@NonNull Context context, @NonNull String tag) {
    this(context, tag, null);
}

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

MediaSession()
public MediaSession(@NonNull Context context, @NonNull String tag,
        @Nullable Bundle sessionInfo) {
    //略
    //初始化MediaSessionManager
    MediaSessionManager manager = (MediaSessionManager) context
            .getSystemService(Context.MEDIA_SESSION_SERVICE);
    try {
        //创建Binder
        mBinder = manager.createSession(mCbStub, tag, sessionInfo);
        mSessionToken = new Token(Process.myUid(), mBinder.getController());
        //创建MediaController对象
        mController = new MediaController(context, mSessionToken);
    } catch (RemoteException e) {
        throw new RuntimeException("Remote error creating session.", e);
    }
}

这重点的有

  1. MediaSessionManager

  2. mBinder

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

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

MediaSessionService.java

FullUserRecord是在MediaSessionService中定义的。

FullUserRecord.onMediaButtonSessionChanged()
@Override
public void onMediaButtonSessionChanged(MediaSessionRecordImpl oldMediaButtonSession,
        MediaSessionRecordImpl newMediaButtonSession) {
    synchronized (mLock) {
        if (oldMediaButtonSession != null) {
            mHandler.postSessionsChanged(oldMediaButtonSession);
        }
        if (newMediaButtonSession != null) {
            //保存MediaButton的接收者
            rememberMediaButtonReceiverLocked(newMediaButtonSession);
            mHandler.postSessionsChanged(newMediaButtonSession);
        }
        pushAddressedPlayerChangedLocked();
    }
}

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

一般日志都有相关打印

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

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

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

参考文章

相关文章

1 条评论

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

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

    广东深圳市
    回复