<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

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

      同時(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()
                          }
                      }
              }
      
          }
      View Code

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

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

      注冊(cè)好監(jiān)聽(tīng),需要發(fā)送信號(hào)時(shí)添加到緩存隊(duì)列,輪詢(xún)判斷是否有需要發(fā)送的消息,發(fā)送完之后移除緩存

       

      posted on 2025-10-27 13:28  翻滾的咸魚(yú)  閱讀(12)  評(píng)論(0)    收藏  舉報(bào)

      主站蜘蛛池模板: 亚洲VA成无码人在线观看天堂| 不卡av电影在线| 中国CHINA体内裑精亚洲日本| 午夜射精日本三级| 午夜高清福利在线观看| 九九综合va免费看| 丰满无码人妻热妇无码区| 蜜臀av性久久久久蜜臀aⅴ麻豆| 亚洲精品日韩在线观看| 亚洲成人精品综合在线| 亚洲色欲色欲www| 久久亚洲国产五月综合网| 一区二区三区鲁丝不卡| 宾阳县| av激情亚洲男人的天堂| 欧美人成精品网站播放| 久久精品女人天堂av| 黑人精品一区二区三区不| 免费无码一区无码东京热| 午夜福利偷拍国语对白| 色偷偷亚洲女人天堂观看| 精品人妻av中文字幕乱| 久久这里只精品热免费99| аⅴ天堂中文在线网| 国产精品亚洲二区在线看| 国产成人小视频| 超碰人人模人人爽人人喊手机版 | 777天堂麻豆爱综合视频| 亚洲日韩中文字幕在线播放| 成人无码一区二区三区网站| 日韩美女视频一区二区三区 | 一卡2卡三卡4卡免费网站| 国产成人综合在线观看不卡| 国产精品老熟女露脸视频| 狠狠亚洲色一日本高清色| 亚洲国产精品特色大片观看完整版| 九九热免费在线播放视频| 中文国产成人精品久久不卡| 无码少妇一区二区三区免费| 日韩国产成人精品视频| 亚洲欧洲一区二区福利片|