1e41f4b71Sopenharmony_ci# Development Guidelines<a name="EN-US_TOPIC_0000001062229264"></a> 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci## When to Use<a name="section93012287133"></a> 4e41f4b71Sopenharmony_ci 5e41f4b71Sopenharmony_ci- Develop Page abilities for applications that have a UI for human-machine interaction, such as news applications, video players, navigation applications, and payment applications. Most applications we use in our daily lives are such type of applications. 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci- Develop Service abilities for applications so that they can run particular services in the background, such as music playing, computing, and navigation services. 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci- Pack both Page and Service abilities into HarmonyOS Ability Packages \(HAPs\). All applications must be packed into HAP files before being published to the application market. Once published, users can then download the applications from the application market. 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ci## Available APIs<a name="section11821047161319"></a> 12e41f4b71Sopenharmony_ci 13e41f4b71Sopenharmony_ci**Table 1** APIs of the ability management framework 14e41f4b71Sopenharmony_ci 15e41f4b71Sopenharmony_ci<a name="table36761640135514"></a> 16e41f4b71Sopenharmony_ci<table><thead align="left"><tr id="row570215713380"><th class="cellrowborder" valign="top" width="53.849999999999994%" id="mcps1.2.3.1.1"><p id="p1703155733819"><a name="p1703155733819"></a><a name="p1703155733819"></a>Function</p> 17e41f4b71Sopenharmony_ci</th> 18e41f4b71Sopenharmony_ci<th class="cellrowborder" valign="top" width="46.150000000000006%" id="mcps1.2.3.1.2"><p id="p37035579380"><a name="p37035579380"></a><a name="p37035579380"></a>Description</p> 19e41f4b71Sopenharmony_ci</th> 20e41f4b71Sopenharmony_ci</tr> 21e41f4b71Sopenharmony_ci</thead> 22e41f4b71Sopenharmony_ci<tbody><tr id="row39211240205510"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p49215401550"><a name="p49215401550"></a><a name="p49215401550"></a>Want *WantParseUri(const char *uri)</p> 23e41f4b71Sopenharmony_ci</td> 24e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p592164014553"><a name="p592164014553"></a><a name="p592164014553"></a>Converts a specified character string into a <strong id="b123303298245"><a name="b123303298245"></a><a name="b123303298245"></a>Want</strong> object.</p> 25e41f4b71Sopenharmony_ci</td> 26e41f4b71Sopenharmony_ci</tr> 27e41f4b71Sopenharmony_ci<tr id="row192154055512"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p139212040175520"><a name="p139212040175520"></a><a name="p139212040175520"></a>const char *WantToUri(Want want)</p> 28e41f4b71Sopenharmony_ci</td> 29e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p9921640135519"><a name="p9921640135519"></a><a name="p9921640135519"></a>Converts a specified <strong id="b26361419162420"><a name="b26361419162420"></a><a name="b26361419162420"></a>Want</strong> object into a character string.</p> 30e41f4b71Sopenharmony_ci</td> 31e41f4b71Sopenharmony_ci</tr> 32e41f4b71Sopenharmony_ci<tr id="row16921440135520"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1892124075519"><a name="p1892124075519"></a><a name="p1892124075519"></a>void SetWantElement(Want *want, ElementName element);</p> 33e41f4b71Sopenharmony_ci</td> 34e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p129214403555"><a name="p129214403555"></a><a name="p129214403555"></a>Sets the <strong id="b6704163515267"><a name="b6704163515267"></a><a name="b6704163515267"></a>element</strong> variable for a specified <strong id="b1759143810269"><a name="b1759143810269"></a><a name="b1759143810269"></a>Want</strong> object.</p> 35e41f4b71Sopenharmony_ci</td> 36e41f4b71Sopenharmony_ci</tr> 37e41f4b71Sopenharmony_ci<tr id="row3921114018552"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p79210404555"><a name="p79210404555"></a><a name="p79210404555"></a>void SetWantData(Want *want, const void *data, uint16_t dataLength)</p> 38e41f4b71Sopenharmony_ci</td> 39e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p09218402559"><a name="p09218402559"></a><a name="p09218402559"></a>Sets data to carry in a specified <strong id="b1317045311262"><a name="b1317045311262"></a><a name="b1317045311262"></a>Want</strong> object for starting a particular ability.</p> 40e41f4b71Sopenharmony_ci</td> 41e41f4b71Sopenharmony_ci</tr> 42e41f4b71Sopenharmony_ci<tr id="row892124013556"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p4921040155510"><a name="p4921040155510"></a><a name="p4921040155510"></a>bool SetWantSvcIdentity(Want *want, SvcIdentity sid)</p> 43e41f4b71Sopenharmony_ci</td> 44e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p992204013553"><a name="p992204013553"></a><a name="p992204013553"></a>Sets the <strong id="b171231625124319"><a name="b171231625124319"></a><a name="b171231625124319"></a>sid</strong> member variable for a specified <strong id="b11565173054314"><a name="b11565173054314"></a><a name="b11565173054314"></a>Want</strong> object.</p> 45e41f4b71Sopenharmony_ci</td> 46e41f4b71Sopenharmony_ci</tr> 47e41f4b71Sopenharmony_ci<tr id="row99221840135520"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p139221840155519"><a name="p139221840155519"></a><a name="p139221840155519"></a>void ClearWant(Want *want)</p> 48e41f4b71Sopenharmony_ci</td> 49e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p79221440185511"><a name="p79221440185511"></a><a name="p79221440185511"></a>Clears the memory of a specified <strong id="b233731018449"><a name="b233731018449"></a><a name="b233731018449"></a>Want</strong> object.</p> 50e41f4b71Sopenharmony_ci</td> 51e41f4b71Sopenharmony_ci</tr> 52e41f4b71Sopenharmony_ci<tr id="row69221640125519"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1792244017555"><a name="p1792244017555"></a><a name="p1792244017555"></a>void SetMainRoute(const std::string &entry)</p> 53e41f4b71Sopenharmony_ci</td> 54e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p7922174016558"><a name="p7922174016558"></a><a name="p7922174016558"></a>Sets the main route for the ability.</p> 55e41f4b71Sopenharmony_ci</td> 56e41f4b71Sopenharmony_ci</tr> 57e41f4b71Sopenharmony_ci<tr id="row189221840165516"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p3922340125511"><a name="p3922340125511"></a><a name="p3922340125511"></a>void SetUIContent(RootView *rootView)</p> 58e41f4b71Sopenharmony_ci</td> 59e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p9922240175511"><a name="p9922240175511"></a><a name="p9922240175511"></a>Sets the UI layout for the ability.</p> 60e41f4b71Sopenharmony_ci</td> 61e41f4b71Sopenharmony_ci</tr> 62e41f4b71Sopenharmony_ci<tr id="row159226407552"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1292213402552"><a name="p1292213402552"></a><a name="p1292213402552"></a>void OnStart(const Want& intent)</p> 63e41f4b71Sopenharmony_ci</td> 64e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p14922440195515"><a name="p14922440195515"></a><a name="p14922440195515"></a>Called when the ability is started. This callback is invoked to handle transitions between ability lifecycle states.</p> 65e41f4b71Sopenharmony_ci</td> 66e41f4b71Sopenharmony_ci</tr> 67e41f4b71Sopenharmony_ci<tr id="row1392217402551"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1292284065516"><a name="p1292284065516"></a><a name="p1292284065516"></a>void OnStop()</p> 68e41f4b71Sopenharmony_ci</td> 69e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p149223403554"><a name="p149223403554"></a><a name="p149223403554"></a>Called when the ability is being destroyed. This callback is invoked to handle transitions between ability lifecycle states.</p> 70e41f4b71Sopenharmony_ci</td> 71e41f4b71Sopenharmony_ci</tr> 72e41f4b71Sopenharmony_ci<tr id="row169221407555"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p992218400556"><a name="p992218400556"></a><a name="p992218400556"></a>void OnActive(const Want& intent)</p> 73e41f4b71Sopenharmony_ci</td> 74e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p1923440135515"><a name="p1923440135515"></a><a name="p1923440135515"></a>Called when the ability is visible to users. This callback is invoked to handle transitions between ability lifecycle states.</p> 75e41f4b71Sopenharmony_ci</td> 76e41f4b71Sopenharmony_ci</tr> 77e41f4b71Sopenharmony_ci<tr id="row9923640205516"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p19231340185511"><a name="p19231340185511"></a><a name="p19231340185511"></a>void OnInactive()</p> 78e41f4b71Sopenharmony_ci</td> 79e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p992311408556"><a name="p992311408556"></a><a name="p992311408556"></a>Called when the ability is invisible to users. This callback is invoked to handle transitions between ability lifecycle states.</p> 80e41f4b71Sopenharmony_ci</td> 81e41f4b71Sopenharmony_ci</tr> 82e41f4b71Sopenharmony_ci<tr id="row4923154015557"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p99233404556"><a name="p99233404556"></a><a name="p99233404556"></a>void OnBackground()</p> 83e41f4b71Sopenharmony_ci</td> 84e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p79238400554"><a name="p79238400554"></a><a name="p79238400554"></a>Called when the ability is moved to the background. This callback is invoked to handle transitions between ability lifecycle states.</p> 85e41f4b71Sopenharmony_ci</td> 86e41f4b71Sopenharmony_ci</tr> 87e41f4b71Sopenharmony_ci<tr id="row14923144045513"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p692354019558"><a name="p692354019558"></a><a name="p692354019558"></a>const SvcIdentity *OnConnect(const Want &want)</p> 88e41f4b71Sopenharmony_ci</td> 89e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p17923154085512"><a name="p17923154085512"></a><a name="p17923154085512"></a>Called when the Service ability is connected for the first time.</p> 90e41f4b71Sopenharmony_ci</td> 91e41f4b71Sopenharmony_ci</tr> 92e41f4b71Sopenharmony_ci<tr id="row592313405552"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1692312404551"><a name="p1692312404551"></a><a name="p1692312404551"></a>void OnDisconnect(const Want &want);</p> 93e41f4b71Sopenharmony_ci</td> 94e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p892394017551"><a name="p892394017551"></a><a name="p892394017551"></a>Called when all abilities connected to the Service ability are disconnected.</p> 95e41f4b71Sopenharmony_ci</td> 96e41f4b71Sopenharmony_ci</tr> 97e41f4b71Sopenharmony_ci<tr id="row3923194075515"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p5923240175516"><a name="p5923240175516"></a><a name="p5923240175516"></a>void MsgHandle(uint32_t funcId, IpcIo *request, IpcIo *reply);</p> 98e41f4b71Sopenharmony_ci</td> 99e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p2923184055518"><a name="p2923184055518"></a><a name="p2923184055518"></a>Handles a message sent by the client to the Service ability.</p> 100e41f4b71Sopenharmony_ci</td> 101e41f4b71Sopenharmony_ci</tr> 102e41f4b71Sopenharmony_ci<tr id="row15923540155517"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p99231940105514"><a name="p99231940105514"></a><a name="p99231940105514"></a>void Dump(const std::string &extra)</p> 103e41f4b71Sopenharmony_ci</td> 104e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p18924174016554"><a name="p18924174016554"></a><a name="p18924174016554"></a>Prints ability information to the console.</p> 105e41f4b71Sopenharmony_ci</td> 106e41f4b71Sopenharmony_ci</tr> 107e41f4b71Sopenharmony_ci<tr id="row1792414055517"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1592454025513"><a name="p1592454025513"></a><a name="p1592454025513"></a>void Present(AbilitySlice *abilitySlice, const Want &want)</p> 108e41f4b71Sopenharmony_ci</td> 109e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p11924104045517"><a name="p11924104045517"></a><a name="p11924104045517"></a>Presents another ability slice.</p> 110e41f4b71Sopenharmony_ci</td> 111e41f4b71Sopenharmony_ci</tr> 112e41f4b71Sopenharmony_ci<tr id="row15924114012556"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p13924154017551"><a name="p13924154017551"></a><a name="p13924154017551"></a>void Terminate()</p> 113e41f4b71Sopenharmony_ci</td> 114e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p11924104012557"><a name="p11924104012557"></a><a name="p11924104012557"></a>Destroys the ability slice.</p> 115e41f4b71Sopenharmony_ci</td> 116e41f4b71Sopenharmony_ci</tr> 117e41f4b71Sopenharmony_ci<tr id="row2092484010558"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p4924540155515"><a name="p4924540155515"></a><a name="p4924540155515"></a>void SetUIContent(RootView *rootView)</p> 118e41f4b71Sopenharmony_ci</td> 119e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p79241640185514"><a name="p79241640185514"></a><a name="p79241640185514"></a>Sets the UI layout for the host ability of the ability slice.</p> 120e41f4b71Sopenharmony_ci</td> 121e41f4b71Sopenharmony_ci</tr> 122e41f4b71Sopenharmony_ci<tr id="row16924640195518"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p169245407559"><a name="p169245407559"></a><a name="p169245407559"></a>void OnStart(const Want& want)</p> 123e41f4b71Sopenharmony_ci</td> 124e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p492494095517"><a name="p492494095517"></a><a name="p492494095517"></a>Called when the ability slice is started. This callback is invoked to handle transitions between ability slice lifecycle states.</p> 125e41f4b71Sopenharmony_ci</td> 126e41f4b71Sopenharmony_ci</tr> 127e41f4b71Sopenharmony_ci<tr id="row15924154065513"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p159242407559"><a name="p159242407559"></a><a name="p159242407559"></a>void OnStop()</p> 128e41f4b71Sopenharmony_ci</td> 129e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p13924114017556"><a name="p13924114017556"></a><a name="p13924114017556"></a>Called when the ability slice is being destroyed. This callback is invoked to handle transitions between ability slice lifecycle states.</p> 130e41f4b71Sopenharmony_ci</td> 131e41f4b71Sopenharmony_ci</tr> 132e41f4b71Sopenharmony_ci<tr id="row13924154065517"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p292494005513"><a name="p292494005513"></a><a name="p292494005513"></a>void OnActive(const Want& want)</p> 133e41f4b71Sopenharmony_ci</td> 134e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p89256408553"><a name="p89256408553"></a><a name="p89256408553"></a>Called when the ability slice is visible to users. This callback is invoked to handle transitions between ability slice lifecycle states.</p> 135e41f4b71Sopenharmony_ci</td> 136e41f4b71Sopenharmony_ci</tr> 137e41f4b71Sopenharmony_ci<tr id="row1925540125515"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p13925114015514"><a name="p13925114015514"></a><a name="p13925114015514"></a>void OnInactive()</p> 138e41f4b71Sopenharmony_ci</td> 139e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p892534025515"><a name="p892534025515"></a><a name="p892534025515"></a>Called when the ability slice is invisible to users. This callback is invoked to handle transitions between ability slice lifecycle states.</p> 140e41f4b71Sopenharmony_ci</td> 141e41f4b71Sopenharmony_ci</tr> 142e41f4b71Sopenharmony_ci<tr id="row692519401558"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1792515408558"><a name="p1792515408558"></a><a name="p1792515408558"></a>void OnBackground()</p> 143e41f4b71Sopenharmony_ci</td> 144e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p292554013551"><a name="p292554013551"></a><a name="p292554013551"></a>Called when the ability slice is moved to the background. This callback is invoked to handle transitions between ability slice lifecycle states.</p> 145e41f4b71Sopenharmony_ci</td> 146e41f4b71Sopenharmony_ci</tr> 147e41f4b71Sopenharmony_ci<tr id="row129251040115515"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p0925174011553"><a name="p0925174011553"></a><a name="p0925174011553"></a>int StartAbility(const Want &want)</p> 148e41f4b71Sopenharmony_ci</td> 149e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p129251408557"><a name="p129251408557"></a><a name="p129251408557"></a>Starts an ability based on the specified <strong id="b3667652155017"><a name="b3667652155017"></a><a name="b3667652155017"></a>Want</strong> information.</p> 150e41f4b71Sopenharmony_ci</td> 151e41f4b71Sopenharmony_ci</tr> 152e41f4b71Sopenharmony_ci<tr id="row3925940195519"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p19251440135512"><a name="p19251440135512"></a><a name="p19251440135512"></a>int StopAbility(const Want &want)</p> 153e41f4b71Sopenharmony_ci</td> 154e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p19925174035510"><a name="p19925174035510"></a><a name="p19925174035510"></a>Stops a Service ability based on the specified <strong id="b1176241795114"><a name="b1176241795114"></a><a name="b1176241795114"></a>Want</strong> information.</p> 155e41f4b71Sopenharmony_ci</td> 156e41f4b71Sopenharmony_ci</tr> 157e41f4b71Sopenharmony_ci<tr id="row14925164055520"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p14925114015553"><a name="p14925114015553"></a><a name="p14925114015553"></a>int TerminateAbility()</p> 158e41f4b71Sopenharmony_ci</td> 159e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p39254405557"><a name="p39254405557"></a><a name="p39254405557"></a>Destroys the ability.</p> 160e41f4b71Sopenharmony_ci</td> 161e41f4b71Sopenharmony_ci</tr> 162e41f4b71Sopenharmony_ci<tr id="row19925940115515"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p892584015559"><a name="p892584015559"></a><a name="p892584015559"></a>int ConnectAbility(const Want &want, const IAbilityConnection &conn, void *data);</p> 163e41f4b71Sopenharmony_ci</td> 164e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p4926640165513"><a name="p4926640165513"></a><a name="p4926640165513"></a>Connects to a <strong id="b10891169125217"><a name="b10891169125217"></a><a name="b10891169125217"></a>Service</strong> ability based on the specified <strong id="b184091115165216"><a name="b184091115165216"></a><a name="b184091115165216"></a>Want</strong> information.</p> 165e41f4b71Sopenharmony_ci</td> 166e41f4b71Sopenharmony_ci</tr> 167e41f4b71Sopenharmony_ci<tr id="row10926540155513"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p119267409559"><a name="p119267409559"></a><a name="p119267409559"></a>int DisconnectAbility(const IAbilityConnection &conn)</p> 168e41f4b71Sopenharmony_ci</td> 169e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p592644085512"><a name="p592644085512"></a><a name="p592644085512"></a>Disconnects from a <strong id="b37531635205214"><a name="b37531635205214"></a><a name="b37531635205214"></a>Service</strong> ability.</p> 170e41f4b71Sopenharmony_ci</td> 171e41f4b71Sopenharmony_ci</tr> 172e41f4b71Sopenharmony_ci<tr id="row11926340145516"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p892614035513"><a name="p892614035513"></a><a name="p892614035513"></a>const char *GetBundleName()</p> 173e41f4b71Sopenharmony_ci</td> 174e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p99261040105511"><a name="p99261040105511"></a><a name="p99261040105511"></a>Obtains the bundle name of the application to which the ability belongs.</p> 175e41f4b71Sopenharmony_ci</td> 176e41f4b71Sopenharmony_ci</tr> 177e41f4b71Sopenharmony_ci<tr id="row7926440125519"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p4926114065519"><a name="p4926114065519"></a><a name="p4926114065519"></a>const char *GetSrcPath()</p> 178e41f4b71Sopenharmony_ci</td> 179e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p4926194055516"><a name="p4926194055516"></a><a name="p4926194055516"></a>Obtains the source code path of the ability.</p> 180e41f4b71Sopenharmony_ci</td> 181e41f4b71Sopenharmony_ci</tr> 182e41f4b71Sopenharmony_ci<tr id="row29261840115519"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1992604045519"><a name="p1992604045519"></a><a name="p1992604045519"></a>const char *GetDataPath()</p> 183e41f4b71Sopenharmony_ci</td> 184e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p109268403551"><a name="p109268403551"></a><a name="p109268403551"></a>Obtains the data path of the ability.</p> 185e41f4b71Sopenharmony_ci</td> 186e41f4b71Sopenharmony_ci</tr> 187e41f4b71Sopenharmony_ci<tr id="row29261940195516"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p159267407555"><a name="p159267407555"></a><a name="p159267407555"></a>int StartAbility(const Want *want)</p> 188e41f4b71Sopenharmony_ci</td> 189e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p1340210145179"><a name="p1340210145179"></a><a name="p1340210145179"></a>Starts an Ability. This function does not need to be used in applications developed based on <strong id="b12960101603119"><a name="b12960101603119"></a><a name="b12960101603119"></a>Ability</strong>.</p> 190e41f4b71Sopenharmony_ci</td> 191e41f4b71Sopenharmony_ci</tr> 192e41f4b71Sopenharmony_ci<tr id="row16926240155514"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1792617404558"><a name="p1792617404558"></a><a name="p1792617404558"></a>int ConnectAbility(const Want *want, const IAbilityConnection *conn, void *data);</p> 193e41f4b71Sopenharmony_ci</td> 194e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p1092612181812"><a name="p1092612181812"></a><a name="p1092612181812"></a>Connects to a Service ability based on the specified <strong id="b71516265816"><a name="b71516265816"></a><a name="b71516265816"></a>Want</strong> information. This function does not need to be used in applications developed based on <strong id="b12877235205716"><a name="b12877235205716"></a><a name="b12877235205716"></a>Ability</strong>.</p> 195e41f4b71Sopenharmony_ci</td> 196e41f4b71Sopenharmony_ci</tr> 197e41f4b71Sopenharmony_ci<tr id="row5927164010552"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p49271540165510"><a name="p49271540165510"></a><a name="p49271540165510"></a>int DisconnectAbility(const IAbilityConnection *conn);</p> 198e41f4b71Sopenharmony_ci</td> 199e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p1296152820189"><a name="p1296152820189"></a><a name="p1296152820189"></a>Disconnects from a Service ability. This function does not need to be used in applications developed based on <strong id="b1866210445818"><a name="b1866210445818"></a><a name="b1866210445818"></a>Ability</strong>.</p> 200e41f4b71Sopenharmony_ci</td> 201e41f4b71Sopenharmony_ci</tr> 202e41f4b71Sopenharmony_ci<tr id="row89271040135517"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p13927194011558"><a name="p13927194011558"></a><a name="p13927194011558"></a>int StopAbility(const Want *want)</p> 203e41f4b71Sopenharmony_ci</td> 204e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p7699548131819"><a name="p7699548131819"></a><a name="p7699548131819"></a>Stops a Service ability based on the specified <strong id="b53334211588"><a name="b53334211588"></a><a name="b53334211588"></a>Want</strong> information. This function does not need to be used in applications developed based on <strong id="b1466212716581"><a name="b1466212716581"></a><a name="b1466212716581"></a>Ability</strong>.</p> 205e41f4b71Sopenharmony_ci</td> 206e41f4b71Sopenharmony_ci</tr> 207e41f4b71Sopenharmony_ci<tr id="row1992764065516"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p192716406556"><a name="p192716406556"></a><a name="p192716406556"></a>void (*OnAbilityConnectDone)(ElementName *elementName, SvcIdentity *serviceSid, int resultCode, void *data)</p> 208e41f4b71Sopenharmony_ci</td> 209e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p0927940195510"><a name="p0927940195510"></a><a name="p0927940195510"></a>Called when a client is connected to a Service ability.</p> 210e41f4b71Sopenharmony_ci</td> 211e41f4b71Sopenharmony_ci</tr> 212e41f4b71Sopenharmony_ci<tr id="row7927134010559"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p692764095510"><a name="p692764095510"></a><a name="p692764095510"></a>void (*OnAbilityDisconnectDone)(ElementName *elementName, int resultCode, void *data)</p> 213e41f4b71Sopenharmony_ci</td> 214e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p18927124035516"><a name="p18927124035516"></a><a name="p18927124035516"></a>Called after all connections to a Service ability are disconnected.</p> 215e41f4b71Sopenharmony_ci</td> 216e41f4b71Sopenharmony_ci</tr> 217e41f4b71Sopenharmony_ci<tr id="row692784020556"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p17927104010557"><a name="p17927104010557"></a><a name="p17927104010557"></a>void PostTask(const Task& task)</p> 218e41f4b71Sopenharmony_ci</td> 219e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p13927940105516"><a name="p13927940105516"></a><a name="p13927940105516"></a>Posts a task to an asynchronous thread.</p> 220e41f4b71Sopenharmony_ci</td> 221e41f4b71Sopenharmony_ci</tr> 222e41f4b71Sopenharmony_ci<tr id="row392784013552"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1092794014555"><a name="p1092794014555"></a><a name="p1092794014555"></a>void PostQuit()</p> 223e41f4b71Sopenharmony_ci</td> 224e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p19281940185510"><a name="p19281940185510"></a><a name="p19281940185510"></a>Quits the event loop of the current thread.</p> 225e41f4b71Sopenharmony_ci</td> 226e41f4b71Sopenharmony_ci</tr> 227e41f4b71Sopenharmony_ci<tr id="row2928140145519"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p292813401555"><a name="p292813401555"></a><a name="p292813401555"></a>static AbilityEventHandler* GetCurrentHandler()</p> 228e41f4b71Sopenharmony_ci</td> 229e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p9928154012554"><a name="p9928154012554"></a><a name="p9928154012554"></a>Obtains the event handler of the current thread.</p> 230e41f4b71Sopenharmony_ci</td> 231e41f4b71Sopenharmony_ci</tr> 232e41f4b71Sopenharmony_ci<tr id="row15928174035513"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1692824017551"><a name="p1692824017551"></a><a name="p1692824017551"></a>void Run()</p> 233e41f4b71Sopenharmony_ci</td> 234e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p592820401558"><a name="p592820401558"></a><a name="p592820401558"></a>Starts running the event loop of the current thread.</p> 235e41f4b71Sopenharmony_ci</td> 236e41f4b71Sopenharmony_ci</tr> 237e41f4b71Sopenharmony_ci<tr id="row15928174013554"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p17928440125516"><a name="p17928440125516"></a><a name="p17928440125516"></a>#define REGISTER_AA(className)</p> 238e41f4b71Sopenharmony_ci</td> 239e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p1892817404554"><a name="p1892817404554"></a><a name="p1892817404554"></a>Registers the class name of an <strong id="b102356594597"><a name="b102356594597"></a><a name="b102356594597"></a>Ability</strong> child class.</p> 240e41f4b71Sopenharmony_ci</td> 241e41f4b71Sopenharmony_ci</tr> 242e41f4b71Sopenharmony_ci<tr id="row17928640135519"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p199281640125520"><a name="p199281640125520"></a><a name="p199281640125520"></a>#define REGISTER_AS(className)</p> 243e41f4b71Sopenharmony_ci</td> 244e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p1792811409556"><a name="p1792811409556"></a><a name="p1792811409556"></a>Registers the class name of an <strong id="b691819710011"><a name="b691819710011"></a><a name="b691819710011"></a>AbilitySlice</strong> child class.</p> 245e41f4b71Sopenharmony_ci</td> 246e41f4b71Sopenharmony_ci</tr> 247e41f4b71Sopenharmony_ci</tbody> 248e41f4b71Sopenharmony_ci</table> 249e41f4b71Sopenharmony_ci 250e41f4b71Sopenharmony_ci## How to Develop<a name="section10514141679"></a> 251e41f4b71Sopenharmony_ci 252e41f4b71Sopenharmony_ci### Creating a Service Ability<a name="section19921154214315"></a> 253e41f4b71Sopenharmony_ci 254e41f4b71Sopenharmony_ci1. Create the **MyServiceAbility** child class from **Ability** in **my\_service\_ability.h**. 255e41f4b71Sopenharmony_ci 256e41f4b71Sopenharmony_ci ``` 257e41f4b71Sopenharmony_ci class MyServiceAbility: public Ability { 258e41f4b71Sopenharmony_ci protected: 259e41f4b71Sopenharmony_ci void OnStart(const Want& want); 260e41f4b71Sopenharmony_ci const SvcIdentity *OnConnect(const Want &want) override; 261e41f4b71Sopenharmony_ci void MsgHandle(uint32_t funcId, IpcIo *request, IpcIo *reply) override; 262e41f4b71Sopenharmony_ci }; 263e41f4b71Sopenharmony_ci ``` 264e41f4b71Sopenharmony_ci 265e41f4b71Sopenharmony_ci2. Call the **REGISTER\_AA** macro to register the **ServiceAbility** class with the application framework so that the framework can instantiate the **MyServiceAbility** class you have created. 266e41f4b71Sopenharmony_ci 267e41f4b71Sopenharmony_ci ``` 268e41f4b71Sopenharmony_ci #include "my_service_ability.h" 269e41f4b71Sopenharmony_ci 270e41f4b71Sopenharmony_ci REGISTER_AA(ServiceAbility) 271e41f4b71Sopenharmony_ci 272e41f4b71Sopenharmony_ci void MyServiceAbility::OnStart(const Want& want) 273e41f4b71Sopenharmony_ci { 274e41f4b71Sopenharmony_ci printf("ServiceAbility::OnStart\n"); 275e41f4b71Sopenharmony_ci Ability::OnStart(want); 276e41f4b71Sopenharmony_ci } 277e41f4b71Sopenharmony_ci 278e41f4b71Sopenharmony_ci const SvcIdentity *MyServiceAbility::OnConnect(const Want &want) 279e41f4b71Sopenharmony_ci { 280e41f4b71Sopenharmony_ci printf("ServiceAbility::OnConnect\n"); 281e41f4b71Sopenharmony_ci return Ability::OnConnect(want); 282e41f4b71Sopenharmony_ci } 283e41f4b71Sopenharmony_ci 284e41f4b71Sopenharmony_ci void MyServiceAbility::MsgHandle(uint32_t funcId, IpcIo *request, IpcIo *reply) 285e41f4b71Sopenharmony_ci { 286e41f4b71Sopenharmony_ci printf("ServiceAbility::MsgHandle, funcId is %u\n", funcId); 287e41f4b71Sopenharmony_ci int result = 0; 288e41f4b71Sopenharmony_ci if (funcId == 0) { 289e41f4b71Sopenharmony_ci result = IpcIoPopInt32(request) + IpcIoPopInt32(request); 290e41f4b71Sopenharmony_ci } 291e41f4b71Sopenharmony_ci // push data 292e41f4b71Sopenharmony_ci IpcIoPushInt32(reply, result); 293e41f4b71Sopenharmony_ci } 294e41f4b71Sopenharmony_ci ``` 295e41f4b71Sopenharmony_ci 296e41f4b71Sopenharmony_ci3. Override the following lifecycle callbacks for Service abilities to implement your own logic for your Service ability. When overriding a lifecycle callback, you must call the corresponding function from the parent class. 297e41f4b71Sopenharmony_ci - OnStart\(\) 298e41f4b71Sopenharmony_ci 299e41f4b71Sopenharmony_ci This callback is invoked when a Service ability is being created to perform Service ability initialization operations that take a short time. This callback is invoked only once in the entire lifecycle of a Service ability. 300e41f4b71Sopenharmony_ci 301e41f4b71Sopenharmony_ci ``` 302e41f4b71Sopenharmony_ci void MyServiceAbility::OnStart(const Want& want) 303e41f4b71Sopenharmony_ci { 304e41f4b71Sopenharmony_ci printf("ServiceAbility::OnStart\n"); 305e41f4b71Sopenharmony_ci Ability::OnStart(want); 306e41f4b71Sopenharmony_ci } 307e41f4b71Sopenharmony_ci ``` 308e41f4b71Sopenharmony_ci 309e41f4b71Sopenharmony_ci - OnConnect\(\) 310e41f4b71Sopenharmony_ci 311e41f4b71Sopenharmony_ci This callback is invoked when another ability is connected to the Service ability. This callback returns an **SvcIdentity** object for the other ability to interact with the Service ability. 312e41f4b71Sopenharmony_ci 313e41f4b71Sopenharmony_ci ``` 314e41f4b71Sopenharmony_ci const SvcIdentity *MyServiceAbility::OnConnect(const Want &want) 315e41f4b71Sopenharmony_ci { 316e41f4b71Sopenharmony_ci printf("ServiceAbility::OnConnect\n"); 317e41f4b71Sopenharmony_ci return Ability::OnConnect(want); 318e41f4b71Sopenharmony_ci } 319e41f4b71Sopenharmony_ci ``` 320e41f4b71Sopenharmony_ci 321e41f4b71Sopenharmony_ci - OnDisconnect\(\) 322e41f4b71Sopenharmony_ci 323e41f4b71Sopenharmony_ci This callback is invoked when another ability is disconnected from the Service ability. 324e41f4b71Sopenharmony_ci 325e41f4b71Sopenharmony_ci - OnStop\(\) 326e41f4b71Sopenharmony_ci 327e41f4b71Sopenharmony_ci This callback is invoked when a Service ability is destroyed. You should override this callback for your Service ability to clear its resources, such as threads and registered listeners. 328e41f4b71Sopenharmony_ci 329e41f4b71Sopenharmony_ci4. Override the message handling function. 330e41f4b71Sopenharmony_ci 331e41f4b71Sopenharmony_ci The **MsgHandle** function is used by Service abilities to handle messages sent from clients. **funcId** indicates the type of the message sent from the client, and **request** indicates the pointer to the serialized request parameters sent from the client. If you want to send the result back after the message is handled, serialize the result and write it into **reply**. 332e41f4b71Sopenharmony_ci 333e41f4b71Sopenharmony_ci ``` 334e41f4b71Sopenharmony_ci void ServiceAbility::MsgHandle(uint32_t funcId, IpcIo *request, IpcIo *reply) 335e41f4b71Sopenharmony_ci { 336e41f4b71Sopenharmony_ci printf("ServiceAbility::MsgHandle, funcId is %d\n", funcId); 337e41f4b71Sopenharmony_ci int result = 0; 338e41f4b71Sopenharmony_ci if (funcId == PLUS) { 339e41f4b71Sopenharmony_ci result = IpcIoPopInt32(request) + IpcIoPopInt32(request); 340e41f4b71Sopenharmony_ci } 341e41f4b71Sopenharmony_ci // push data 342e41f4b71Sopenharmony_ci IpcIoPushInt32(reply, result); 343e41f4b71Sopenharmony_ci } 344e41f4b71Sopenharmony_ci ``` 345e41f4b71Sopenharmony_ci 346e41f4b71Sopenharmony_ci5. Register a Service ability. 347e41f4b71Sopenharmony_ci 348e41f4b71Sopenharmony_ci Declare your Service ability in the **config.json** file by setting its **type** attribute to **service**. 349e41f4b71Sopenharmony_ci 350e41f4b71Sopenharmony_ci ``` 351e41f4b71Sopenharmony_ci "abilities": [{ 352e41f4b71Sopenharmony_ci "name": "ServiceAbility", 353e41f4b71Sopenharmony_ci "icon": "res/drawable/phone.png", 354e41f4b71Sopenharmony_ci "label": "test app 2", 355e41f4b71Sopenharmony_ci "launchType": "standard", 356e41f4b71Sopenharmony_ci "type": "service", 357e41f4b71Sopenharmony_ci "visible": true 358e41f4b71Sopenharmony_ci } 359e41f4b71Sopenharmony_ci ] 360e41f4b71Sopenharmony_ci ``` 361e41f4b71Sopenharmony_ci 362e41f4b71Sopenharmony_ci6. Start a Service ability. 363e41f4b71Sopenharmony_ci - The **Ability** class provides the **StartAbility\(\)** function to start another ability. You can pass a **Want** object to this function to start a Service ability. 364e41f4b71Sopenharmony_ci 365e41f4b71Sopenharmony_ci You can use the **SetWantElement\(\)** function provided in the **AbilityKit** to set information about the target Service ability to start. The **element** parameter of the **SetWantElement\(\)** function indicates the **ElementName** structure that contains the bundle name and target ability name required for starting an ability. 366e41f4b71Sopenharmony_ci 367e41f4b71Sopenharmony_ci ``` 368e41f4b71Sopenharmony_ci { 369e41f4b71Sopenharmony_ci Want want = { nullptr }; 370e41f4b71Sopenharmony_ci ElementName element = { nullptr }; 371e41f4b71Sopenharmony_ci SetElementBundleName(&element, "com.company.appname"); 372e41f4b71Sopenharmony_ci SetElementAbilityName(&element, "ServiceAbility"); 373e41f4b71Sopenharmony_ci SetWantElement(&want, element); 374e41f4b71Sopenharmony_ci StartAbility(want); 375e41f4b71Sopenharmony_ci ClearElement(&element); 376e41f4b71Sopenharmony_ci ClearWant(&want); 377e41f4b71Sopenharmony_ci } 378e41f4b71Sopenharmony_ci ``` 379e41f4b71Sopenharmony_ci 380e41f4b71Sopenharmony_ci The **StartAbility\(\)** function is executed immediately. If the Service ability is not running while the function is called, the system invokes **OnStart\(\)** first. 381e41f4b71Sopenharmony_ci 382e41f4b71Sopenharmony_ci - Stops a Service ability. 383e41f4b71Sopenharmony_ci 384e41f4b71Sopenharmony_ci Once created, the Service ability keeps running in the background. You can call **StopAbility\(\)** to stop the Service ability. 385e41f4b71Sopenharmony_ci 386e41f4b71Sopenharmony_ci7. Connect to a Service ability. 387e41f4b71Sopenharmony_ci - If you need to connect a Service ability to a Page ability or to a Service ability in another application, you should first create a Service ability for connection. A Service ability allows other abilities to connect to it through **ConnectAbility\(\)** by passing a **Want** object that contains information about the target Service ability to the function. You can implement callbacks in **IAbilityConnection** to be invoked when a Service ability is connected or disconnected. The **OnAbilityConnectDone\(\)** callback is invoked when an ability is connected, and **OnAbilityDisconnectDone\(\)** is invoked when an ability is disconnected. 388e41f4b71Sopenharmony_ci 389e41f4b71Sopenharmony_ci ``` 390e41f4b71Sopenharmony_ci { 391e41f4b71Sopenharmony_ci // Create an IAbilityConnection object and implement the two callbacks. 392e41f4b71Sopenharmony_ci IAbilityConnection abilityConnection = new IAbilityConnection(); 393e41f4b71Sopenharmony_ci abilityConnection->OnAbilityConnectDone = OnAbilityConnectDone; 394e41f4b71Sopenharmony_ci abilityConnection->OnAbilityDisconnectDone = OnAbilityDisconnectDone; 395e41f4b71Sopenharmony_ci 396e41f4b71Sopenharmony_ci void OnAbilityConnectDone(ElementName *elementName, SvcIdentity *serviceSid, 397e41f4b71Sopenharmony_ci int resultCode, void *data) 398e41f4b71Sopenharmony_ci { 399e41f4b71Sopenharmony_ci if (resultCode != 0) { 400e41f4b71Sopenharmony_ci return; 401e41f4b71Sopenharmony_ci } 402e41f4b71Sopenharmony_ci // Push data. 403e41f4b71Sopenharmony_ci IpcIo request; 404e41f4b71Sopenharmony_ci char dataBuffer[IPC_IO_DATA_MAX]; 405e41f4b71Sopenharmony_ci IpcIoInit(&request, dataBuffer, IPC_IO_DATA_MAX, 0); 406e41f4b71Sopenharmony_ci IpcIoPushInt32(&request, 10); 407e41f4b71Sopenharmony_ci IpcIoPushInt32(&request, 6); 408e41f4b71Sopenharmony_ci 409e41f4b71Sopenharmony_ci // Send and receive the reply. 410e41f4b71Sopenharmony_ci IpcIo reply; 411e41f4b71Sopenharmony_ci uintptr_t ptr = 0; 412e41f4b71Sopenharmony_ci if (Transact(nullptr, *serviceSid, 0, &request, &reply, 413e41f4b71Sopenharmony_ci LITEIPC_FLAG_DEFAULT, &ptr) != LITEIPC_OK) { 414e41f4b71Sopenharmony_ci printf("transact error\n"); 415e41f4b71Sopenharmony_ci return; 416e41f4b71Sopenharmony_ci } 417e41f4b71Sopenharmony_ci int result = IpcIoPopInt32(&reply); 418e41f4b71Sopenharmony_ci printf("execute add method, result is %d\n", result); 419e41f4b71Sopenharmony_ci if (ptr != 0) { 420e41f4b71Sopenharmony_ci FreeBuffer(nullptr, reinterpret_cast<void *>(ptr)); 421e41f4b71Sopenharmony_ci } 422e41f4b71Sopenharmony_ci } 423e41f4b71Sopenharmony_ci 424e41f4b71Sopenharmony_ci void OnAbilityDisconnectDone(ElementName *elementName, 425e41f4b71Sopenharmony_ci int resultCode, void *data) 426e41f4b71Sopenharmony_ci { 427e41f4b71Sopenharmony_ci printf("elementName is %s, %s\n", 428e41f4b71Sopenharmony_ci elementName->bundleName, elementName->abilityName); 429e41f4b71Sopenharmony_ci } 430e41f4b71Sopenharmony_ci } 431e41f4b71Sopenharmony_ci ``` 432e41f4b71Sopenharmony_ci 433e41f4b71Sopenharmony_ci - The following sample code snippet shows how to initiate ability connection and disconnection: 434e41f4b71Sopenharmony_ci 435e41f4b71Sopenharmony_ci ``` 436e41f4b71Sopenharmony_ci { 437e41f4b71Sopenharmony_ci // Connect an ability to a specified Service ability. 438e41f4b71Sopenharmony_ci Want want = { nullptr }; 439e41f4b71Sopenharmony_ci ElementName element = { nullptr }; 440e41f4b71Sopenharmony_ci SetElementBundleName(&element, "com.company.appname"); 441e41f4b71Sopenharmony_ci SetElementAbilityName(&element, "ServiceAbility"); 442e41f4b71Sopenharmony_ci SetWantElement(&want, element); 443e41f4b71Sopenharmony_ci ConnectAbility(want, *abilityConnection, this); 444e41f4b71Sopenharmony_ci 445e41f4b71Sopenharmony_ci // Disconnect from a Service ability. 446e41f4b71Sopenharmony_ci DisconnectAbility(*abilityConnection); 447e41f4b71Sopenharmony_ci } 448e41f4b71Sopenharmony_ci ``` 449e41f4b71Sopenharmony_ci 450e41f4b71Sopenharmony_ci 451e41f4b71Sopenharmony_ci 452e41f4b71Sopenharmony_ci### Development Guidelines on Bundle Management<a name="section1724016743217"></a> 453e41f4b71Sopenharmony_ci 454e41f4b71Sopenharmony_ci**Installing an Application** 455e41f4b71Sopenharmony_ci 456e41f4b71Sopenharmony_ciThe installation API can only be used by built-in system applications. Applications can be installed in either of the following paths: 457e41f4b71Sopenharmony_ci 458e41f4b71Sopenharmony_ci- Default installation directory **/storage/app/** in the system 459e41f4b71Sopenharmony_ci- Particular directory on the external storage, for example, a microSD card 460e41f4b71Sopenharmony_ci 461e41f4b71Sopenharmony_ciYou can specify the installation path when creating an **InstallParam** instance. To install the application in the **/storage/app/** directory, set the **installLocation** member variable in the **InstallParam** instance to **INSTALL\_LOCATION\_INTERNAL\_ONLY**. To install the application in the **/sdcard/app/** directory of the external storage, set **installLocation** to **INSTALL\_LOCATION\_PREFER\_EXTERNAL**. The application installation process is asynchronous, and a semaphore-like mechanism is required to ensure that the installation callback can be executed. 462e41f4b71Sopenharmony_ci 463e41f4b71Sopenharmony_ciThe procedure for installing an application is as follows \(the system directory is used as an example\): 464e41f4b71Sopenharmony_ci 465e41f4b71Sopenharmony_ci1. Place the signed HAP file in a specified directory. 466e41f4b71Sopenharmony_ci2. Create an **InstallParam** instance and define the semaphore. 467e41f4b71Sopenharmony_ci 468e41f4b71Sopenharmony_ci ``` 469e41f4b71Sopenharmony_ci InstallParam installParam = { 470e41f4b71Sopenharmony_ci .installLocation = INSTALL_LOCATION_INTERNAL_ONLY, // Install the application in the system directory. 471e41f4b71Sopenharmony_ci .keepData = false 472e41f4b71Sopenharmony_ci }; 473e41f4b71Sopenharmony_ci static sem_t g_sem; 474e41f4b71Sopenharmony_ci ``` 475e41f4b71Sopenharmony_ci 476e41f4b71Sopenharmony_ci3. Define the callback function. 477e41f4b71Sopenharmony_ci 478e41f4b71Sopenharmony_ci ``` 479e41f4b71Sopenharmony_ci static void InstallCallback(const uint8_t resultCode, const void *resultMessage) 480e41f4b71Sopenharmony_ci { 481e41f4b71Sopenharmony_ci std::string strMessage = reinterpret_cast<const char *>(resultMessage); 482e41f4b71Sopenharmony_ci if (!strMessage.empty()) { 483e41f4b71Sopenharmony_ci printf("install resultMessage is %s, %d\n", strMessage.c_str(),resultCode); 484e41f4b71Sopenharmony_ci } 485e41f4b71Sopenharmony_ci sem_post(&g_sem); 486e41f4b71Sopenharmony_ci } 487e41f4b71Sopenharmony_ci ``` 488e41f4b71Sopenharmony_ci 489e41f4b71Sopenharmony_ci4. Call the **Install** function. 490e41f4b71Sopenharmony_ci 491e41f4b71Sopenharmony_ci ``` 492e41f4b71Sopenharmony_ci const uint32_t WAIT_TIMEOUT = 30; 493e41f4b71Sopenharmony_ci sem_init(&g_sem, 0, 0); 494e41f4b71Sopenharmony_ci std::string installPath = "/storage/bundle/demo.hap"; // Specify the path where the HAP file is stored. 495e41f4b71Sopenharmony_ci bool result = Install(installPath.c_str(), &installParam, InstallCallback); 496e41f4b71Sopenharmony_ci struct timespec ts = {}; 497e41f4b71Sopenharmony_ci clock_gettime(CLOCK_REALTIME, &ts); 498e41f4b71Sopenharmony_ci ts.tv_sec += WAIT_TIMEOUT; // Release the semaphore upon timeout. 499e41f4b71Sopenharmony_ci sem_timedwait(&g_sem, &ts); 500e41f4b71Sopenharmony_ci ``` 501e41f4b71Sopenharmony_ci 502e41f4b71Sopenharmony_ci 503e41f4b71Sopenharmony_ci**Uninstalling an Application** 504e41f4b71Sopenharmony_ci 505e41f4b71Sopenharmony_ciWhen uninstalling an application, you can specify whether to retain application data using the **keepData** member variable in the created **InstallParam** instance. If **keepData** is set to **true**, the application data will be retained after the application is uninstalled. If the variable is set to **false**, the application data will be removed during application installation. 506e41f4b71Sopenharmony_ci 507e41f4b71Sopenharmony_ci1. Create an **InstallParam** instance and define the semaphore. 508e41f4b71Sopenharmony_ci 509e41f4b71Sopenharmony_ci ``` 510e41f4b71Sopenharmony_ci static sem_t g_sem; 511e41f4b71Sopenharmony_ci InstallParam installParam = { 512e41f4b71Sopenharmony_ci .installLocation = 1, 513e41f4b71Sopenharmony_ci .keepData = false // Remove application data. 514e41f4b71Sopenharmony_ci }; 515e41f4b71Sopenharmony_ci ``` 516e41f4b71Sopenharmony_ci 517e41f4b71Sopenharmony_ci2. Define the callback function. 518e41f4b71Sopenharmony_ci 519e41f4b71Sopenharmony_ci ``` 520e41f4b71Sopenharmony_ci static void UninstallCallback(const uint8_t resultCode, const void *resultMessage) 521e41f4b71Sopenharmony_ci { 522e41f4b71Sopenharmony_ci std::string strMessage = reinterpret_cast<const char *>(resultMessage); 523e41f4b71Sopenharmony_ci if (!strMessage.empty()) { 524e41f4b71Sopenharmony_ci printf("uninstall resultMessage is %s\n", strMessage.c_str()); 525e41f4b71Sopenharmony_ci g_resultMessage = strMessage; 526e41f4b71Sopenharmony_ci } 527e41f4b71Sopenharmony_ci g_resultCode = resultCode; 528e41f4b71Sopenharmony_ci sem_post(&g_sem); 529e41f4b71Sopenharmony_ci } 530e41f4b71Sopenharmony_ci ``` 531e41f4b71Sopenharmony_ci 532e41f4b71Sopenharmony_ci3. Call the **Uninstall** function. 533e41f4b71Sopenharmony_ci 534e41f4b71Sopenharmony_ci ``` 535e41f4b71Sopenharmony_ci sem_init(&g_sem, 0, 0); 536e41f4b71Sopenharmony_ci const uint32_t WAIT_TIMEOUT = 30; 537e41f4b71Sopenharmony_ci std::string BUNDLE_NAME = "com.example.demo"; // Bundle name of the application to be uninstalled 538e41f4b71Sopenharmony_ci Uninstall(BUNDLE_NAME.c_str(), &installParam, UninstallCallback); 539e41f4b71Sopenharmony_ci struct timespec ts = {}; 540e41f4b71Sopenharmony_ci clock_gettime(CLOCK_REALTIME, &ts); 541e41f4b71Sopenharmony_ci ts.tv_sec += WAIT_TIMEOUT; 542e41f4b71Sopenharmony_ci sem_timedwait(&g_sem, &ts); 543e41f4b71Sopenharmony_ci ``` 544e41f4b71Sopenharmony_ci 545e41f4b71Sopenharmony_ci 546e41f4b71Sopenharmony_ci**Querying Bundle Information About an Installed Application** 547e41f4b71Sopenharmony_ci 548e41f4b71Sopenharmony_ciYou can use the **GetBundleInfo** function provided by **BundleManager** to query the bundle information about installed applications in the system. 549e41f4b71Sopenharmony_ci 550e41f4b71Sopenharmony_ci1. Create and initialize a **BundleInfo** object. 551e41f4b71Sopenharmony_ci 552e41f4b71Sopenharmony_ci ``` 553e41f4b71Sopenharmony_ci BundleInfo bundleInfo; 554e41f4b71Sopenharmony_ci (void) memset_s(&bundleInfo, sizeof(BundleInfo), 0, sizeof(BundleInfo)); 555e41f4b71Sopenharmony_ci ``` 556e41f4b71Sopenharmony_ci 557e41f4b71Sopenharmony_ci2. Call **GetBundleInfo** to obtain bundle information about a specified application. The **bundleName** parameter indicates the pointer to the application bundle name, and the **flags** parameter specifies whether the obtained **BundleInfo** object can contain **AbilityInfo**. 558e41f4b71Sopenharmony_ci 559e41f4b71Sopenharmony_ci ``` 560e41f4b71Sopenharmony_ci std::string BUNDLE_NAME = "com.example.demo"; 561e41f4b71Sopenharmony_ci uint8_t ret = GetBundleInfo(BUNDLE_NAME.c_str(), 1, &bundleInfo); // When flags is set to 1, the obtained BundleInfo object contains AbilityInfo. 562e41f4b71Sopenharmony_ci ``` 563e41f4b71Sopenharmony_ci 564e41f4b71Sopenharmony_ci3. After you finish using the obtained **BundleInfo** object, clear the memory space occupied by the object in a timely manner to prevent memory leakage. 565e41f4b71Sopenharmony_ci 566e41f4b71Sopenharmony_ci ``` 567e41f4b71Sopenharmony_ci ClearBundleInfo(&bundleInfo); 568e41f4b71Sopenharmony_ci ``` 569e41f4b71Sopenharmony_ci 570e41f4b71Sopenharmony_ci 571e41f4b71Sopenharmony_ci### Packing a HAP File<a name="section171771212328"></a> 572e41f4b71Sopenharmony_ci 573e41f4b71Sopenharmony_ciThe packing tool is generally integrated into the development tool or IDE, and you rarely have the occasion to use it directly. This section is provided for you to have a general knowledge of the packing tool. The JAR file of the packing tool is stored in the **developtools/packing\_tool/jar** directory of the open-source code. 574e41f4b71Sopenharmony_ci 575e41f4b71Sopenharmony_ci- CLI command parameters for packing a HAP file 576e41f4b71Sopenharmony_ci 577e41f4b71Sopenharmony_ci **Table 2** Description of resource files required for packing 578e41f4b71Sopenharmony_ci 579e41f4b71Sopenharmony_ci <a name="table2151102833212"></a> 580e41f4b71Sopenharmony_ci <table><thead align="left"><tr id="row314812893218"><th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.1"><p id="p1614732812320"><a name="p1614732812320"></a><a name="p1614732812320"></a>Command Parameter</p> 581e41f4b71Sopenharmony_ci </th> 582e41f4b71Sopenharmony_ci <th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.2"><p id="p214722819322"><a name="p214722819322"></a><a name="p214722819322"></a>Resource File</p> 583e41f4b71Sopenharmony_ci </th> 584e41f4b71Sopenharmony_ci <th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.3"><p id="p214714286324"><a name="p214714286324"></a><a name="p214714286324"></a>Description</p> 585e41f4b71Sopenharmony_ci </th> 586e41f4b71Sopenharmony_ci <th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.4"><p id="p1014712863211"><a name="p1014712863211"></a><a name="p1014712863211"></a>Initial Value Allowed</p> 587e41f4b71Sopenharmony_ci </th> 588e41f4b71Sopenharmony_ci </tr> 589e41f4b71Sopenharmony_ci </thead> 590e41f4b71Sopenharmony_ci <tbody><tr id="row614812289322"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p16148182853216"><a name="p16148182853216"></a><a name="p16148182853216"></a>--mode</p> 591e41f4b71Sopenharmony_ci </td> 592e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p5148162814328"><a name="p5148162814328"></a><a name="p5148162814328"></a>-</p> 593e41f4b71Sopenharmony_ci </td> 594e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p11481228143215"><a name="p11481228143215"></a><a name="p11481228143215"></a>This parameter is set to <strong id="b5192781718"><a name="b5192781718"></a><a name="b5192781718"></a>hap</strong> for packing the resource files into a HAP file.</p> 595e41f4b71Sopenharmony_ci </td> 596e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p11148132811325"><a name="p11148132811325"></a><a name="p11148132811325"></a>No</p> 597e41f4b71Sopenharmony_ci </td> 598e41f4b71Sopenharmony_ci </tr> 599e41f4b71Sopenharmony_ci <tr id="row81486283327"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p6148132833215"><a name="p6148132833215"></a><a name="p6148132833215"></a>--json-path</p> 600e41f4b71Sopenharmony_ci </td> 601e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p214810286325"><a name="p214810286325"></a><a name="p214810286325"></a>Configuration file <strong id="b88502557175"><a name="b88502557175"></a><a name="b88502557175"></a>config.json</strong></p> 602e41f4b71Sopenharmony_ci </td> 603e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p514802823216"><a name="p514802823216"></a><a name="p514802823216"></a>-</p> 604e41f4b71Sopenharmony_ci </td> 605e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p4148182813326"><a name="p4148182813326"></a><a name="p4148182813326"></a>No</p> 606e41f4b71Sopenharmony_ci </td> 607e41f4b71Sopenharmony_ci </tr> 608e41f4b71Sopenharmony_ci <tr id="row1214917281322"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p171497285322"><a name="p171497285322"></a><a name="p171497285322"></a>--resources-path</p> 609e41f4b71Sopenharmony_ci </td> 610e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p414914286320"><a name="p414914286320"></a><a name="p414914286320"></a>Resource file <strong id="b62311484202"><a name="b62311484202"></a><a name="b62311484202"></a>resources</strong></p> 611e41f4b71Sopenharmony_ci </td> 612e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p41492286324"><a name="p41492286324"></a><a name="p41492286324"></a>-</p> 613e41f4b71Sopenharmony_ci </td> 614e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p1114922812327"><a name="p1114922812327"></a><a name="p1114922812327"></a>Yes</p> 615e41f4b71Sopenharmony_ci </td> 616e41f4b71Sopenharmony_ci </tr> 617e41f4b71Sopenharmony_ci <tr id="row14149122817322"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p11149528173218"><a name="p11149528173218"></a><a name="p11149528173218"></a>--assets-path</p> 618e41f4b71Sopenharmony_ci </td> 619e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p314918286324"><a name="p314918286324"></a><a name="p314918286324"></a>Resource file <strong id="b847745320206"><a name="b847745320206"></a><a name="b847745320206"></a>assets</strong></p> 620e41f4b71Sopenharmony_ci </td> 621e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p1414916284327"><a name="p1414916284327"></a><a name="p1414916284327"></a>-</p> 622e41f4b71Sopenharmony_ci </td> 623e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p9149122817324"><a name="p9149122817324"></a><a name="p9149122817324"></a>Yes</p> 624e41f4b71Sopenharmony_ci </td> 625e41f4b71Sopenharmony_ci </tr> 626e41f4b71Sopenharmony_ci <tr id="row41501728193219"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p514918280325"><a name="p514918280325"></a><a name="p514918280325"></a>--lib-path</p> 627e41f4b71Sopenharmony_ci </td> 628e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p16149162823212"><a name="p16149162823212"></a><a name="p16149162823212"></a>Dependent library file</p> 629e41f4b71Sopenharmony_ci </td> 630e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p12149122853216"><a name="p12149122853216"></a><a name="p12149122853216"></a>-</p> 631e41f4b71Sopenharmony_ci </td> 632e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p614962853217"><a name="p614962853217"></a><a name="p614962853217"></a>Yes</p> 633e41f4b71Sopenharmony_ci </td> 634e41f4b71Sopenharmony_ci </tr> 635e41f4b71Sopenharmony_ci <tr id="row131501928183212"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p4150122833213"><a name="p4150122833213"></a><a name="p4150122833213"></a>--shared-libs-path</p> 636e41f4b71Sopenharmony_ci </td> 637e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p15150112814322"><a name="p15150112814322"></a><a name="p15150112814322"></a>Shared library file</p> 638e41f4b71Sopenharmony_ci </td> 639e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p20150128113212"><a name="p20150128113212"></a><a name="p20150128113212"></a>The shared library is used by system applications in special cases.</p> 640e41f4b71Sopenharmony_ci </td> 641e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p181501928183214"><a name="p181501928183214"></a><a name="p181501928183214"></a>Yes</p> 642e41f4b71Sopenharmony_ci </td> 643e41f4b71Sopenharmony_ci </tr> 644e41f4b71Sopenharmony_ci <tr id="row10150142812329"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p1015011286320"><a name="p1015011286320"></a><a name="p1015011286320"></a>--ability-so-path</p> 645e41f4b71Sopenharmony_ci </td> 646e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p6150728123214"><a name="p6150728123214"></a><a name="p6150728123214"></a>SO file providing main functionality</p> 647e41f4b71Sopenharmony_ci </td> 648e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p16150192813323"><a name="p16150192813323"></a><a name="p16150192813323"></a>-</p> 649e41f4b71Sopenharmony_ci </td> 650e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p1315052811325"><a name="p1315052811325"></a><a name="p1315052811325"></a>Yes</p> 651e41f4b71Sopenharmony_ci </td> 652e41f4b71Sopenharmony_ci </tr> 653e41f4b71Sopenharmony_ci <tr id="row51519280321"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p315092813214"><a name="p315092813214"></a><a name="p315092813214"></a>--index-path</p> 654e41f4b71Sopenharmony_ci </td> 655e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p1115012813325"><a name="p1115012813325"></a><a name="p1115012813325"></a>Resource index</p> 656e41f4b71Sopenharmony_ci </td> 657e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p111501028123220"><a name="p111501028123220"></a><a name="p111501028123220"></a>The resource index file is generated by the resource generation tool and integrated by the resource pipeline.</p> 658e41f4b71Sopenharmony_ci </td> 659e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p1115122811326"><a name="p1115122811326"></a><a name="p1115122811326"></a>Yes</p> 660e41f4b71Sopenharmony_ci </td> 661e41f4b71Sopenharmony_ci </tr> 662e41f4b71Sopenharmony_ci <tr id="row91511928203211"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p0151328173211"><a name="p0151328173211"></a><a name="p0151328173211"></a>--out-path</p> 663e41f4b71Sopenharmony_ci </td> 664e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p215112833214"><a name="p215112833214"></a><a name="p215112833214"></a>-</p> 665e41f4b71Sopenharmony_ci </td> 666e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p11151152833217"><a name="p11151152833217"></a><a name="p11151152833217"></a>This parameter indicates the output path of the generated HAP file. The default value is the current directory.</p> 667e41f4b71Sopenharmony_ci </td> 668e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p1815110281328"><a name="p1815110281328"></a><a name="p1815110281328"></a>Yes</p> 669e41f4b71Sopenharmony_ci </td> 670e41f4b71Sopenharmony_ci </tr> 671e41f4b71Sopenharmony_ci <tr id="row4151162812329"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p1015112280329"><a name="p1015112280329"></a><a name="p1015112280329"></a>--force</p> 672e41f4b71Sopenharmony_ci </td> 673e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p2151128133219"><a name="p2151128133219"></a><a name="p2151128133219"></a>-</p> 674e41f4b71Sopenharmony_ci </td> 675e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p9151928183218"><a name="p9151928183218"></a><a name="p9151928183218"></a>This parameter specifies whether to overwrite an existing file with the same name. The default value is <strong id="b867781662412"><a name="b867781662412"></a><a name="b867781662412"></a>false</strong>.</p> 676e41f4b71Sopenharmony_ci </td> 677e41f4b71Sopenharmony_ci <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p171511728143217"><a name="p171511728143217"></a><a name="p171511728143217"></a>Yes</p> 678e41f4b71Sopenharmony_ci </td> 679e41f4b71Sopenharmony_ci </tr> 680e41f4b71Sopenharmony_ci </tbody> 681e41f4b71Sopenharmony_ci </table> 682e41f4b71Sopenharmony_ci 683e41f4b71Sopenharmony_ci- Example HAP File Structure 684e41f4b71Sopenharmony_ci - Development view 685e41f4b71Sopenharmony_ci 686e41f4b71Sopenharmony_ci  687e41f4b71Sopenharmony_ci 688e41f4b71Sopenharmony_ci - Compilation view 689e41f4b71Sopenharmony_ci 690e41f4b71Sopenharmony_ci  691e41f4b71Sopenharmony_ci 692e41f4b71Sopenharmony_ci - Run the following commands to pack a HAP file using the packing tool. 693e41f4b71Sopenharmony_ci 694e41f4b71Sopenharmony_ci  695e41f4b71Sopenharmony_ci 696e41f4b71Sopenharmony_ci ``` 697e41f4b71Sopenharmony_ci $ java -jar hmos_app_packing_tool.jar --mode hap --json-path ./config.json --assets-path ./assets/ --ability-so-path ./libentry.so --index-path ./resources.index --out-path out/entry.hap --force true 698e41f4b71Sopenharmony_ci ``` 699e41f4b71Sopenharmony_ci 700e41f4b71Sopenharmony_ci 701e41f4b71Sopenharmony_ci 702