diff --git a/frameworks/abilitymgr_lite/src/slite/ability_manager_inner.cpp b/frameworks/abilitymgr_lite/src/slite/ability_manager_inner.cpp index b5759c242cc4530a71f1d7f9d806eb58559b129a..3c1103cf55d043f6216b31d4804cebfb11f78068 100755 --- a/frameworks/abilitymgr_lite/src/slite/ability_manager_inner.cpp +++ b/frameworks/abilitymgr_lite/src/slite/ability_manager_inner.cpp @@ -17,9 +17,12 @@ #include "abilityms_slite_client.h" +StartCheckFunc CALLBACKFUNC; + extern "C" { int RegAbilityCallback(StartCheckFunc startChecktCallback) { + CALLBACKFUNC = startChecktCallback; return 0; } @@ -32,4 +35,14 @@ int ForceStopBundle(uint64_t token) { return OHOS::AbilityMsClient::GetInstance().ForceStopBundle(token); } + +int ForceStop(char *bundlename) +{ + return OHOS::AbilityMsClient::GetInstance().ForceStop(bundlename); +} + +StartCheckFunc getAbilityCallback() +{ + return CALLBACKFUNC +} } diff --git a/frameworks/abilitymgr_lite/src/slite/abilityms_slite_client.cpp b/frameworks/abilitymgr_lite/src/slite/abilityms_slite_client.cpp index 5852ee8b3e69577ff0424739e2b9585d0d10322a..6c5006c7f3d07a8cd5827fe4ec22a1e25169db86 100755 --- a/frameworks/abilitymgr_lite/src/slite/abilityms_slite_client.cpp +++ b/frameworks/abilitymgr_lite/src/slite/abilityms_slite_client.cpp @@ -135,4 +135,20 @@ ElementName *AbilityMsClient::GetTopAbility() const } return amsProxy_->GetTopAbility(); } + +int AbilityMsClient::ForceStop(char *bundlename) const +{ + AbilityMgrService *service = AbilityMgrService::GetInstance(); + if (service == nullptr) { + return PARAM_CHECK_ERROR; + } + char* name = Utils::Strdup(bundlename); + Request request = { + .msgId = TERMINATE_APP_BY_BUNDLENAME, + .data = reinterpret_cast(name), + .len = strlen(name), + } + + return SAMGR_SendRequest(service->GetIdentity(), &request, nullptr); +} } // namespace OHOS diff --git a/interfaces/innerkits/abilitymgr_lite/ability_service_interface.h b/interfaces/innerkits/abilitymgr_lite/ability_service_interface.h index 353da6d3e89701af30e41a82681dea4442464133..ee1f64430a8b2b9233e19e4ac5a474fdb294535d 100755 --- a/interfaces/innerkits/abilitymgr_lite/ability_service_interface.h +++ b/interfaces/innerkits/abilitymgr_lite/ability_service_interface.h @@ -44,6 +44,7 @@ enum AmsCommand { INNER_BEGIN, TERMINATE_APP = INNER_BEGIN, DUMP_ABILITY, + TERMINATE_APP_BY_BUNDLENAME, COMMAND_END, }; diff --git a/interfaces/innerkits/abilitymgr_lite/slite/ability_manager_inner.h b/interfaces/innerkits/abilitymgr_lite/slite/ability_manager_inner.h index 37d9e88ce593fea15514c341b5b56e8e4ea548c7..f5fb63486ae739ea430be2188ce28a3b0e81bdf8 100755 --- a/interfaces/innerkits/abilitymgr_lite/slite/ability_manager_inner.h +++ b/interfaces/innerkits/abilitymgr_lite/slite/ability_manager_inner.h @@ -59,6 +59,21 @@ int ForceStopBundle(uint64_t token); * @return Returns the element name of the top ability. */ ElementName *GetTopAbility(); + +/** + * @brief Forcestop an ability based on the specified bundlename information. + * + * @param bundlename Indicates the bundlename of the ability. + * @return Returns 0 if this function is successfully called; returns another value otherwise. + */ +int ForceStop(char *bundlename); + +/** + * @brief get ability callback function + * + * @return Returns the ability callback function + */ +StartCheckFunc getAbilityCallback(); #ifdef __cplusplus #if __cplusplus } diff --git a/services/abilitymgr_lite/include/ability_service.h b/services/abilitymgr_lite/include/ability_service.h index 3ffbabfd27202061f6b6fc72e3d7ef9714983aff..787a723388284bffe90ad2d30882ecdb392e3af8 100755 --- a/services/abilitymgr_lite/include/ability_service.h +++ b/services/abilitymgr_lite/include/ability_service.h @@ -45,6 +45,7 @@ public: ~AbilityService() override; int32_t StartAbility(const Want *want); int32_t TerminateAbility(uint16_t token); + int32_t ForceStop(char *bundlename); int32_t ForceStopBundle(uint16_t token); int32_t SchedulerLifecycleDone(uint64_t token, int32_t state); ElementName *GetTopAbility(); diff --git a/services/abilitymgr_lite/src/ability_mgr_service.cpp b/services/abilitymgr_lite/src/ability_mgr_service.cpp index 385e19039fad8420d2ca153f2e1ff5cb252ad61d..07af4200c2363c1d82740f60d854f2b7aefaad71 100755 --- a/services/abilitymgr_lite/src/ability_mgr_service.cpp +++ b/services/abilitymgr_lite/src/ability_mgr_service.cpp @@ -90,6 +90,9 @@ BOOL AbilityMgrService::ServiceMessageHandle(Service *service, Request *request) ret = AbilityService::GetInstance().TerminateAbility(request->msgValue); } else if (request->msgId == TERMINATE_APP) { ret = AbilityService::GetInstance().ForceStopBundle(request->msgValue); + } else if (request->msgId == TERMINATE_APP_BY_BUNDLENAME) { + char* bundleName = reinterpret_cast(request->data) + ret = AbilityService::GetInstance().ForceStop(bundleName); } return ret == ERR_OK; #else diff --git a/services/abilitymgr_lite/src/ability_service.cpp b/services/abilitymgr_lite/src/ability_service.cpp index fdd7885e9103bba738d3df5fdfc2170fe47e5eb9..7755ebfc06be61845846ffadd3d7cbdaf3ecf01e 100755 --- a/services/abilitymgr_lite/src/ability_service.cpp +++ b/services/abilitymgr_lite/src/ability_service.cpp @@ -24,6 +24,7 @@ #include "ability_stack.h" #include "ability_state.h" #include "abilityms_log.h" +#include "ability_manager_inner.h" #include "bundle_manager.h" #include "cmsis_os.h" #include "js_app_host.h" @@ -174,8 +175,10 @@ int32_t AbilityService::StartAbility(AbilitySvcInfo *info) } HILOG_INFO(HILOG_MODULE_AAFWK, "Js app already started or starting."); } else { - // TODO ��֮ǰ��jsӦ�ò���һ��Ӧ�� JS2JS��������Ҫ�Ȱ�֮ǰ��JS�˳� - return ERR_OK; + // js to js + HILOG_INFO(HILOG_MODULE_AAFWK, "Terminate pre js app when js to js") + TerminateAbility(topRecord->GetToken()); + pendingToken_ = GenerateToken() } } @@ -192,9 +195,9 @@ int32_t AbilityService::TerminateAbility(uint16_t token) return PARAM_NULL_ERROR; } uint16_t topToken = topRecord->GetToken(); - // TODO CHECK terminate ����,�Ƿ��иó����� + // TODO CHECK terminate token if (token == LAUNCHER_TOKEN) { - // �����ǰjs�ں�̨, �������˺�̨��js�ߵ�ǰ̨ + // if js is in background, the launcher goes back to background and js goes to active if (topToken != token && topRecord->GetState() == SCHEDULE_BACKGROUND) { HILOG_INFO(HILOG_MODULE_AAFWK, "Resume Js app [%u]", topToken); return SchedulerLifecycle(LAUNCHER_TOKEN, STATE_BACKGROUND); @@ -202,14 +205,13 @@ int32_t AbilityService::TerminateAbility(uint16_t token) return ERR_OK; } - // TODO CHECK�Ƿ��иó��� if (token != topToken) { APP_ERRCODE_EXTRA(EXCE_ACE_APP_START, EXCE_ACE_APP_STOP_UNKNOWN_ABILITY_TOKEN); DeleteRecordInfo(token); return -1; } topRecord->SetTerminated(true); - // TerminateAbility TOP��js + // TerminateAbility top js return SchedulerLifecycleInner(topRecord, STATE_BACKGROUND); } @@ -238,6 +240,23 @@ int32_t AbilityService::ForceStopBundle(uint16_t token) return ERR_OK; } +int32_t AbilityService::ForceStop(char* bundlename) +{ + //stop Launcher + if (strcmp(bundlename, LAUNCHER_BUNDLE_NAME) == 0) { + return TerminateAbility(0); + } + + //stop js app + if (strcmp(GetTopAbility()->bundlename, bundlename) == 0) { + HILOG_INFO(HILOG_MODULE_AAFWK, "ForceStop [%s]", bundlename); + AbilityRecord *topRecord = const_cast(abilityStack_.GetTopAbility()); + return TerminateAbility(topRecord->GetToken()); + } + + return PARAM_CHECK_ERROR; +} + int32_t AbilityService::ForceStopBundleInner(uint16_t token) { // free js mem and delete the record @@ -271,13 +290,17 @@ int32_t AbilityService::PreCheckStartAbility( return ERR_OK; } auto record = new AbilityRecord(); - record->SetToken(GenerateToken()); + if (pendingToken_ != 0) { + record->SetToken(pendingToken_); + } else { + record->SetToken(GenerateToken()); + } record->SetAppName(bundleName); record->SetAppPath(path); record->SetAppData(data, dataLength); record->SetState(SCHEDULE_STOP); abilityList_.Add(record); - if (CreateAppTask(record) != ERR_OK) { + if (pendingToken_ == 0 && CreateAppTask(record) != ERR_OK) { HILOG_ERROR(HILOG_MODULE_AAFWK, "CheckResponse CreateAppTask fail"); abilityList_.Erase(record->GetToken()); delete record; @@ -288,6 +311,14 @@ int32_t AbilityService::PreCheckStartAbility( bool AbilityService::CheckResponse(const char *bundleName) { + StartCheckFunc callBackFunc = getAbilityCallback(); + if (callBackFunc != nullptr) { + int ret = (*callBackFunc)(bundleName); + if (ret != ERR_OK) { + HILOG_ERROR(HILOG_MODULE_AAFWK, "calling ability callback failed bundlename is: [%s]", bundleName); + return false; + } + } return true; } @@ -411,7 +442,6 @@ void AbilityService::OnBackgroundDone(uint16_t token) if (token != LAUNCHER_TOKEN) { if (topRecord->GetToken() == token) { APP_EVENT(MT_ACE_APP_BACKGROUND); - topRecord->SetTerminated(true); (void) SchedulerLifecycle(LAUNCHER_TOKEN, STATE_ACTIVE); } return; @@ -483,7 +513,7 @@ int32_t AbilityService::SchedulerLifecycleInner(const AbilityRecord *record, int return PARAM_NULL_ERROR; } // dispatch js life cycle - if (record->GetToken() != LAUNCHER_TOKEN) { // jsӦ�� + if (record->GetToken() != LAUNCHER_TOKEN) { (void) SendMsgToJsAbility(state, record); return ERR_OK; } @@ -491,7 +521,7 @@ int32_t AbilityService::SchedulerLifecycleInner(const AbilityRecord *record, int if (g_NativeAbility == nullptr) { return PARAM_NULL_ERROR; } - // ����want�ڴ棬�ڷ���������ͷ� + // malloc want memory and release after use Want *info = static_cast(AdapterMalloc(sizeof(Want))); if (info == nullptr) { return MEMORY_MALLOC_ERROR;