车模桌面加载成功后,需要各种交互
切换桌面处理
先补充如何切换桌面,初始化需要指定一个默认桌面,初始化其实两个桌面都会一起加载,假设默认是车模桌面,地图将不会初始化操作,但是地图桌面会内嵌到Launcher中
两个桌面是互斥的,基于这种模式下,就需要隐藏另一个桌面,因为切换动效的缘故,这里直接使用setTranslationX移出屏幕外处理
为了让两个桌面互斥,需要通过 mActivityManager.moveTaskToFront(getTaskId(), 0) 方法让两个taskview内嵌的activity只能一个处于前台,另一个pause
public void maybeBringEmbeddedTaskToForeground(int taskId) { if (taskId > 0) { // The task in TaskView should be in top to make it visible. // NOTE: Tried setTaskAlwaysOnTop before, the flag has some side effect to hinder // AccessibilityService from finding the correct window geometry: b/197247311 mActivityManager.moveTaskToFront(taskId, /* flags= */ 0); } }
同时将两个taskview内嵌后,又单独处理了各自的生命周期,达到互斥效果
3D桌面跟Launcher通讯
这里3D桌面需要额外处理,因为3D有个通讯进程,需要监听底层信号对车模进行同步操作,而由于unity无法监听到底层信号,所以需要跟launcher进行跨进程通讯
所以在3D处于pause时,需要将通讯进程也暂停,否则信号会一直发送,并且3D也无法接受信号
override fun setUnityVisible(visible: Boolean) { Log.w(TAG, "setUnityVisible:${visible}") val fragment = UnityPlayerFragment.Current if (fragment != null && fragment.isLoadUnityFinish) { lastVisibleFromLauncher3 = visible Log.w(TAG, "setUnityVisible:setInteractionMsg $visible") if (visible) { fragment.resumeUnityPlayer() } else { fragment.pauseUnityPlayer() } } } }
跨进程通讯接口
package com.carlauncher; import android.os.Bundle; import com.carlauncher.IUnityBridgeCallback; interface UnityInterface { oneway void registerUnityBridgeCallback(IUnityBridgeCallback callback); oneway void unregisterUnityBridgeCallback(IUnityBridgeCallback callback); /** * 通知Unity 交互信息传递 * 交互信息传输专用,除Adapter都放这里 EX:车衣按钮被点击 | 天气信息传递(bx1e) | 其他 * * @param msgType 消息类型 * @param msgData 消息 */ oneway void setInteractionMsg(int msgType, in Bundle bundle); /** * 设置Unity是否处于显示状态 */ oneway void setUnityVisible(boolean visible); }
在service中实现接口,通过setInteractionMsg方法跟unity车模交互通讯
通讯队列
信号不断的上报,需要缓存信号然后实时发送同步到3D,这里需要在子线程中不断轮询
public class AutoPullExecutor<K, E> extends Thread { private static final String TAG = "AutoPullExecutor"; private final FilterCache<K, E> mCache; private final List<FilterCacheHelper.OnPullCacheCallback<K, E>> mCallbacks; private boolean mIsRunning = false; public AutoPullExecutor(FilterCache<K, E> cache) { mCache = cache; mCallbacks = new ArrayList<>(); } @Override public void run() { Log.d(TAG, "AutoPullExecutor is start"); mIsRunning = true; while (mIsRunning) { FilterCache.Node<K, E> node = mCache.poll(); if (node == null) { continue; } autoPullCallback(node); } } private void autoPullCallback(FilterCache.Node<K, E> node) { for (FilterCacheHelper.OnPullCacheCallback<K, E> callback : mCallbacks) { callback.onCache(node.key, node.element); } } void addPullCallback(FilterCacheHelper.OnPullCacheCallback<K, E> callback) { mCallbacks.add(callback); } boolean isRunning() { return mIsRunning; } void exit() { mIsRunning = false; interrupt(); clear(); } void clear() { mCallbacks.clear(); } }
注册好监听,需要发送信号时添加到缓存队列,轮询判断是否有需要发送的消息,发送完之后移除缓存
浙公网安备 33010602011771号