车模桌面加载成功后,需要各种交互

切换桌面处理

先补充如何切换桌面,初始化需要指定一个默认桌面,初始化其实两个桌面都会一起加载,假设默认是车模桌面,地图将不会初始化操作,但是地图桌面会内嵌到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);
        }
    }
View Code

同时将两个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()
                    }
                }
        }

    }
View Code

跨进程通讯接口

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);

}
View Code

在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();
    }
}
View Code

注册好监听,需要发送信号时添加到缓存队列,轮询判断是否有需要发送的消息,发送完之后移除缓存

 

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]
本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]