把Activity从taskManager中删除

本文介绍如何在Android应用中使用android:excludeFromRecents属性来排除应用从最近任务列表中显示,同时讨论了其配置变化的影响。
 

android:excludeFromRecents = "true"

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.test"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".AlertDialogActivity"
          android:launchMode="singleTask"
          android:excludeFromRecents="true"
                  android:label="@string/app_name" android:configChanges="keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 <activity android:name="DialogActivity" android:theme="@android:style/Theme.Translucent"></activity>
    </application>
    <uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name = "android.permission.CAMERA" />
<uses-permission android:name = "android.permission." />
 
<uses-feature android:name = "android.hardware.camera" />
<uses-feature android:name = "android.hardware.camera.autofocus" />

</manifest>

package com.kotei.overseas.navi.mvvm.mainmap; import static com.kotei.ui.sdk_module_ui_s31a.utils.LanguageContextWrapper.getGeneralString; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.constraintlayout.widget.ConstraintLayout; import com.bumptech.glide.Glide; import com.here.sdk.core.GeoCoordinates; import com.kotei.overseas.navi.business.account.FavoriteController; import com.kotei.overseas.navi.business.account.FavoriteService; import com.kotei.overseas.navi.business.account.utils.ConverUtils; import com.kotei.overseas.navi.business.bean.CollectEnum; import com.kotei.overseas.navi.business.bean.CollectPoint; import com.kotei.overseas.navi.business.bean.PoiTypeEnum; import com.kotei.overseas.navi.business.cruise.CruiseManager; import com.kotei.overseas.navi.business.manager.BatteryChangeManager; import com.kotei.overseas.navi.business.manager.MarkerController; import com.kotei.overseas.navi.business.navi.Controller.ContinueNaviController; import com.kotei.overseas.navi.business.widget.BusinessApplicationUtils; import com.kotei.overseas.navi.business.widget.ui.util.GlideUtil; import com.kotei.overseas.navi.common.ToastUtils; import com.kotei.overseas.navi.event.CruiseClickEvent; import com.kotei.overseas.navi.event.FavoriteShowEvent; import com.kotei.overseas.navi.framework.mvvm.BaseViewDataBinding; import com.kotei.overseas.navi.framework.mvvm.BaseViewModel; import com.kotei.overseas.navi.framework.mvvm.SharedViewModel; import com.kotei.overseas.navi.navigation.ContinueNaviState; import com.kotei.overseas.navi.navigation.GeneralStatus; import com.kotei.overseas.navi.navigation.task.TaskManager; import com.kotei.overseas.navi.navigation.utils.Logger; import com.kotei.overseas.navi.ui.R; import com.kotei.overseas.navi.ui.databinding.FragmentMainmapMasterBinding; import com.kotei.overseas.navi.view.ContinueNaviDialog; import com.kotei.overseas.navi.view.LowBatteryReminderDialog; import com.kotei.ui.sdk_module_ui_s31a.bean.CardData; import com.kotei.ui.sdk_module_ui_s31a.bean.DeepPoiCardData; import com.kotei.ui.sdk_module_ui_s31a.bean.LocPoiCardData; import com.kotei.ui.sdk_module_ui_s31a.bean.PoiCardListener; import com.kotei.ui.sdk_module_ui_s31a.bean.TrafficPoiCardData; import com.kotei.ui.sdk_module_ui_s31a.custom.DeepPoiCardView; import com.kotei.ui.sdk_module_ui_s31a.custom.LocPoiCardView; import com.kotei.ui.sdk_module_ui_s31a.custom.ScaleBarView; import com.kotei.ui.sdk_module_ui_s31a.custom.TrafficPoiCardView; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; /** * 专属MainFragment的Binding包装类 * 职责: * 1. 管理DataBinding实例 * 2. 处理皮肤换肤逻辑 * 3. 提供Fragment所需的视图操作接口 */ public class MainViewDataHelper extends BaseViewDataBinding<FragmentMainmapMasterBinding> { private final static String TAG = MainViewDataHelper.class.getSimpleName(); private MainMapViewModel viewModel; private SharedViewModel sharedViewModel; private ViewGroup.OnHierarchyChangeListener showPoiCardActionListener = null; private Runnable runnableTask = null; private ContinueNaviDialog continueNaviDialog; private BatteryChangeManager.BatteryChangeListener batteryChangeListener; public MainViewDataHelper() { } @Override public void attachViewModel(BaseViewModel viewModel, SharedViewModel sharedViewModel) { if (viewModel instanceof MainMapViewModel) { this.viewModel = (MainMapViewModel) viewModel; this.sharedViewModel = sharedViewModel; initViewModel(); } } public void initViewModel() { initViews(); setupObservers(); viewModel.initSilent(); } private void updateReachableIcon(boolean isActive) { ImageView icon = safeFindViewById(R.id.siv_reachable_icon); icon.setImageResource(isActive ? R.drawable.reachable_icon_day : R.drawable.reachable_icon); } private void initViews() { // 初始化搜索区域 safeFindViewById(R.id.cl_search).setOnClickListener(v -> viewModel.clickSearch()); // 初始化地图模式切换 safeFindViewById(R.id.siv_map_model).setOnClickListener(v -> viewModel.clickMapMode()); // 初始化音量控制按钮 ImageView volumeButton = safeFindViewById(R.id.siv_volume, ImageView.class); // 观察静音状态,动态更新按钮图标 viewModel.getSilent().observe(getLifecycleOwner(), isSilent -> { if (isSilent) { volumeButton.setBackgroundResource(R.drawable.ic_nav_sound_off_64_n_day); // 静音图标 } else { volumeButton.setBackgroundResource(R.drawable.ic_nav_sound_on_64_n_day); // 非静音图标 } }); // 设置按钮点击事件 volumeButton.setOnClickListener(v -> { // 切换静音状态 boolean currentState = viewModel.getSilent().getValue() != null && viewModel.getSilent().getValue(); viewModel.setMuted(!currentState); }); // 初始化天气区域 safeFindViewById(R.id.siv_weather_icon).setOnClickListener(v -> sharedViewModel.getWeather()); // 设置 safeFindViewById(R.id.siv_setting_icon).setOnClickListener(v -> viewModel.clickSetting()); // 收藏夹 safeFindViewById(R.id.siv_collect).setOnClickListener(v -> { viewModel.clickCollect(CollectEnum.POI.name()); }); //回车位 safeFindViewById(R.id.cbs_back_toccp).setOnClickListener(v -> { viewModel.clickBackToCar(); }); //回车位 safeFindViewById(R.id.cl_gocar_btn).setOnClickListener(v -> { viewModel.clickBackToCar(); }); // safeFindViewById(R.id.siv_home).setOnClickListener(v -> { //ToastUtils.showLong("Functional development in progress", -1); boolean b = viewModel.goHome(); if (!b) { ToastUtils.showLong(getGeneralString(R.string.home_not_set), -1); } }); safeFindViewById(R.id.siv_company).setOnClickListener(v -> { boolean b = viewModel.goCompany(); if (!b) { ToastUtils.showLong(getGeneralString(R.string.company_not_set), -1); } /*((TextView) safeFindViewById(R.id.cl_search_input)).setHint(getGeneralString(R.string.please_enter_your_office_address));*/ }); safeFindViewById(R.id.siv_reachable).setOnClickListener(v -> { viewModel.clickChargingStation("700-7600-0322"); }); safeFindViewById(R.id.siv_reachable_icon).setOnClickListener(v -> { boolean b = viewModel.onReachableAreaButtonClicked(); if (b) { viewModel.clickChargingStation("700-7600-0322"); } updateReachableIcon(b); }); } private void setupObservers() { // 观察天气数据变化 sharedViewModel.getTableWeatherInfo().observe(getLifecycleOwner(), weatherInfo -> { // 使用 String.format 格式化温度 safeFindViewById(R.id.stv_weather_text, TextView.class).setText(String.format("%.1f°C", weatherInfo.temperature)); Logger.i(TAG, "Weather icon URL: " + weatherInfo.iconLink); // 使用 Glide 加载天气图标 GlideUtil.GlideParam glideParam = new GlideUtil.GlideParam(); glideParam.url = weatherInfo.iconLink; // 取消任何正在进行的加载请求 Glide.with(BusinessApplicationUtils.getApplication()).clear(safeFindViewById(R.id.siv_weather_icon, ImageView.class)); // 使用 GlideUtil 加载图片 GlideUtil.getInstance().load(BusinessApplicationUtils.getApplication(), safeFindViewById(R.id.siv_weather_icon), glideParam); }); // 观察地图模式变化 viewModel.getMapVisibleMode().observe(getLifecycleOwner(), mapVisibleEnum -> { int resId = R.drawable.ic_nav_2d_64_day; switch (mapVisibleEnum) { case MODE2D: { resId = R.drawable.ic_nav_2d_64_day; break; } case MODE3D: { resId = R.drawable.ic_nav_3d_64_day; break; } case NORTH2D: { resId = R.drawable.ic_nav_2dnorth_64_day; break; } } safeFindViewById(R.id.siv_map_model, ImageView.class).setImageResource(resId); }); // //poi 点击处理 viewModel.getShowPoiCardEvent().observe(getLifecycleOwner(), evnet -> { if (!evnet.isNeedCancel()) { showPoiCard(evnet.getContentIfNotHandled(), evnet.getTypeEnum()); } }); // 麦加指针 sharedViewModel.getMeccaCompass().observe(getLifecycleOwner(), bearing -> { safeFindViewById(R.id.siv_mecca_pointer).setRotation(bearing); }); //回车位处理 viewModel.getBackToCar().observe(getLifecycleOwner(), b -> { if (b) { safeFindViewById(R.id.cl_gocar_btn).setVisibility(View.VISIBLE); safeFindViewById(R.id.cl_weather).setVisibility(View.GONE); } else { safeFindViewById(R.id.cl_gocar_btn).setVisibility(View.GONE); safeFindViewById(R.id.cl_weather).setVisibility(View.VISIBLE); viewModel.stopBackToCarTimer(); } }); //比例尺 sharedViewModel.getSharedScale().observe(getLifecycleOwner(), scale -> { safeFindViewById(R.id.scale_bar, ScaleBarView.class).updateScale(scale); }); viewModel.getShowCardView().observe(getLifecycleOwner(), b -> { if (!b) { showPoiCardRemoveAll(); viewModel.resetShowCardView(); } }); } private void showReachableIcon() { if (GeneralStatus.getReachableIcon()) { safeFindViewById(R.id.divider6).setVisibility(View.VISIBLE); safeFindViewById(R.id.siv_reachable_icon).setVisibility(View.VISIBLE); } else { safeFindViewById(R.id.divider6).setVisibility(View.GONE); safeFindViewById(R.id.siv_reachable_icon).setVisibility(View.GONE); } } public void showContinueNaviCard() { if (!GeneralStatus.getContinueNaviState().isInNavi()) { return; } GeneralStatus.setContinueNaviState(new ContinueNaviState()); if (continueNaviDialog == null) { continueNaviDialog = new ContinueNaviDialog(abstractBinding.getRoot().getContext()); } continueNaviDialog.setOnDialogDoubleBtnClickListener(new ContinueNaviDialog.ContinueNaviDialogClickListener() { @Override public void onConfirm() { ContinueNaviController.getInstance().startContinueNavi(); } @Override public void onCancel() { } }); continueNaviDialog.show(); } private void registerMainMapGesturesListener() { viewModel.registerMainMapGesturesListener(); } private void unregisterMainMapGesturesListener() { viewModel.unregisterMainMapGesturesListener(); } /** * @brief 删除基础地图手势监听器。 * <p> * 此函数用于删除基础地图手势的侦听器。基础地图手势包括 * 平移、缩放和旋转地图等操作。在调用此函数之后, * 地图将不再响应这些手势。 */ private void removeBaseMapGesturesListener() { viewModel.removeBaseMapGesturesListener(); } private void showPoiCard(final CardData cardData, PoiTypeEnum typeEnum) { viewModel.setBlockBackToCarTimer(true); viewModel.resetShowCardView(); if (typeEnum == PoiTypeEnum.POI) { showDeepPoiCardHere(cardData); } else if (typeEnum == PoiTypeEnum.TRAFFIC) { showTrafficPoiCardHere(cardData); } else if (typeEnum == PoiTypeEnum.LOCHERE) { showLocPoiCardHere(cardData); } } private void showLocPoiCardHere(final CardData cardData) { if (!(cardData instanceof LocPoiCardData)) { return; } LocPoiCardData poiCardData = (LocPoiCardData) cardData; LocPoiCardView cardView = new LocPoiCardView(safeFindViewById(R.id.ct_showPoiCard).getContext(), poiCardData); cardView.setListener(new PoiCardListener() { @Override public boolean onClick(View view, Object data) { int id = view.getId(); if (id == R.id.scl_nearby_bg) { viewModel.handleSearchButton(data); } else if (id == R.id.scl_favorite) { if (data instanceof LocPoiCardData) { CollectPoint collectPoint = ConverUtils.convertLocPoiCardDataToCollect((LocPoiCardData) data); boolean state = sharedViewModel.switchFavorite(collectPoint); cardView.switchFavorite(state); } } else if (id == R.id.siv_close) { showPoiCardRemoveAll(); } return true; } }); String id = poiCardData.getSearchArg().getId(); cardView.switchFavorite(FavoriteController.getInstance().isFavorited(id) == FavoriteService.type_ok); showPoiCardReplaceAll(); GeoCoordinates geo = new GeoCoordinates(poiCardData.getSearchArg().getLatitude(), poiCardData.getSearchArg().getLongitude()); MarkerController.getInstance().intsertSingleMarker(geo); safeFindViewById(R.id.ct_showPoiCard, ConstraintLayout.class).addView(cardView); safeFindViewById(R.id.ct_showPoiCard).setVisibility(View.VISIBLE); } private void showDeepPoiCardHere(final CardData cardData) { if (!(cardData instanceof DeepPoiCardData)) { return; } DeepPoiCardData poiCardData = (DeepPoiCardData) cardData; DeepPoiCardView cardView = new DeepPoiCardView(safeFindViewById(R.id.ct_showPoiCard).getContext(), poiCardData); cardView.setListener(new PoiCardListener() { @Override public boolean onClick(View view, Object data) { int id = view.getId(); if (id == R.id.scl_go_here) { viewModel.handleGoHereButton(data); } else if (id == R.id.scl_nearby_bg) { viewModel.handleSearchButton(data); } else if (id == R.id.scl_favorite) { if (data instanceof DeepPoiCardData) { CollectPoint collectPoint = ConverUtils.convertDeepPoiCardDataToCollect((DeepPoiCardData) data); boolean state = sharedViewModel.switchFavorite(collectPoint); cardView.switchFavorite(state); } } else if (id == R.id.siv_close) { showPoiCardRemoveAll(); } return true; } }); String id = ((DeepPoiCardData) cardData).getSearchArg().getId(); cardView.switchFavorite(FavoriteController.getInstance().isFavorited(id) == FavoriteService.type_ok); showPoiCardReplaceAll(); GeoCoordinates geo = new GeoCoordinates(((DeepPoiCardData) cardData).getSearchArg().getLatitude(), ((DeepPoiCardData) cardData).getSearchArg().getLongitude()); MarkerController.getInstance().intsertSingleMarker(geo); safeFindViewById(R.id.ct_showPoiCard, ConstraintLayout.class).addView(cardView); safeFindViewById(R.id.ct_showPoiCard).setVisibility(View.VISIBLE); } private void showTrafficPoiCardHere(final CardData cardData) { if (!(cardData instanceof TrafficPoiCardData)) { return; } TrafficPoiCardData poiCardData = (TrafficPoiCardData) cardData; TrafficPoiCardView cardView = new TrafficPoiCardView(safeFindViewById(R.id.ct_showPoiCard).getContext(), poiCardData, new PoiCardListener() { @Override public boolean onClick(View view, Object data) { int id = view.getId(); if (id == R.id.siv_close) { showPoiCardRemoveAll(); } return true; } }); showPoiCardReplaceAll(); safeFindViewById(R.id.ct_showPoiCard, ConstraintLayout.class).addView(cardView); MarkerController.getInstance().intsertSingleTrafficMarker(poiCardData.getTrafficEnum(), new GeoCoordinates(poiCardData.getSearchArg().getLatitude(), poiCardData.getSearchArg().getLongitude())); safeFindViewById(R.id.ct_showPoiCard).setVisibility(View.VISIBLE); } private void showPoiCardRemoveAll() { if (safeFindViewById(R.id.ct_showPoiCard).getVisibility() == View.VISIBLE) { viewModel.resetBackToCarTimer(); MarkerController.getInstance().removeSingleTrafficMarker(); MarkerController.getInstance().removeSingleMarker(); safeFindViewById(R.id.ct_showPoiCard, ConstraintLayout.class).removeAllViews(); } safeFindViewById(R.id.ct_showPoiCard).setVisibility(View.GONE); } private void showPoiCardReplaceAll() { MarkerController.getInstance().removeSingleTrafficMarker(); MarkerController.getInstance().removeSingleMarker(); safeFindViewById(R.id.ct_showPoiCard, ConstraintLayout.class).removeAllViews(); } private void registerShowPoiCardAction() { safeFindViewById(R.id.ct_showPoiCard, ConstraintLayout.class).setOnHierarchyChangeListener(getShowPoiCardActionListener()); } private void unregisterShowPoiCardAction() { safeFindViewById(R.id.ct_showPoiCard, ConstraintLayout.class).setOnHierarchyChangeListener(null); safeFindViewById(R.id.scl_setting).setVisibility(TrafficPoiCardView.VISIBLE); } private ViewGroup.OnHierarchyChangeListener getShowPoiCardActionListener() { if (showPoiCardActionListener == null) { showPoiCardActionListener = new ViewGroup.OnHierarchyChangeListener() { @Override public void onChildViewAdded(View parent, View child) { // 当有子控件被添加时触发 safeFindViewById(R.id.scl_setting).setVisibility(TrafficPoiCardView.INVISIBLE); } @Override public void onChildViewRemoved(View parent, View child) { // 当有子控件被移除时触发 safeFindViewById(R.id.scl_setting).setVisibility(TrafficPoiCardView.VISIBLE); } }; } return showPoiCardActionListener; } @Override public void onCreateView() { registerMainMapGesturesListener(); refreshWeather(); initMeccaCompass(); initMapCenterListener(); registerCuriseListener(); changeViewShow(true); registerShowPoiCardAction(); registerEventBus(); registerLowBatteryListener(); showContinueNaviCard(); } @Override public void onStart() { showReachableIcon(); CruiseManager.getInstance().outOfCruiseState(); viewModel.clickBackToCar(); } @Override public void onHiddenChanged(boolean hidden) { changeViewShow(!hidden); CruiseManager.getInstance().outOfCruiseState(); showReachableIcon(); if (hidden) { unregisterMainMapGesturesListener(); viewModel.stopBackToCarTimer(); } else { registerMainMapGesturesListener(); executeRunnableTask(); } if (GeneralStatus.getSilent()) { viewModel.setMuted(true); } else { viewModel.setMuted(false); } } @Override public void onDestroyView() { removeBaseMapGesturesListener(); uninitMapCenterListener(); unregisterShowPoiCardAction(); unregisterEventBus(); unregisterLowBatteryListener(); } private void refreshWeather() { sharedViewModel.getWeather(); } private void initMeccaCompass() { sharedViewModel.initMeccaCompass(); } private void initMapCenterListener() { viewModel.initMapCenterListener(); } private void registerCuriseListener() { viewModel.registerCuriseListener(); } private void registerLowBatteryListener() { if (batteryChangeListener == null) { batteryChangeListener = new BatteryChangeManager.BatteryChangeListener() { @Override public void lowBatteryReminder(int battery) { LowBatteryReminderDialog.showDialog(abstractBinding.getRoot().getContext(), battery, v -> { viewModel.clickChargingStation("700-7600-0322"); }); } }; } BatteryChangeManager.getInstance().registerBatteryListener(batteryChangeListener); } private void unregisterLowBatteryListener() { BatteryChangeManager.getInstance().unregisterBatteryListener(batteryChangeListener); } private void changeViewShow(boolean b) { viewModel.setMainMapViewShow(b); } private void uninitMapCenterListener() { viewModel.uninitMapCenterListener(); } private void executeRunnableTask() { if (runnableTask != null) { Logger.i(TAG, "executeRunnableTask :"); TaskManager.postAfterQueue(runnableTask); } runnableTask = null; } @Subscribe(threadMode = ThreadMode.MAIN) public void onCruiseSelected(CruiseClickEvent event) { // 处理选择的邮轮 CruiseClickEvent.CruiseType type = event.getType(); Logger.i(TAG, "CruiseClickEvent.CruiseType :" + type.name()); switch (type) { case SEARCH -> { runnableTask = new Runnable() { @Override public void run() { viewModel.clickSearch(); } }; break; } case HOME -> { runnableTask = new Runnable() { @Override public void run() { viewModel.clickSearch(); } }; break; } case COMPANY -> { runnableTask = new Runnable() { @Override public void run() { viewModel.clickSearch(); } }; break; } case CHARGE -> { runnableTask = new Runnable() { @Override public void run() { viewModel.clickSearch(); } }; break; } case FAVORITE -> { runnableTask = new Runnable() { @Override public void run() { viewModel.clickSearch(); } }; break; } } } @Subscribe(threadMode = ThreadMode.MAIN) public void onFavoriteShowEvent(FavoriteShowEvent event) { // 处理选择的邮轮 Logger.i(TAG, "onFavoriteShowEvent.CruiseType :"); runnableTask = new Runnable() { @Override public void run() { showDeepPoiCardHere(event.getDeepPoiCardData()); } }; } private void registerEventBus() { if (!EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().register(this); } } private void unregisterEventBus() { EventBus.getDefault().unregister(this); } } 这里有没有地图选点并传输信息的逻辑?
08-02
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值