精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

京東APP鴻蒙版上架實(shí)踐

系統(tǒng)
文章由鴻蒙社區(qū)產(chǎn)出,想要了解更多內(nèi)容請(qǐng)前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術(shù)社區(qū)https://harmonyos.51cto.com

[[406829]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

背景

隨著鴻蒙2.0的發(fā)布,華為部分手機(jī)用戶迎來(lái)鴻蒙時(shí)代,京東作為華為鴻蒙OS的合作APP,首次投入鴻蒙應(yīng)用商用版開發(fā),目前已上架V10.0.2版本。

鴻蒙OS特性

2021年6月3日,華為舉行了鴻蒙OS2.0發(fā)布會(huì)。鴻蒙OS帶來(lái)了全新桌面及用戶體驗(yàn),如桌面圖標(biāo)支持上滑呼出快捷卡片,原子化能力能通過(guò)鴻蒙設(shè)備間流轉(zhuǎn)實(shí)現(xiàn)快速分享、顯示,以及統(tǒng)一控制中心(手勢(shì):右上角下滑)、服務(wù)中心(手勢(shì):屏幕左下角或右下角向側(cè)上方滑動(dòng))等。

Android工程鴻蒙化

01 背景

為了利用上鴻蒙的特性,我們開發(fā)者需要盡快的將App鴻蒙化。但是將整個(gè)App鴻蒙化的工作量是特別龐大的,那么有沒(méi)有一種方式既能利用鴻蒙的特性也能快速適配呢,答案是有的,那就是混合包開發(fā)模式,整個(gè)App基本上沒(méi)有大的修改,只需要新增鴻蒙相關(guān)模塊用來(lái)實(shí)現(xiàn)鴻蒙相關(guān)特性即可。京東App鴻蒙版能夠做到快速適配上線,并擁有鴻蒙特性,就是利用了這種開發(fā)模式。下面我們將以京東App鴻蒙版為例,具體介紹下相關(guān)流程。

02 Android工程改造

1.我們需要依賴?guó)櫭傻囊粋€(gè)兼容包(包文件可以聯(lián)系我們?nèi)〉?,將我們現(xiàn)有的Application繼承自HarmonyApplication,僅需編譯依賴,不需要真正打進(jìn)App中。

  1. compileOnly files('libs/abilityshell_ide_java.jar'

2.在AndroidManifest.xml中,向根節(jié)點(diǎn)下增加。

  1. <uses-feature android:name="zidane.software.ability" android:required="false" /> 

3.向application節(jié)點(diǎn)下新增子節(jié)點(diǎn)。

  1. <meta-data android:name="permZA" android:value="true" /> 
  2. <meta-data android:name="multiFrameworkBundle" android:value="true" /> 

自此已經(jīng)可以構(gòu)建出鴻蒙需要的apk包了,大家也可以通過(guò)配置編譯變體等形式,構(gòu)建鴻蒙版本的apk包。

注意:鴻蒙包中混入的apk必須要是64位的。

03 配置鴻蒙工程

1.在鴻蒙工程中entry module中的build.gradle里,增加混入apk文件配置。

  1. legacyApkOptions{ 
  2.    legacyApk rootProject.file('android_entry.apk').absolutePath //混入apk的存放路徑 
  3.    signConfig{ 
  4.        storeFile rootProject.file('xxx.keystore')   //混入apk所用簽名文件 
  5.    } 

整體配置如下圖 :

簽名改造,我們需要根據(jù)Android apk的簽名來(lái)做鴻蒙應(yīng)用簽名的申請(qǐng),需要將.keystore或.jks格式的簽名文件轉(zhuǎn)換成.p12文件,簽名秘鑰和別名保持不變。具體轉(zhuǎn)換步驟,大家可以自行搜索。

參考: 在轉(zhuǎn)換.p12文件時(shí),我們遇到了問(wèn)題,由于我們Android的簽名格式是.keystore,轉(zhuǎn)出來(lái)的.p12文件有問(wèn)題無(wú)法申請(qǐng)鴻蒙應(yīng)用證書,經(jīng)過(guò)和華為方面溝通,我們將鴻蒙應(yīng)用的簽名秘鑰和別名保持和Android的一致,解決了打包問(wèn)題。

配置文件增加屬性,在鴻蒙工程的每個(gè)feature module的config.json app節(jié)點(diǎn)下,增加originalName,表示混入的apk包名,同時(shí)要將bundleName的值也改成一致。

在entry模塊下,新建一個(gè)空的Ability類并配置在config.json里作為啟動(dòng)入口,如:

  1. "abilities": [{ 
  2.  "skills": [{ 
  3.    "entities": ["entity.system.home"], 
  4.    "actions": ["action.system.home"
  5.  }], 
  6.  "orientation""portrait"
  7.  "visible"true
  8.  "name""com.xxx.xxx.xx.EntryAbility"
  9.  "icon""$media:icon"
  10.  "description""$string:mainability_description"
  11.  "label""$string:app_name"
  12.  "type""page"
  13.  "launchType""standard" 
  14. ], 

自此已經(jīng)可以構(gòu)建出包含原有Android功能的鴻蒙包了。

Android鴻蒙互調(diào)用

01 從Android啟動(dòng)鴻蒙組件

我們需要集成鴻蒙的一個(gè)jar包(可以聯(lián)系我們獲得此文件),來(lái)實(shí)現(xiàn)從Android啟動(dòng)鴻蒙的組件。如:

  1. Intent intent = new Intent(); 
  2. ComponentName componentName = new ComponentName("your harmony app's bundleName name","your ability's full name"); 
  3. intent.setComponent(componentName); 
  4. intent.putExtras(bundle); 
  5. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK); 
  6. AbilityUtils.startAbility(context, intent); 

02 鴻蒙模塊調(diào)用Android

鴻蒙啟動(dòng)Android組件

鴻蒙里本身是支持啟動(dòng)Android組件的,只需要在Intent里增加一個(gè)flag

  1. Intent.FLAG_NOT_OHOS_COMPONENT 

如:

  1. Intent intent = new Intent(); 
  2.         Operation operation = new Intent.OperationBuilder() 
  3.                 .withDeviceId(""
  4.                 .withBundleName("your android app’s packagename"
  5.                 .withAbilityName("your android app’s activity fullname"
  6.                 .withFlags(Intent.FLAG_NOT_OHOS_COMPONENT) 
  7.                 .build(); 
  8.         intent.setOperation(operation); 
  9.         startAbility(intent); 

鴻蒙模塊調(diào)用Android現(xiàn)有能力

在Android包里,已經(jīng)有了很多現(xiàn)有功能,如埋點(diǎn)收集、用戶登錄態(tài)獲取、定位、地址等等,在鴻蒙模塊里需要用到這些功能時(shí),我們?yōu)榱斯?jié)省時(shí)間暫時(shí)沒(méi)有再去開發(fā)一遍鴻蒙版,我們利用了Java的反射技術(shù)來(lái)搞定。經(jīng)過(guò)驗(yàn)證,在Android中反射鴻蒙以及鴻蒙中反射Android都是可以的。

03 獲取當(dāng)前是否為鴻蒙系統(tǒng)

在有些場(chǎng)景下,我們需要知道當(dāng)前系統(tǒng)的運(yùn)行環(huán)境是不是鴻蒙系統(tǒng),可以使用以下代碼段來(lái)實(shí)現(xiàn)。

  1. private static final String HARMONY_OS = "harmony"
  2. /** 
  3. check the system is harmony os 
  4. * @return true if it is harmony os 
  5. */ 
  6. public static boolean isHarmonyOS() { 
  7.     try { 
  8.         Class clz = Class.forName("com.huawei.system.BuildEx"); 
  9.         Method method = clz.getMethod("getOsBrand"); 
  10.         return HARMONY_OS.equals(method.invoke(clz)); 
  11.     } catch (ClassNotFoundException e) { 
  12.         Log.e(TAG, "occured ClassNotFoundException"); 
  13.     } catch (NoSuchMethodException e) { 
  14.         Log.e(TAG, "occured NoSuchMethodException"); 
  15.     } catch (Exception e) { 
  16.         Log.e(TAG, "occur other problem"); 
  17.     } 
  18.     return false

鴻蒙OS特性+購(gòu)物應(yīng)用場(chǎng)景開發(fā)

鴻蒙OS打破了設(shè)備間的壁壘,對(duì)用戶及應(yīng)用開發(fā)者來(lái)說(shuō),形成了超級(jí)終端。超級(jí)終端包含手機(jī)、大屏、平板,未來(lái)或許會(huì)有更多的設(shè)備加入,設(shè)備間協(xié)同合作讓購(gòu)物體驗(yàn)變得優(yōu)質(zhì)。每個(gè)設(shè)備不再是孤立的個(gè)體,而是基于鴻蒙操作系統(tǒng)的智慧終端,即便用戶拿著不同的設(shè)備,也可以有很好的體驗(yàn)。通過(guò)一鍵流轉(zhuǎn)實(shí)現(xiàn)跨設(shè)備間的數(shù)據(jù)傳輸,從而實(shí)現(xiàn)無(wú)縫的購(gòu)物體驗(yàn)。

01 流轉(zhuǎn):直播間FA

介紹

流轉(zhuǎn)泛指多設(shè)備間的分布式操作,打破設(shè)備界限,多設(shè)備聯(lián)動(dòng),使用戶應(yīng)用程序可分可合、可流轉(zhuǎn)。流轉(zhuǎn)按照體驗(yàn)可分為跨端遷移和多端協(xié)同。流轉(zhuǎn)支持免安裝運(yùn)行FA。京東App鴻蒙版本中的直播FA就利用了流轉(zhuǎn)能力,將當(dāng)前手機(jī)的直播流轉(zhuǎn)至TV端,做到無(wú)縫銜接,并支持通過(guò)手機(jī)端控制TV端直播顯示的功能。效果如下:

開發(fā)

我們以京東App鴻蒙版中直播FA的流轉(zhuǎn)開發(fā)經(jīng)驗(yàn)進(jìn)行介紹,如何具備流轉(zhuǎn)能力。

1.權(quán)限要求

由于使用到了分布式能力,我們需要先把權(quán)限配置好,在對(duì)應(yīng)的module的config.json下,增加以下權(quán)限:

  1. ohos.permission.GET_DISTRIBUTED_DEVICE_INFO 
  2. ohos.permission.DISTRIBUTED_DATASYNC 
  3. ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE 

同時(shí)在Ability里,需要增加動(dòng)態(tài)權(quán)限申請(qǐng)。

  1. requestPermissionsFromUser( 
  2.        new String[]{SystemPermission.DISTRIBUTED_DATASYNC},  
  3.         Constants.PermissionCode.PERMISSION_DISTRIBUTED_DATASYNC); 

2.關(guān)鍵接口

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

3.功能實(shí)現(xiàn)

a. 通過(guò)流轉(zhuǎn)服務(wù)注冊(cè)管理器,將當(dāng)前FA注冊(cè),注冊(cè)時(shí)可以指定流轉(zhuǎn)的過(guò)濾條件,如設(shè)備類型、目標(biāo)設(shè)備等等:

b. 當(dāng)需要流轉(zhuǎn)時(shí),我們通過(guò)流轉(zhuǎn)服務(wù)注冊(cè)管理器獲取當(dāng)前滿足條件的設(shè)備列表:

系統(tǒng)會(huì)自動(dòng)查找設(shè)備,將滿足條件的設(shè)備自動(dòng)展示出來(lái)供用戶選擇,當(dāng)用戶點(diǎn)擊某個(gè)設(shè)備后,就會(huì)回調(diào)IContinuationDeviceCallback的onDeviceConnectDone方法,獲取到目標(biāo)設(shè)備的Id后,就可以啟動(dòng)目標(biāo)設(shè)備的FA。

c. 啟動(dòng)遠(yuǎn)程FA

需要注意的是,在啟動(dòng)對(duì)端設(shè)備上FA時(shí),我們要確保對(duì)端設(shè)備的分布式能力已經(jīng)被初始化。

02 FA近場(chǎng)分享:商詳FA

介紹

FA近場(chǎng)分享能力依賴于華為分享服務(wù),可以快速實(shí)現(xiàn)FA分享的功能。較單純的使用分布式FA流轉(zhuǎn)功能,為開發(fā)者免除了設(shè)備發(fā)現(xiàn)功能,并且沒(méi)有了同賬號(hào)同網(wǎng)絡(luò)等限制條件。在京東App鴻蒙版中,商詳FA就使用了此功能實(shí)現(xiàn)了FA的近場(chǎng)分享,并且能夠做到免安裝打開商詳頁(yè)面。下圖分別是A向B發(fā)送商詳FA 和 B接收商詳FA。

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)
京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

開發(fā)

我們將以在京東App鴻蒙版中的相關(guān)開發(fā)經(jīng)驗(yàn)介紹下如何進(jìn)行FA近場(chǎng)分享的開發(fā)。

工作原理圖示:

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

由于功能依賴華為分享服務(wù),我們首先要引入IDL文件。

導(dǎo)入IDL文件

在商詳FA module中java同級(jí)目錄,創(chuàng)建idl目錄,并創(chuàng)建包名com.huawei.hwshare.third,在此包名下創(chuàng)建IHwShareCallback.idl和 IHwShareService.idl文件,文件具體內(nèi)容如下:

  1. IHwShareCallback.idl: 
  2. interface com.huawei.hwshare.third.IHwShareCallback { 
  3.  
  4.     [oneway] void notifyState([inint state); 
  5.  
  6. IHwShareService.idl: 
  7. sequenceable ohos.interwork.utils.PacMapEx; 
  8.  
  9. interface com.huawei.hwshare.third.IHwShareCallback; 
  10.  
  11. interface com.huawei.hwshare.third.IHwShareService { 
  12.  
  13.     int startAuth([in] String appId, [in] IHwShareCallback callback);  
  14.     int shareFaInfo([in] PacMapEx pacMapEx); 
  15.  
京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

對(duì)分享能力進(jìn)行封裝

以下是我們?cè)谏淘擣A中封裝好的代碼,大家可以直接使用。

  1. package com.xxx.xxx.xxx; 
  2. import com.huawei.hwshare.third.HwShareCallbackStub; 
  3. import com.huawei.hwshare.third.HwShareServiceProxy; 
  4. import ohos.aafwk.ability.IAbilityConnection; 
  5. import ohos.aafwk.content.Intent; 
  6. import ohos.app.Context; 
  7. import ohos.bundle.ElementName; 
  8. import ohos.eventhandler.EventHandler; 
  9. import ohos.eventhandler.EventRunner; 
  10. import ohos.interwork.utils.PacMapEx; 
  11. import ohos.rpc.IRemoteObject; 
  12. import ohos.rpc.RemoteException; 
  13. import ohos.hiviewdfx.HiLog; 
  14. import ohos.hiviewdfx.HiLogLabel; 
  15. public class ShareFaManager { 
  16.    private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD000F00, "ShareFa");  
  17.     private static final String LOG_FORMAT = "%{public}s: %{public}s"
  18.     // FA的圖標(biāo) byte[] len < 32768 非必須,不傳默認(rèn)取應(yīng)用圖標(biāo) 
  19.     public static final String HM_FA_ICON = "ohos_fa_icon"
  20.     // FA的名字 String len < 1024 非必須,不傳默認(rèn)取應(yīng)用名 
  21.     public static final String HM_FA_NAME = "ohos_fa_name"
  22.     // ability類名 String len < 1024 必須 
  23.     public static final String HM_ABILITY_NAME = "ohos_ability_name"
  24.     // 包名 String len < 1024 必須 
  25.     public static final String HM_BUNDLE_NAME = "ohos_bundle_name"
  26.     // FA類型 int 暫時(shí)只有0 非必須,默認(rèn)為0 
  27.     public static final String SHARING_FA_TYPE = "sharing_fa_type"
  28.     // FA卡片展示圖 byte[] len < 153600 必須 
  29.     public static final String SHARING_THUMB_DATA = "sharing_fa_thumb_data"
  30.     // FA卡片展示信息 String len < 1024 必須 
  31.     public static final String SHARING_CONTENT_INFO = "sharing_fa_content_info"
  32.     // 攜帶的額外信息,可帶到被拉起的FA String len < 10240 非必須 
  33.     public static final String SHARING_EXTRA_INFO = "sharing_fa_extra_info"
  34.     private static final String TAG = "ShareHmFaManager"
  35.     private static final String SHARE_PKG_NAME = "com.huawei.android.instantshare"
  36.     private static final String SHARE_ACTION = "com.huawei.instantshare.action.THIRD_SHARE"
  37.     private static final long UNBIND_TIME = 20*1000L; 
  38.     private Context mContext; 
  39.     private String mAppId; 
  40.     private PacMapEx mSharePacMap; 
  41.     private static ShareFaManager sSingleInstance; 
  42.     private HwShareServiceProxy mShareService; 
  43.     private boolean mHasPermission = false
  44.     private EventHandler mHandler = new EventHandler(EventRunner.getMainEventRunner()); 
  45.     //服務(wù)綁定回調(diào) 
  46.     private final IAbilityConnection mConnection = new IAbilityConnection() { 
  47.         @Override 
  48.         public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int i) { 
  49.             HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "onAbilityConnectDone success."); 
  50.             mHandler.postTask(()->{ 
  51.                 mShareService = new HwShareServiceProxy(iRemoteObject); 
  52.                 try { 
  53.                     //華為分享認(rèn)證授權(quán) 
  54.                     mShareService.startAuth(mAppId, mFaCallback); 
  55.                 } catch (RemoteException e) { 
  56.                     HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "startAuth error."); 
  57.                 } 
  58.             }); 
  59.         } 
  60.         @Override 
  61.        public void onAbilityDisconnectDone(ElementName elementName, int i) { 
  62.            HiLog.info(LABEL_LOG, LOG_FORMAT, TAG, "onAbilityDisconnectDone."); 
  63.            mHandler.postTask(()->{ 
  64.                mShareService = null
  65.                mHasPermission = false
  66.             }); 
  67.         } 
  68.     }; 
  69.     private Runnable mTask = () -> { 
  70.         if (mContext != null && mShareService != null) { 
  71.             mContext.disconnectAbility(mConnection); 
  72.             mHasPermission = false
  73.             mShareService = null
  74.         } 
  75.     }; 
  76.     //華為分享認(rèn)證授權(quán)回調(diào) 
  77.     private final HwShareCallbackStub mFaCallback = new HwShareCallbackStub("HwShareCallbackStub") { 
  78.         @Override 
  79.         public void notifyState(int state) throws RemoteException { 
  80.             mHandler.postTask(()->{ 
  81.                 HiLog.info(LABEL_LOG, LOG_FORMAT, TAG, "notifyState: " + state); 
  82.                 if (state == 0) { 
  83.                     mHasPermission = true
  84.                     if (mSharePacMap != null) { 
  85.                        shareFaInfo(); 
  86.                     } 
  87.                 } 
  88.             }); 
  89.         } 
  90.     }; 
  91.     /** 
  92.      \* 單例模式獲取ShareFaManager的實(shí)例對(duì)象 
  93.      * 
  94.      \* @param context 程序Context 
  95.      \* @return ShareFaManager實(shí)例對(duì)象 
  96.      */ 
  97.     public static synchronized ShareFaManager getInstance(Context context) { 
  98.         if (sSingleInstance == null && context != null) { 
  99.             sSingleInstance = new ShareFaManager(context.getApplicationContext()); 
  100.         } 
  101.         return sSingleInstance; 
  102.     } 
  103.     private ShareFaManager(Context context) { 
  104.         mContext = context; 
  105.     } 
  106.     private void shareFaInfo() { 
  107.         if (mShareService == null) { 
  108.             return
  109.         } 
  110.         if (mHasPermission) { 
  111.             HiLog.info(LABEL_LOG, LOG_FORMAT, TAG, "start shareFaInfo."); 
  112.             try { 
  113.                 mShareService.shareFaInfo(mSharePacMap); 
  114.                 mSharePacMap = null
  115.             } catch (RemoteException e) { 
  116.                 HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "shareFaInfo error."); 
  117.             } 
  118.         } 
  119.         // 不使用時(shí)斷開 
  120.         mHandler.postTask(mTask, UNBIND_TIME); 
  121.     } 
  122.     /** 
  123.      \* 開始分享 
  124.      * 
  125.      \* @param appId 開發(fā)者聯(lián)盟網(wǎng)站創(chuàng)建鴻蒙服務(wù)/鴻蒙應(yīng)用時(shí)生成的appid 
  126.      \* @param pacMap 服務(wù)信息載體 
  127.      */ 
  128.     public void shareFaInfo(String appId, PacMapEx pacMap) { 
  129.         if (mContext == null) { 
  130.             return
  131.         } 
  132.         mAppId = appId; 
  133.         mSharePacMap = pacMap; 
  134.         mHandler.removeTask(mTask); 
  135.         shareFaInfo(); 
  136.         bindShareService(); 
  137.     } 
  138.     /** 
  139.      \* 綁定華為分享服務(wù) 
  140.      */ 
  141.     private void bindShareService() { 
  142.             if (mShareService != null) { 
  143.             return
  144.         } 
  145.         HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "start bindShareService."); 
  146.         Intent intent = new Intent(); 
  147.         intent.setBundle(SHARE_PKG_NAME); 
  148.         intent.setAction(SHARE_ACTION); 
  149.         intent.setFlags(Intent.FLAG_NOT_OHOS_COMPONENT); 
  150.         mContext.connectAbility(intent, mConnection); 
  151.     } 
  152.     } 

3.開始分享

我們將參數(shù)進(jìn)行組裝,調(diào)用ShareFaManager的shareFaInfo方法即可自動(dòng)的完成FA分享功能。如我們將商詳FA進(jìn)行分享:

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

注意

  1. 使用時(shí)要主要傳遞的數(shù)據(jù)不要超過(guò)限定的大小,否則會(huì)分享失敗并導(dǎo)致程序崩潰。
  2. 在對(duì)端接收到分享后,我們需要將自定義的參數(shù)取出來(lái),從Intent中取sharing_fa_extra_info即可。

Ps:針對(duì)遠(yuǎn)距離的場(chǎng)景,華為也給出了解決方案,通過(guò)暢連即可分享購(gòu)物鏈接。值得注意的是,此時(shí)好友還可以通過(guò)屏幕共享在商品頁(yè)面進(jìn)行涂鴉互動(dòng)。

03 服務(wù)卡片:搜索卡片

用戶上滑 App 圖標(biāo)即可生成萬(wàn)能卡片 ,在桌面呈現(xiàn)更豐富的信息,卡片信息支持實(shí)時(shí)更新,減少了 App 加載的時(shí)間,如目前京東app,用戶上滑 App 圖標(biāo)可打開快捷搜索入口。

介紹

FA卡片是FeatureAbility的Page模板的一種界面展示形式。FA卡片常用于嵌入到其他應(yīng)用中作為其界面的一部分顯示,并支持基礎(chǔ)的交互功能。卡片使用方作為卡片展示的宿主負(fù)責(zé)顯示卡片,卡片使用方的典型應(yīng)用就是桌面應(yīng)用。卡片使用方僅限系統(tǒng)應(yīng)用。

當(dāng)FA規(guī)格小于10M時(shí),可以支持免安裝運(yùn)行。系統(tǒng)最大支持500個(gè)卡片,相同名稱的卡片實(shí)例最大是32個(gè)。

通過(guò)服務(wù)卡片的一些特點(diǎn),如定時(shí)更新、免安裝運(yùn)行等,可以很好的進(jìn)行快捷入口的引導(dǎo)。如我們可以在卡片上展示活動(dòng)商品,并定期更新,用戶可以免安裝的打開活動(dòng)詳情,當(dāng)用戶產(chǎn)生進(jìn)一步購(gòu)買欲望時(shí),用戶可下載整個(gè)App進(jìn)行下單。

開發(fā)

卡片的開發(fā)支持JS和Java兩種方式。在京東App鴻蒙版中的搜索FA里,我們加入了FA卡片,可以直達(dá)搜索。下面我們將以此為例進(jìn)行開發(fā)步驟的講解。

1.卡片配置

首先要在搜索FA的config.json中配置forms節(jié)點(diǎn),比如:

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

我們給SearchAbility節(jié)點(diǎn)下添加forms節(jié)點(diǎn),就表示這個(gè)卡片的創(chuàng)建及管理由SearchAbility來(lái)負(fù)責(zé)。

注意:必須要設(shè)置label屬性,必須是資源形式的且不能是包名。

屬性解釋:

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

實(shí)現(xiàn)卡片相關(guān)回調(diào)

在SearchAbility中,復(fù)寫以下幾個(gè)方法:

 京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

創(chuàng)建:在創(chuàng)建卡片時(shí),我們可以從Intent中獲取當(dāng)前要?jiǎng)?chuàng)建卡片的Id,如:

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

這是一個(gè)很簡(jiǎn)單的卡片,我們沒(méi)有對(duì)卡片中的視圖設(shè)置任何數(shù)據(jù)和事件,那么點(diǎn)擊卡片后,打開的就是負(fù)責(zé)管理卡片的Ability。如果需要設(shè)置數(shù)據(jù)和事件,可以使用以下方式

創(chuàng)建ComponentProvider;

通過(guò)ComponentProvider設(shè)置對(duì)應(yīng)View的數(shù)據(jù),以及點(diǎn)擊事件,目前能夠支持的事件有START_ABILITY和START_SERVICE兩類;

將ComponentProvider對(duì)象合并入ProviderFormInfo中。

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

更新:當(dāng)觸發(fā)了更新卡片方法時(shí),我們可以進(jìn)行數(shù)據(jù)更新,并將最新的數(shù)據(jù)更新到卡片View上。

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

刪除:當(dāng)卡片使用方將卡片刪除,我們可能需要將對(duì)應(yīng)卡片在App內(nèi)的相關(guān)持久化數(shù)據(jù)進(jìn)行刪除。

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

3.配置EntryCard目錄

配置EntryCard目錄,以便讓系統(tǒng)能夠識(shí)別出服務(wù)卡片,并展示在服務(wù)中心的推薦里。新建應(yīng)用時(shí)可以勾選自動(dòng)生成,如果是之前IDE創(chuàng)建的工程,則需要手動(dòng)補(bǔ)充上。

1)在工程根目錄下創(chuàng)建EntryCard目錄;

2) EntryCard目錄下,創(chuàng)建一個(gè)文件夾,取名為擁有卡片的FA工程名,如我們的搜索FA擁有服務(wù)卡片,搜索FA的工程名叫searchfeature,那我們就創(chuàng)建一個(gè)文件夾,名字就叫做searchfeature;

3)在searchfeature目錄下創(chuàng)建base/snapshot兩級(jí)目錄,在其中放置我們的卡片圖片,其命名方式為formnamedimensions,如搜索卡片的卡片名稱配置的是search_card,尺寸是22的,那么這個(gè)圖片就命名為search_card2x2.png。

鴻蒙App打包及上架

01 打包構(gòu)建

通過(guò)以上配置,我們已經(jīng)可以進(jìn)行鴻蒙App的構(gòu)建了。目前鴻蒙App分為兩種構(gòu)建形式,debug和release,可以通過(guò)DevEco工具自帶的編譯任務(wù)或者使用gradle的assembleDebug signReleaseApp任務(wù)進(jìn)行構(gòu)建。

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

其中debug模式構(gòu)建方式出來(lái)的產(chǎn)物是多個(gè)目標(biāo)設(shè)備的多個(gè).hap文件,每個(gè)FA都會(huì)構(gòu)建出各自的.hap文件;release會(huì)構(gòu)建出一個(gè).app文件,我們需要將此文件進(jìn)行上架發(fā)布。

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

安裝及運(yùn)行

開發(fā)者無(wú)法安裝.app安裝包,此文件只能用于上架應(yīng)用市場(chǎng)。

通過(guò)adb shell bm get udid獲取設(shè)備UDID后,錄入到開發(fā)者中心,并生成證書文件,我們就可以安裝.hap包。

安裝時(shí)可以將文件push到手機(jī)某個(gè)目錄下(如sdcard/hmphone),然后使用adb shell bm install p /sdcard/hmphone/進(jìn)行安裝,每次安裝可以先刪除之前文件。

注意: 由于我們無(wú)法安裝驗(yàn)證.app包,我們要保證在debug和release兩種構(gòu)建模式下,我們的代碼不會(huì)發(fā)生改變。

02 應(yīng)用上架及發(fā)布

1.如果還沒(méi)有在開發(fā)者中心創(chuàng)建鴻蒙應(yīng)用的話,需要先新增一個(gè)鴻蒙應(yīng)用,包名和之前Android的包名保持一致,并關(guān)聯(lián)到同一個(gè)項(xiàng)目中。

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

選擇我們創(chuàng)建的鴻蒙應(yīng)用,在【應(yīng)用信息】頁(yè)面中,將應(yīng)用安裝與升級(jí)修改為如下圖所示。

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

在【版本信息】頁(yè)面中,點(diǎn)擊【版本/升級(jí)】創(chuàng)建新版本,在新版本頁(yè)面中的【軟件版本】模塊下,上傳我們構(gòu)建的.app軟件包后并勾選,在當(dāng)前頁(yè)面填入相關(guān)信息后即可提交審核,待審核通過(guò)后,在應(yīng)用市場(chǎng)上就會(huì)出現(xiàn)了。

京東APP鴻蒙版上架實(shí)踐-鴻蒙HarmonyOS技術(shù)社區(qū)

后續(xù)規(guī)劃

鴻蒙OS為消費(fèi)者建立便捷的購(gòu)物超級(jí)終端模式提供了可能,隨著鴻蒙生態(tài)的豐富,人們的購(gòu)物形式也會(huì)隨之出現(xiàn)新的改變。京東將從用戶角度出發(fā),結(jié)合鴻蒙OS,讓更多的用戶在更多的設(shè)備和場(chǎng)景享受京東的優(yōu)質(zhì)服務(wù),敬請(qǐng)期待……

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來(lái)源: 鴻蒙社區(qū)
相關(guān)推薦

2019-07-04 14:11:48

App StoreiOS應(yīng)用開發(fā)

2015-07-15 10:08:26

Windows 10微軟

2024-05-29 07:56:41

2016-12-28 14:16:25

京東高并發(fā)系統(tǒng)設(shè)計(jì)

2020-02-22 13:00:26

App StoreiOSOffice

2017-01-10 16:04:02

容器MySQL實(shí)踐

2017-02-24 10:30:51

iOS開源App Store

2019-03-05 14:42:25

微軟Surface GoLTE
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

外国成人免费视频| 欧美成人毛片| 国产亚洲精品bt天堂精选| 国产精品久久久久久搜索 | 97超碰国产精品| 视频在线不卡| 精品一区二区三区香蕉蜜桃| 国模私拍视频一区| 国产人与禽zoz0性伦| jizzjizzjizz欧美| 欧美三级视频在线| 霍思燕三级露全乳照| 尤物网址在线观看| aaa国产一区| 91在线高清免费观看| 亚洲黄色小说图片| 欧美一区二区三区久久精品茉莉花| 亚洲黄在线观看| 婷婷激情综合五月天| 天堂中文在线播放| 一区二区三区小说| 婷婷久久五月天| 亚洲欧美日韩免费| 国产高清成人在线| 国产精品一久久香蕉国产线看观看 | aa在线观看视频| 99热国产在线| 国产精品久久久久久福利一牛影视| 国产欧美一区二区三区另类精品| 91影院在线播放| 日韩精品一二三| 国模精品一区二区三区色天香| 久久免费看少妇高潮v片特黄| 国产精品一区二区99| 精品免费99久久| 亚洲三级在线观看视频| 精品视频在线一区二区在线| 福利一区视频在线观看| 精品久久久久久无码中文野结衣| 毛片av在线| 国产欧美日韩另类一区| 欧美日韩精品免费在线观看视频| 欧美自拍偷拍第一页| 国产精品一区二区三区网站| 国产在线视频不卡| 中文字幕人妻丝袜乱一区三区| 亚洲在线观看| 欧美专区在线播放| 五月婷婷色丁香| 国产精品人人爽人人做我的可爱| 国产69精品久久久久99| 国产亚洲精品女人久久久久久| 亚洲一区二区| 久热精品在线视频| 亚洲国产精品免费在线观看| 亚洲情侣在线| 久久99热精品这里久久精品| 黄色在线观看免费| 一区在线视频观看| 久久久久久久久久久免费| 日本一本高清视频| 一区二区毛片| 日本亚洲欧洲色α| 中文字幕+乱码+中文乱码91| 蜜桃久久久久久久| 91免费精品国偷自产在线| 国产区精品在线| 国产91丝袜在线播放| 国产一区二区三区av在线| 三级在线电影| 国产欧美综合色| 亚洲最新在线| 色av手机在线| 欧美日韩美女在线| 国产小视频精品| 国产一区二区视频在线看| 精品少妇一区二区三区视频免付费 | 福利一区在线观看| 精品视频一区二区| 二人午夜免费观看在线视频| 亚洲天堂中文字幕| 日韩a∨精品日韩在线观看| 欧美动物xxx| 欧美日韩高清一区| 国偷自产av一区二区三区麻豆| 国产图片一区| 一区三区二区视频| 久久久久成人网站| 日韩经典中文字幕一区| 91午夜理伦私人影院| 色婷婷av一区二区三区之红樱桃| 久久精品一区二区三区不卡牛牛| 一区二区视频在线播放| 岛国毛片av在线| 欧美性大战久久久| 性农村xxxxx小树林| 少妇精品久久久一区二区三区| 日韩中文av在线| aaa人片在线| 精品伊人久久久久7777人| 官网99热精品| av成人手机在线| 午夜视频一区二区三区| jizz18女人| 欧美激情15p| 欧美成年人视频网站欧美| 国产又黄又粗又爽| 国产激情一区二区三区四区 | 亚洲乱码国产乱码精品精大量| 久久中文字幕av| 57pao精品| 99热这里只有精品在线观看| 国产日本一区二区| 国产一区二区网| 视频一区视频二区欧美| 少妇高潮 亚洲精品| 日韩黄色一级大片| 国产.欧美.日韩| 久久av喷吹av高潮av| 经典三级一区二区| 日韩av在线高清| 男人在线观看视频| 蜜臀国产一区二区三区在线播放| 狠狠色噜噜狠狠色综合久 | 一区二区三区免费| 香港日本韩国三级网站| 欧美freesex8一10精品| 欧美极品少妇xxxxⅹ裸体艺术 | 久久高清无码视频| 精品夜夜嗨av一区二区三区| 欧美一进一出视频| 涩涩视频在线| 日韩av网站大全| 日韩激情在线播放| 成人自拍视频在线观看| 国产 国语对白 露脸| 国产成人视屏| 蜜臀久久99精品久久久无需会员| 岳乳丰满一区二区三区| 中文字幕欧美激情| 蜜桃免费在线视频| 国产尤物久久久| 国产精品爱久久久久久久| 午夜性色福利影院| 好吊成人免视频| 国产传媒第一页| 国产一区二区你懂的| 免费久久99精品国产自| 亚洲午夜天堂| 亚洲视频在线视频| 日韩xxx视频| 中文在线免费一区三区高中清不卡| 大肉大捧一进一出好爽动态图| 一区二区小说| 国产精品欧美一区二区| 在线免费观看黄色| 欧美剧情片在线观看| 国产精品视频一区二区三| 国产乱国产乱300精品| 国产精品igao激情视频 | 欧美精品一区二区三区久久| xxx欧美xxx| 夜夜嗨av一区二区三区四区 | 激情综合亚洲精品| 在线观看污视频| 99热这里只有精品首页| 亚洲91av视频| 国产在线小视频| 欧美亚洲自拍偷拍| 成人高潮免费视频| 99久久精品情趣| aaa毛片在线观看| 久久视频在线| 国产经品一区二区| 国产超碰精品| 日韩在线视频网| 国产91久久久| 欧美亚洲丝袜传媒另类| 国产性xxxx| 2020日本不卡一区二区视频| 奇米影音第四色| 综合久久亚洲| 欧美伦理一区二区| 日韩一二三区| 日韩av电影在线网| 在线xxxx| 亚洲视频在线免费观看| 国产精品视频在线观看免费| 午夜精品影院在线观看| 337人体粉嫩噜噜噜| 国产激情视频一区二区三区欧美| 欧美a在线视频| 亚洲国产一区二区在线观看| 韩国一区二区三区美女美女秀| 成人午夜sm精品久久久久久久| 欧美乱妇高清无乱码| 欧美男男同志| 精品剧情在线观看| 少妇又紧又色又爽又刺激视频 | av电影在线观看完整版一区二区| 成人免费无码av| 欧美日韩天堂| 一区二区三区四区视频在线观看| 老牛精品亚洲成av人片| 成人精品视频99在线观看免费| 日本免费一区二区六区| 麻豆乱码国产一区二区三区| 欧美捆绑视频| 欧美精品一区二区不卡| 91资源在线视频| 高跟丝袜一区二区三区| 国产一级在线播放| 综合av第一页| 日本一区二区视频在线播放| 91亚洲永久精品| 国产又黄又嫩又滑又白| 开心九九激情九九欧美日韩精美视频电影 | 亚洲一区国产精品| 国产精成人品2018| 日本最新高清不卡中文字幕| 黄视频免费在线看| 欧美极品美女电影一区| 成人在线免费看黄| 精品久久久av| 91在线品视觉盛宴免费| 亚洲欧洲美洲在线综合| 五十路在线观看| 精品久久久久99| 国产特黄一级片| 4438成人网| 亚洲特级黄色片| 欧美揉bbbbb揉bbbbb| 波多野结衣午夜| 91久久一区二区| 午夜精品免费观看| 色婷婷综合五月| 五月天婷婷激情| 欧美日韩亚洲一区二| 国产特黄大片aaaa毛片| 精品动漫一区二区三区| 日本免费一二三区| 亚洲成年人影院| 国产无遮挡裸体免费视频| 亚洲综合色网站| 久久久久久激情| 亚洲r级在线视频| 日韩成人在线免费视频| 亚洲国产精品一区二区尤物区| 久久中文字幕无码| 亚洲第一久久影院| 国产黄色片免费看| 狠狠色狠狠色综合日日五| 天天做天天爱夜夜爽| 欧美性猛交视频| 无码人妻精品一区二区三区不卡 | 亚洲日本乱码在线观看| 顶臀精品视频www| 亚洲自拍偷拍欧美| 日韩免费在线视频观看| 色哟哟在线观看一区二区三区| 亚洲高清毛片一区二区| 色吊一区二区三区| 中文字幕一级片| 欧美一区二区三区四区在线观看 | xvideos成人免费中文版| 欧美尤物美女在线| 欧美精品手机在线| heyzo高清国产精品| 欧美一区二粉嫩精品国产一线天| 毛片免费看不卡网站| 国产伦精品免费视频| 日韩成人在线观看视频| 国内精品**久久毛片app| 欧美理论在线播放| 天堂av在线中文| 国产精品色网| 免费成年人高清视频| 国产成人8x视频一区二区| 日本一级片在线播放| 中文字幕精品一区 | 色综合久久99| 一个人看的www日本高清视频| 日韩三级精品电影久久久| 在线观看xxx| 久久国内精品一国内精品| 变态调教一区二区三区| 国产精品第七十二页| 91精品啪在线观看国产爱臀| 欧美日本国产精品| 亚洲91视频| 免费大片在线观看| 国产精品伊人色| 人人爽人人爽人人片| 一个色在线综合| 久久午夜鲁丝片| 亚洲国产成人精品女人久久久| 成人性生交大片免费看午夜| 久久久久久久999| 不卡亚洲精品| 韩国成人一区| 欧美国产综合| 成年人在线观看视频免费| 国产91丝袜在线18| 欧美日韩中文字幕视频| 亚洲一二三四在线观看| 一级成人免费视频| 日韩精品在线影院| 欧美xxxx免费虐| 成人高清视频观看www| 蜜桃精品wwwmitaows| 日本久久久网站| 久久精品久久99精品久久| 黄色短视频在线观看| 一区二区三区四区乱视频| 日批视频免费观看| 亚洲男人第一网站| 成人在线高清免费| 91久久久久久久一区二区| 自拍自偷一区二区三区| av无码久久久久久不卡网站| 精品亚洲国产成人av制服丝袜| www.久久av| 欧美日韩国产一区在线| 蜜臀久久精品久久久久| 欧美日本高清一区| 国产一区二区av在线| 中文字幕一区综合| 另类小说视频一区二区| www.黄色在线| 91国在线观看| 噜噜噜在线观看播放视频| 91a在线视频| 奇米777国产一区国产二区| 亚洲色成人www永久在线观看| 国产传媒一区在线| 免费在线观看一级片| 欧美一级夜夜爽| av网站免费在线观看| 91久久久亚洲精品| 亚洲五月综合| 不卡的一区二区| 亚洲一区在线观看免费观看电影高清 | 国产偷倩在线播放| www.成人三级视频| 欧美久久九九| 中文字幕精品视频在线| 午夜精品久久久久久久久| 手机看片一区二区| 欧美亚洲国产成人精品| 偷拍一区二区| 国产熟女高潮视频| 国产拍欧美日韩视频二区| 在线视频播放大全| 日韩性生活视频| 精品国产麻豆| a级黄色小视频| 99re成人在线| 波多野结衣毛片| 久久精品国产v日韩v亚洲| 国产免费av国片精品草莓男男| 欧美 国产 精品| 99久久精品免费看国产| 日韩美一区二区| 日韩资源在线观看| 国模大尺度视频一区二区| 男人添女人下部视频免费| av一区二区三区四区| 伊人久久久久久久久久久久 | 日本免费一区二区六区| 欧美一区二区三区成人久久片 | 色婷婷综合激情| 成人福利在线| 韩国三级hd中文字幕有哪些| 亚洲欧洲国产日本综合| www.国产黄色| 国语自产精品视频在免费| 精品一区免费| 97超碰成人在线| 亚洲一卡二卡三卡四卡| 你懂的视频在线| 国产在线精品自拍| 亚洲精品少妇| 影音先锋男人资源在线观看| 日韩精品一区在线| 欧美日韩精品免费观看视完整| 中国成人在线视频| 成人动漫中文字幕| jizz国产在线| 欧美二区在线播放| 国产亚洲一卡2卡3卡4卡新区| 黄色三级视频在线播放| 欧美日韩在线视频一区二区| 麻豆视频在线观看免费| 久草精品电影| 国模大尺度一区二区三区| 国产精品21p| 欧美精品第一页在线播放| 成人同人动漫免费观看| 日本少妇xxxx| 制服丝袜中文字幕亚洲|