車(chē)模桌面加載成功后,需要各種交互
切換桌面處理
先補(bǔ)充如何切換桌面,初始化需要指定一個(gè)默認(rèn)桌面,初始化其實(shí)兩個(gè)桌面都會(huì)一起加載,假設(shè)默認(rèn)是車(chē)模桌面,地圖將不會(huì)初始化操作,但是地圖桌面會(huì)內(nèi)嵌到Launcher中
兩個(gè)桌面是互斥的,基于這種模式下,就需要隱藏另一個(gè)桌面,因?yàn)榍袚Q動(dòng)效的緣故,這里直接使用setTranslationX移出屏幕外處理
為了讓兩個(gè)桌面互斥,需要通過(guò) mActivityManager.moveTaskToFront(getTaskId(), 0) 方法讓兩個(gè)taskview內(nèi)嵌的activity只能一個(gè)處于前臺(tái),另一個(gè)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); } }
同時(shí)將兩個(gè)taskview內(nèi)嵌后,又單獨(dú)處理了各自的生命周期,達(dá)到互斥效果
3D桌面跟Launcher通訊
這里3D桌面需要額外處理,因?yàn)?D有個(gè)通訊進(jìn)程,需要監(jiān)聽(tīng)底層信號(hào)對(duì)車(chē)模進(jìn)行同步操作,而由于unity無(wú)法監(jiān)聽(tīng)到底層信號(hào),所以需要跟launcher進(jìn)行跨進(jìn)程通訊
所以在3D處于pause時(shí),需要將通訊進(jìn)程也暫停,否則信號(hào)會(huì)一直發(fā)送,并且3D也無(wú)法接受信號(hào)
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() } } } }
跨進(jìn)程通訊接口
package com.carlauncher; import android.os.Bundle; import com.carlauncher.IUnityBridgeCallback; interface UnityInterface { oneway void registerUnityBridgeCallback(IUnityBridgeCallback callback); oneway void unregisterUnityBridgeCallback(IUnityBridgeCallback callback); /** * 通知Unity 交互信息傳遞 * 交互信息傳輸專(zhuān)用,除Adapter都放這里 EX:車(chē)衣按鈕被點(diǎn)擊 | 天氣信息傳遞(bx1e) | 其他 * * @param msgType 消息類(lèi)型 * @param msgData 消息 */ oneway void setInteractionMsg(int msgType, in Bundle bundle); /** * 設(shè)置Unity是否處于顯示狀態(tài) */ oneway void setUnityVisible(boolean visible); }
在service中實(shí)現(xiàn)接口,通過(guò)setInteractionMsg方法跟unity車(chē)模交互通訊
通訊隊(duì)列
信號(hào)不斷的上報(bào),需要緩存信號(hào)然后實(shí)時(shí)發(fā)送同步到3D,這里需要在子線(xiàn)程中不斷輪詢(xún)
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(); } }
注冊(cè)好監(jiān)聽(tīng),需要發(fā)送信號(hào)時(shí)添加到緩存隊(duì)列,輪詢(xún)判斷是否有需要發(fā)送的消息,發(fā)送完之后移除緩存
浙公網(wǎng)安備 33010602011771號(hào)