diff --git a/frameworks/kits/ability/ability_runtime/BUILD.gn b/frameworks/kits/ability/ability_runtime/BUILD.gn old mode 100644 new mode 100755 index 25671b0711bcfbb89b259259082509eaab5af40e..0956f981be3959a7da93a40dfb32dd2689c962ff --- a/frameworks/kits/ability/ability_runtime/BUILD.gn +++ b/frameworks/kits/ability/ability_runtime/BUILD.gn @@ -58,4 +58,4 @@ ohos_shared_library("ability_context_native") { subsystem_name = "aafwk" part_name = "aafwk_standard" -} +} \ No newline at end of file diff --git a/frameworks/kits/ability/ability_runtime/include/ability_connection.h b/frameworks/kits/ability/ability_runtime/include/ability_connection.h old mode 100644 new mode 100755 index 13ec528008ebd0e9b72b6ed097c79bb555e90e09..a816e014ad8b252e79073e7b241b113b5ebc71d2 --- a/frameworks/kits/ability/ability_runtime/include/ability_connection.h +++ b/frameworks/kits/ability/ability_runtime/include/ability_connection.h @@ -62,8 +62,25 @@ public: * @param resultCode, ERR_OK on success, others on failure. */ void OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) override; + + /** + * set abilityConnectCallback + * + * @param abilityConnectCallback is used to notify caller ability that connect or disconnect is complete + */ + void SetConnectCallback(std::shared_ptr abilityConnectCallback); + + void SetRemoteObject(const sptr &remoteObject); + + void SetResultCode(int resultCode); + + sptr GetRemoteObject(); + + int GetResultCode(); private: std::shared_ptr abilityConnectCallback_; + sptr remoteObject_; + int resultCode_; }; } // namespace AbilityRuntime } // namespace OHOS diff --git a/frameworks/kits/ability/ability_runtime/include/ability_context.h b/frameworks/kits/ability/ability_runtime/include/ability_context.h old mode 100644 new mode 100755 index 9f0563d58bdf77459bf9b61116c0abf846f02b41..7e1ae941c006fa6585ebc6b196deac1c720e8390 --- a/frameworks/kits/ability/ability_runtime/include/ability_context.h +++ b/frameworks/kits/ability/ability_runtime/include/ability_context.h @@ -71,23 +71,24 @@ public: virtual void OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want &resultData) = 0; /** - * @brief Connects the current ability to an ability using the AbilityInfo.AbilityType.SERVICE template. - * - * @param want Indicates the want containing information about the ability to connect - * @param conn Indicates the callback object when the target ability is connected. - * @return True means success and false means failure - */ - virtual bool ConnectAbility(const AAFwk::Want &want, - const std::shared_ptr &connectCallback) = 0; - - /** - * @brief Disconnects the current ability from an ability - * - * @param conn Indicates the IAbilityConnection callback object passed by connectAbility after the connection - * is set up. The IAbilityConnection object uniquely identifies a connection between two abilities. - */ - virtual void DisconnectAbility(const AAFwk::Want &want, - const std::shared_ptr &connectCallback) = 0; + * @brief Connects the current ability to an ability using the AbilityInfo.AbilityType.SERVICE template. + * + * @param want Indicates the want containing information about the ability to connect + * @param connectCallback Indicates the callback object when the target ability is connected. + * @return True means success and false means failure + */ + virtual bool ConnectAbility(const AAFwk::Want &want, + const std::shared_ptr &connectCallback) = 0; + + /** + * @brief Disconnects the current ability from an ability + * + * @param want Indicates the want containing information about the ability to disconnect + * @param connectCallback Indicates the callback object when the target ability is connected. + * is set up. The IAbilityConnection object uniquely identifies a connection between two abilities. + */ + virtual void DisconnectAbility(const AAFwk::Want &want, + const std::shared_ptr &connectCallback) = 0; /** * @brief get ability info of the current ability diff --git a/frameworks/kits/ability/ability_runtime/src/ability_connection.cpp b/frameworks/kits/ability/ability_runtime/src/ability_connection.cpp old mode 100644 new mode 100755 index b5ebc37be25832bbfeed2fd326c7fee70ceaf9b3..eceed62a444a05de8da579ae85374209a1fbc9e5 --- a/frameworks/kits/ability/ability_runtime/src/ability_connection.cpp +++ b/frameworks/kits/ability/ability_runtime/src/ability_connection.cpp @@ -19,6 +19,7 @@ namespace OHOS { namespace AbilityRuntime { +const int DIED = -1; AbilityConnection::AbilityConnection(const std::shared_ptr &abilityConnectCallback) { abilityConnectCallback_ = abilityConnectCallback; @@ -31,6 +32,8 @@ void AbilityConnection::OnAbilityConnectDone( if (abilityConnectCallback_ == nullptr) { HILOG_ERROR("%{public}s abilityConnectCallback is nullptr.", __func__); } + SetRemoteObject(remoteObject); + SetResultCode(resultCode); abilityConnectCallback_->OnAbilityConnectDone(element, remoteObject, resultCode); HILOG_DEBUG("%{public}s end, remoteObject:%{public}p, bundleName:%{public}s, abilityName:%{public}s.", __func__, remoteObject.GetRefPtr(), element.GetBundleName().c_str(), element.GetAbilityName().c_str()); @@ -38,13 +41,47 @@ void AbilityConnection::OnAbilityConnectDone( void AbilityConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) { - HILOG_DEBUG("%{public}s begin.", __func__); + HILOG_DEBUG("%{public}s begin, resultCode:%{public}d.", __func__, resultCode); if (abilityConnectCallback_ == nullptr) { HILOG_ERROR("%{public}s abilityConnectCallback is nullptr.", __func__); } - abilityConnectCallback_->OnAbilityDisconnectDone(element, resultCode); + // if resultCode < 0 that means the connectReceiver is died + if (resultCode == DIED) { + bool ret = ConnectionManager::GetInstance().DisconnectReceiver(element); + if (ret) { + HILOG_INFO("The service connection is not disconnected."); + } + abilityConnectCallback_->OnAbilityDisconnectDone(element, DIED + 1); + } else { + abilityConnectCallback_->OnAbilityDisconnectDone(element, resultCode); + } HILOG_DEBUG("%{public}s end, bundleName:%{public}s, abilityName:%{public}s.", __func__, element.GetBundleName().c_str(), element.GetAbilityName().c_str()); } + +void AbilityConnection::SetConnectCallback(std::shared_ptr abilityConnectCallback) +{ + abilityConnectCallback_ = abilityConnectCallback; +} + +void AbilityConnection::SetRemoteObject(const sptr &remoteObject) +{ + remoteObject_ = remoteObject; +} + +void AbilityConnection::SetResultCode(int resultCode) +{ + resultCode_ = resultCode; +} + +sptr AbilityConnection::GetRemoteObject() +{ + return remoteObject_; +} + +int AbilityConnection::GetResultCode() +{ + return resultCode_; +} } // namespace AbilityRuntime } // namespace OHOS \ No newline at end of file diff --git a/frameworks/kits/ability/ability_runtime/src/connection_manager.cpp b/frameworks/kits/ability/ability_runtime/src/connection_manager.cpp old mode 100644 new mode 100755 index e380e4ce517e7793042976394eacf6c58e04386b..1b6677ddfbd0a8317209f013736350185107e4c0 --- a/frameworks/kits/ability/ability_runtime/src/connection_manager.cpp +++ b/frameworks/kits/ability/ability_runtime/src/connection_manager.cpp @@ -51,21 +51,32 @@ ErrCode ConnectionManager::ConnectAbility(const sptr &connectCall if (item != abilityConnections_.end()) { std::vector> callbacks = item->second; callbacks.push_back(connectCallback); + abilityConnections_[item->first] = callbacks; abilityConnection = item->first.abilityConnection; - HILOG_INFO("%{public}s find abilityConnection:%{public}p exist, callbackSize:%{public}d.", - __func__, abilityConnection.GetRefPtr(), (int32_t)callbacks.size()); + abilityConnection->SetConnectCallback(connectCallback); + HILOG_INFO("%{public}s end, find abilityConnection:%{public}p exist, callbackSize:%{public}d.", + __func__, abilityConnection.GetRefPtr(), callbacks.size()); + if (abilityConnection->GetResultCode() == ERR_OK) { + connectCallback->OnAbilityConnectDone(connectReceiver, abilityConnection->GetRemoteObject(), + abilityConnection->GetResultCode()); + return ERR_OK; + } else { + return AAFwk::AbilityManagerClient::GetInstance()->ConnectAbility(want, abilityConnection, connectCaller); + } } else { abilityConnection = new AbilityConnection(connectCallback); - ConnectionInfo connectionInfo(connectCaller, connectReceiver, abilityConnection); - std::vector> callbacks; - callbacks.push_back(connectCallback); - abilityConnections_[connectionInfo] = callbacks; - HILOG_DEBUG("%{public}s end, abilityConnection is not exist, make a new abilityConnection.", __func__); - HILOG_DEBUG("%{public}s end, abilityConnection: %{public}p, abilityConnectionsSize:%{public}d.", - __func__, abilityConnection.GetRefPtr(), (int32_t)abilityConnections_.size()); + ErrCode ret = + AAFwk::AbilityManagerClient::GetInstance()->ConnectAbility(want, abilityConnection, connectCaller); + if (ret == ERR_OK) { + ConnectionInfo connectionInfo(connectCaller, connectReceiver, abilityConnection); + std::vector> callbacks; + callbacks.push_back(connectCallback); + abilityConnections_[connectionInfo] = callbacks; + } + HILOG_DEBUG("%{public}s end, not find connection, connection: %{public}p, abilityConnectionsSize:%{public}d.", + __func__, abilityConnection.GetRefPtr(), abilityConnections_.size()); + return ret; } - - return AAFwk::AbilityManagerClient::GetInstance()->ConnectAbility(want, abilityConnection, connectCaller); } ErrCode ConnectionManager::DisconnectAbility(const sptr &connectCaller, @@ -89,20 +100,27 @@ ErrCode ConnectionManager::DisconnectAbility(const sptr &connectC }); if (item != abilityConnections_.end()) { std::vector> callbacks = item->second; - HILOG_DEBUG("%{public}s begin remove callback, callbackSize:%{public}d.", __func__, (int32_t)callbacks.size()); - for (auto iter = callbacks.begin(); iter != callbacks.end(); iter++) { + HILOG_DEBUG("%{public}s begin remove callback, callbackSize:%{public}d.", __func__, callbacks.size()); + auto iter = callbacks.begin(); + while (iter != callbacks.end()) { if (*iter == connectCallback) { - callbacks.erase(iter); + iter = callbacks.erase(iter); + } else { + iter++; } } + abilityConnections_[item->first] = callbacks; sptr abilityConnection; abilityConnection = item->first.abilityConnection; + abilityConnection->SetConnectCallback(connectCallback); HILOG_INFO("%{public}s end, find abilityConnection:%{public}p exist, abilityConnectionsSize:%{public}d.", - __func__, abilityConnection.GetRefPtr(), (int32_t)abilityConnections_.size()); + __func__, abilityConnection.GetRefPtr(), abilityConnections_.size()); if (callbacks.size() == 0) { + abilityConnections_.erase(item); HILOG_DEBUG("%{public}s disconnectAbility.", __func__); return AAFwk::AbilityManagerClient::GetInstance()->DisconnectAbility(abilityConnection); } else { + connectCallback->OnAbilityDisconnectDone(connectReceiver, ERR_OK); HILOG_DEBUG("%{public}s callbacks is not empty, do not need disconnectAbility.", __func__); return ERR_OK; } @@ -119,13 +137,17 @@ bool ConnectionManager::DisconnectCaller(const sptr &connectCalle HILOG_ERROR("%{public}s end, connectCaller is nullptr.", __func__); return false; } + HILOG_DEBUG("%{public}s, connectCaller:%{public}p, abilityConnectionsSize:%{public}d.", - __func__, connectCaller.GetRefPtr(), (int32_t)abilityConnections_.size()); + __func__, connectCaller.GetRefPtr(), abilityConnections_.size()); + bool isDisconnect = false; auto iter = abilityConnections_.begin(); while (iter != abilityConnections_.end()) { ConnectionInfo connectionInfo = iter->first; if (IsConnectCallerEqual(connectionInfo.connectCaller, connectCaller)) { + HILOG_DEBUG("%{public}s DisconnectAbility connection:%{public}p.", + __func__, connectionInfo.abilityConnection.GetRefPtr()); ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->DisconnectAbility(connectionInfo.abilityConnection); if (ret != ERR_OK) { @@ -138,25 +160,21 @@ bool ConnectionManager::DisconnectCaller(const sptr &connectCalle } } - HILOG_DEBUG("%{public}s end, abilityConnectionsSize:%{public}d.", __func__, (int32_t)abilityConnections_.size()); + HILOG_DEBUG("%{public}s end, abilityConnectionsSize:%{public}d.", __func__, abilityConnections_.size()); return isDisconnect; } bool ConnectionManager::DisconnectReceiver(const AppExecFwk::ElementName &connectReceiver) { HILOG_DEBUG("%{public}s begin, abilityConnectionsSize:%{public}d, bundleName:%{public}s, abilityName:%{public}s.", - __func__, (int32_t)abilityConnections_.size(), connectReceiver.GetBundleName().c_str(), + __func__, abilityConnections_.size(), connectReceiver.GetBundleName().c_str(), connectReceiver.GetAbilityName().c_str()); + bool isDisconnect = false; auto iter = abilityConnections_.begin(); while (iter != abilityConnections_.end()) { ConnectionInfo connectionInfo = iter->first; if (IsConnectReceiverEqual(connectionInfo.connectReceiver, connectReceiver)) { - ErrCode ret = - AAFwk::AbilityManagerClient::GetInstance()->DisconnectAbility(connectionInfo.abilityConnection); - if (ret != ERR_OK) { - HILOG_ERROR("%{public}s ams->DisconnectAbility error, ret=%{public}d", __func__, ret); - } iter = abilityConnections_.erase(iter); isDisconnect = true; } else { @@ -164,7 +182,7 @@ bool ConnectionManager::DisconnectReceiver(const AppExecFwk::ElementName &connec } } - HILOG_DEBUG("%{public}s end, abilityConnectionsSize:%{public}d.", __func__, (int32_t)abilityConnections_.size()); + HILOG_DEBUG("%{public}s end, abilityConnectionsSize:%{public}d.", __func__, abilityConnections_.size()); return isDisconnect; } diff --git a/frameworks/kits/ability/native/include/service_extension.h b/frameworks/kits/ability/native/include/service_extension.h old mode 100644 new mode 100755 index 044a00dc63025932e6b58aefd1640f39d0496548..8153c6746592ecc7ccb96fc862ac2cc0b87a9582 --- a/frameworks/kits/ability/native/include/service_extension.h +++ b/frameworks/kits/ability/native/include/service_extension.h @@ -66,12 +66,6 @@ public: * @return The ServiceExtension instance. */ static ServiceExtension* Create(const std::unique_ptr& runtime); - - /** - * @brief Stop the extension. - * - */ - virtual void OnStop() override; }; } // namespace AbilityRuntime } // namespace OHOS diff --git a/frameworks/kits/ability/native/src/ability.cpp b/frameworks/kits/ability/native/src/ability.cpp old mode 100644 new mode 100755 index 4811a08082719cea8a6689aa89c3e3e2eb9127a9..a5e95825c160e43010b97a0de00720b400967775 --- a/frameworks/kits/ability/native/src/ability.cpp +++ b/frameworks/kits/ability/native/src/ability.cpp @@ -266,11 +266,6 @@ void Ability::OnStop() return; } lifecycle_->DispatchLifecycle(LifeCycle::Event::ON_STOP); - - bool ret = AbilityRuntime::ConnectionManager::GetInstance().DisconnectCaller(AbilityContext::token_); - if (ret) { - APP_LOGI("The service connection is not disconnected."); - } APP_LOGI("%{public}s end.", __func__); } diff --git a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp old mode 100644 new mode 100755 index 8341a2f764b5863201ff56b24848bf652d62ddb5..e087171f79f131380580987d43c943cb6abc7a0e --- a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp +++ b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp @@ -18,6 +18,7 @@ #include "ability_runtime/js_ability_context.h" #include "ability_runtime/js_window_stage.h" #include "ability_start_setting.h" +#include "connection_manager.h" #include "hilog_wrapper.h" #include "js_data_struct_converter.h" #include "js_runtime.h" @@ -116,6 +117,10 @@ void JsAbility::OnStop() Ability::OnStop(); CallObjectMethod("onDestroy"); + bool ret = ConnectionManager::GetInstance().DisconnectCaller(AbilityContext::token_); + if (ret) { + HILOG_INFO("The service connection is not disconnected."); + } } void JsAbility::OnSceneCreated() diff --git a/frameworks/kits/ability/native/src/js_service_extension.cpp b/frameworks/kits/ability/native/src/js_service_extension.cpp old mode 100644 new mode 100755 index 4437c35f9c474e0d0ad839094454a24db94d7a07..34bfa050c21534e3a74613565cad2c944f19c3ff --- a/frameworks/kits/ability/native/src/js_service_extension.cpp +++ b/frameworks/kits/ability/native/src/js_service_extension.cpp @@ -104,9 +104,13 @@ void JsServiceExtension::OnStart(const AAFwk::Want &want) void JsServiceExtension::OnStop() { - ServiceExtension::OnStop(); + Extension::OnStop(); HILOG_INFO("JsServiceExtension OnStop begin."); CallObjectMethod("onDestroy"); + bool ret = ConnectionManager::GetInstance().DisconnectCaller(GetContext()->GetToken()); + if (ret) { + HILOG_INFO("The service extension connection is not disconnected."); + } HILOG_INFO("%{public}s end.", __func__); } diff --git a/frameworks/kits/ability/native/src/service_extension.cpp b/frameworks/kits/ability/native/src/service_extension.cpp old mode 100644 new mode 100755 index f360b81668a29d88e99831aa1ef00314839530e6..d80007139c14a88e188bd8f398cdc3074d3821b5 --- a/frameworks/kits/ability/native/src/service_extension.cpp +++ b/frameworks/kits/ability/native/src/service_extension.cpp @@ -65,14 +65,5 @@ std::shared_ptr ServiceExtension::CreateAndInitContext( context->SetAbilityInfo(record->GetAbilityInfo()); return context; } - -void ServiceExtension::OnStop() -{ - Extension::OnStop(); - bool ret = ConnectionManager::GetInstance().DisconnectCaller(GetContext()->GetToken()); - if (ret) { - HILOG_INFO("The service connection is not disconnected."); - } -} } } \ No newline at end of file diff --git a/services/abilitymgr/include/connection_record.h b/services/abilitymgr/include/connection_record.h old mode 100644 new mode 100755 index 78894354ecc4ec53be7b2b107dbfdd0519984c83..0dbc77a3eff2639b467fa509ff6b417670bf8b93 --- a/services/abilitymgr/include/connection_record.h +++ b/services/abilitymgr/include/connection_record.h @@ -101,7 +101,7 @@ public: * complete disconnect ability and invoke callback. * */ - void CompleteDisconnect(int resultCode); + void CompleteDisconnect(int resultCode, bool isDied); /** * scheduler target service disconnect done. diff --git a/services/abilitymgr/src/ability_connect_manager.cpp b/services/abilitymgr/src/ability_connect_manager.cpp old mode 100644 new mode 100755 index 29356963aa464e6f8415238346f5f3c81ef18843..7ef5c48e229ca083999203cc2b680f0e0cedc5e3 --- a/services/abilitymgr/src/ability_connect_manager.cpp +++ b/services/abilitymgr/src/ability_connect_manager.cpp @@ -660,7 +660,7 @@ void AbilityConnectManager::HandleDisconnectTask(const ConnectListType &connectl if (targetService && connectRecord->GetConnectState() == ConnectionState::DISCONNECTED && targetService->GetConnectRecordList().size() > 1) { HILOG_WARN("This record complete disconnect directly. recordId:%{public}d", connectRecord->GetRecordId()); - connectRecord->CompleteDisconnect(ERR_OK); + connectRecord->CompleteDisconnect(ERR_OK, false); targetService->RemoveConnectRecordFromList(connectRecord); RemoveConnectionRecordFromMap(connectRecord); }; @@ -907,7 +907,7 @@ void AbilityConnectManager::HandleAbilityDiedTask(const std::shared_ptrGetConnectRecordList(); for (auto &connectRecord : connlist) { HILOG_WARN("This record complete disconnect directly. recordId:%{public}d", connectRecord->GetRecordId()); - connectRecord->CompleteDisconnect(ERR_OK); + connectRecord->CompleteDisconnect(ERR_OK, true); abilityRecord->RemoveConnectRecordFromList(connectRecord); RemoveConnectionRecordFromMap(connectRecord); } diff --git a/services/abilitymgr/src/connection_record.cpp b/services/abilitymgr/src/connection_record.cpp old mode 100644 new mode 100755 index 2ccef86617b6d2d34a8dbb7dd58f56b305da5fc0..56e8efe29a06b3e322487c32302800ecadb8982a --- a/services/abilitymgr/src/connection_record.cpp +++ b/services/abilitymgr/src/connection_record.cpp @@ -128,7 +128,7 @@ void ConnectionRecord::CompleteConnect(int resultCode) HILOG_INFO("result: %{public}d. connectstate:%{public}d.", resultCode, state_); } -void ConnectionRecord::CompleteDisconnect(int resultCode) +void ConnectionRecord::CompleteDisconnect(int resultCode, bool isDied) { if (resultCode == ERR_OK) { SetConnectState(ConnectionState::DISCONNECTED); @@ -137,7 +137,7 @@ void ConnectionRecord::CompleteDisconnect(int resultCode) const AppExecFwk::AbilityInfo &abilityInfo = targetService_->GetAbilityInfo(); AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name); if (connCallback_) { - connCallback_->OnAbilityDisconnectDone(element, resultCode); + connCallback_->OnAbilityDisconnectDone(element, isDied ? (resultCode - 1) : resultCode); } HILOG_INFO("result: %{public}d. connectstate:%{public}d.", resultCode, state_); } @@ -157,7 +157,7 @@ void ConnectionRecord::ScheduleDisconnectAbilityDone() handler->RemoveTask(taskName); } - CompleteDisconnect(ERR_OK); + CompleteDisconnect(ERR_OK, false); } void ConnectionRecord::ScheduleConnectAbilityDone()