国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android 12系統(tǒng)源碼_系統(tǒng)欄管理服務(wù)(一)StatusBarManagerService服務(wù)介紹

這篇具有很好參考價(jià)值的文章主要介紹了Android 12系統(tǒng)源碼_系統(tǒng)欄管理服務(wù)(一)StatusBarManagerService服務(wù)介紹。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

在Android系統(tǒng)中,其他模塊想要和SystemUI模塊交互,基本都離不開StatusBarManagerService這個(gè)服務(wù)的,StatusBarManagerService顧名思義,就是狀態(tài)欄管理服務(wù),但其實(shí)這個(gè)服務(wù)不單單可以管理系統(tǒng)狀態(tài)欄,通過(guò)這個(gè)服務(wù),我們可以管理SystemUI模塊的大部分系統(tǒng)欄組件,比如狀態(tài)欄、導(dǎo)航欄、最近任務(wù)等,本篇文章我們先來(lái)簡(jiǎn)單認(rèn)識(shí)一下這個(gè)服務(wù)。

一、SystemServer創(chuàng)建StatusBarManagerService服務(wù)

1、和大部分系統(tǒng)服務(wù)一樣,StatusBarManagerService服務(wù)也是在SystemServer中被創(chuàng)建:

frameworks/base/service/java/com/android/server/SystemServer.java

public final class SystemServer {
    
    public static void main(String[] args) {
        new SystemServer().run();
    }
    
   private void run() {
    	...代碼省略...
        try {
            traceBeginAndSlog("StartServices");
            startBootstrapServices();//啟動(dòng)引導(dǎo)服務(wù)
            startCoreServices();//啟動(dòng)核心服務(wù)
            startOtherServices();//啟動(dòng)其他服務(wù)
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            traceEnd();
        }
    	...代碼省略...
    }
}

2、startOtherServices方法和WindowManagerService服務(wù)啟動(dòng)相關(guān)的代碼如下所示。

public final class SystemServer {
  
  private ActivityManagerService mActivityManagerService;
  private boolean mOnlyCore;
  private boolean mFirstBoot;

  private void startOtherServices() {
          ...代碼省略...
       	StatusBarManagerService statusBar = null;
          ...代碼省略...
        boolean isWatch = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
          ...代碼省略...    
        if (!isWatch) {
          traceBeginAndSlog("StartStatusBarManagerService");
           try {
                //系統(tǒng)欄管理服務(wù)
                statusBar = new StatusBarManagerService(context, wm);
                ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar);
            } catch (Throwable e) {
                reportWtf("starting StatusBarManagerService", e);
            }
            traceEnd();
        }
        ...代碼省略...            
    }
}     

二、StatusBarManagerService類定義

2.1 構(gòu)造方法

frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java

public class StatusBarManagerService extends IStatusBarService.Stub implements DisplayListener {
    /**
     * 構(gòu)造方法
     */
    public StatusBarManagerService(Context context) {
        mContext = context;

        LocalServices.addService(StatusBarManagerInternal.class, mInternalService);
        LocalServices.addService(GlobalActionsProvider.class, mGlobalActionsProvider);

        // We always have a default display.
        final UiState state = new UiState();
        mDisplayUiState.put(DEFAULT_DISPLAY, state);

        final DisplayManager displayManager =
                (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
        displayManager.registerDisplayListener(this, mHandler);
        mActivityTaskManager = LocalServices.getService(ActivityTaskManagerInternal.class);
    }

}

2.2 繼承的父類

StatusBarManagerService繼承自IStatusBarService.Stub,IStatusBarService.aidl文件如下所示。

frameworks/base/core/java/com/android/internal/statusbar/IStatusBarService.aidl

interface IStatusBarService
{
    @UnsupportedAppUsage
    void expandNotificationsPanel();
    @UnsupportedAppUsage
    void collapsePanels();
    void togglePanel();
    @UnsupportedAppUsage
    void disable(int what, IBinder token, String pkg);
    void disableForUser(int what, IBinder token, String pkg, int userId);
    void disable2(int what, IBinder token, String pkg);
    void disable2ForUser(int what, IBinder token, String pkg, int userId);
    int[] getDisableFlags(IBinder token, int userId);
    void setIcon(String slot, String iconPackage, int iconId, int iconLevel, String contentDescription);
    @UnsupportedAppUsage
    void setIconVisibility(String slot, boolean visible);
    @UnsupportedAppUsage
    void removeIcon(String slot);
    void setImeWindowStatus(int displayId, in IBinder token, int vis, int backDisposition,
            boolean showImeSwitcher, boolean isMultiClientImeEnabled);
    void expandSettingsPanel(String subPanel);

    // ---- Methods below are for use by the status bar policy services ----
    // You need the STATUS_BAR_SERVICE permission
    RegisterStatusBarResult registerStatusBar(IStatusBar callbacks);
    void onPanelRevealed(boolean clearNotificationEffects, int numItems);
    void onPanelHidden();
    // Mark current notifications as "seen" and stop ringing, vibrating, blinking.
    void clearNotificationEffects();
    void onNotificationClick(String key, in NotificationVisibility nv);
    void onNotificationActionClick(String key, int actionIndex, in Notification.Action action, in NotificationVisibility nv, boolean generatedByAssistant);
    void onNotificationError(String pkg, String tag, int id,
            int uid, int initialPid, String message, int userId);
    void onClearAllNotifications(int userId);
    void onNotificationClear(String pkg, int userId, String key,
            int dismissalSurface, int dismissalSentiment, in NotificationVisibility nv);
    void onNotificationVisibilityChanged( in NotificationVisibility[] newlyVisibleKeys,
            in NotificationVisibility[] noLongerVisibleKeys);
    void onNotificationExpansionChanged(in String key, in boolean userAction, in boolean expanded, in int notificationLocation);
    void onNotificationDirectReplied(String key);
    void onNotificationSmartSuggestionsAdded(String key, int smartReplyCount, int smartActionCount,
            boolean generatedByAsssistant, boolean editBeforeSending);
    void onNotificationSmartReplySent(in String key, in int replyIndex, in CharSequence reply,
            in int notificationLocation, boolean modifiedBeforeSending);
    void onNotificationSettingsViewed(String key);
    void onNotificationBubbleChanged(String key, boolean isBubble, int flags);
    void onBubbleNotificationSuppressionChanged(String key, boolean isNotifSuppressed, boolean isBubbleSuppressed);
    void hideCurrentInputMethodForBubbles();
    void grantInlineReplyUriPermission(String key, in Uri uri, in UserHandle user, String packageName);
    void clearInlineReplyUriPermissions(String key);
    void onNotificationFeedbackReceived(String key, in Bundle feedback);

    void onGlobalActionsShown();
    void onGlobalActionsHidden();

    /**
     * These methods are needed for global actions control which the UI is shown in sysui.
     */
    void shutdown();
    void reboot(boolean safeMode);

    void addTile(in ComponentName tile);
    void remTile(in ComponentName tile);
    void clickTile(in ComponentName tile);
    @UnsupportedAppUsage
    void handleSystemKey(in int key);

    /**
     * Methods to show toast messages for screen pinning
     */
    void showPinningEnterExitToast(boolean entering);
    void showPinningEscapeToast();

    // Used to show the authentication dialog (Biometrics, Device Credential)
    void showAuthenticationDialog(in PromptInfo promptInfo, IBiometricSysuiReceiver sysuiReceiver,
            in int[] sensorIds, boolean credentialAllowed, boolean requireConfirmation,
            int userId, long operationId, String opPackageName, long requestId,
            int multiSensorConfig);

    // Used to notify the authentication dialog that a biometric has been authenticated
    void onBiometricAuthenticated();
    // Used to set a temporary message, e.g. fingerprint not recognized, finger moved too fast, etc
    void onBiometricHelp(int modality, String message);
    // Used to show an error - the dialog will dismiss after a certain amount of time
    void onBiometricError(int modality, int error, int vendorCode);
    // Used to hide the authentication dialog, e.g. when the application cancels authentication
    void hideAuthenticationDialog();

    /**
     * Sets an instance of IUdfpsHbmListener for UdfpsController.
     */
    void setUdfpsHbmListener(in IUdfpsHbmListener listener);

    /**
     * Show a warning that the device is about to go to sleep due to user inactivity.
     */
    void showInattentiveSleepWarning();

    /**
     * Dismiss the warning that the device is about to go to sleep due to user inactivity.
     */
    void dismissInattentiveSleepWarning(boolean animated);

    /**
     * Notifies SystemUI to start tracing.
     */
    void startTracing();

    /**
     * Notifies SystemUI to stop tracing.
     */
    void stopTracing();

    /**
     * Returns whether SystemUI tracing is enabled.
     */
    boolean isTracing();

    /**
     * If true, suppresses the ambient display from showing. If false, re-enables the ambient
     * display.
     */
    void suppressAmbientDisplay(boolean suppress);

}

2.3 實(shí)現(xiàn)的接口

StatusBarManagerService實(shí)現(xiàn)了DisplayListener,該接口如下所示。

frameworks/base/core/java/android/hardware/display/DisplayManager.java文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-468852.html

public final class DisplayManager {
    /**
     * Listens for changes in available display devices.
     */
    public interface DisplayListener {
        /**
         * Called whenever a logical display has been added to the system.
         * Use {@link DisplayManager#getDisplay} to get more information about
         * the display.
         *
         * @param displayId The id of the logical display that was added.
         */
        void onDisplayAdded(int displayId);

        /**
         * Called whenever a logical display has been removed from the system.
         *
         * @param displayId The id of the logical display that was removed.
         */
        void onDisplayRemoved(int displayId);

        /**
         * Called whenever the properties of a logical {@link android.view.Display},
         * such as size and density, have changed.
         *
         * @param displayId The id of the logical display that changed.
         */
        void onDisplayChanged(int displayId);
    }
}

2.4 常用屬性

public class StatusBarManagerService extends IStatusBarService.Stub implements DisplayListener {
    private final Context mContext;

    private final Handler mHandler = new Handler();
    private NotificationDelegate mNotificationDelegate;
    private volatile IStatusBar mBar;
    private final ArrayMap<String, StatusBarIcon> mIcons = new ArrayMap<>();

    // for disabling the status bar
    private final ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>();
    private GlobalActionsProvider.GlobalActionsListener mGlobalActionListener;
    private final IBinder mSysUiVisToken = new Binder();

    private final Object mLock = new Object();
    private final DeathRecipient mDeathRecipient = new DeathRecipient();
    private final ActivityTaskManagerInternal mActivityTaskManager;
    private int mCurrentUserId;
    private boolean mTracingEnabled;

    private final SparseArray<UiState> mDisplayUiState = new SparseArray<>();
    @GuardedBy("mLock")
    private IUdfpsHbmListener mUdfpsHbmListener;

    /**
     * Private API used by NotificationManagerService.
     */
    private final StatusBarManagerInternal mInternalService = new StatusBarManagerInternal() {
        private boolean mNotificationLightOn;

        @Override
        public void setNotificationDelegate(NotificationDelegate delegate) {
            mNotificationDelegate = delegate;
        }

        @Override
        public void showScreenPinningRequest(int taskId) {
            if (mBar != null) {
                try {
                    mBar.showScreenPinningRequest(taskId);
                } catch (RemoteException e) {
                }
            }
        }

        @Override
        public void showAssistDisclosure() {
            if (mBar != null) {
                try {
                    mBar.showAssistDisclosure();
                } catch (RemoteException e) {
                }
            }
        }

        @Override
        public void startAssist(Bundle args) {
            if (mBar != null) {
                try {
                    mBar.startAssist(args);
                } catch (RemoteException e) {
                }
            }
        }

        @Override
        public void onCameraLaunchGestureDetected(int source) {
            if (mBar != null) {
                try {
                    mBar.onCameraLaunchGestureDetected(source);
                } catch (RemoteException e) {
                }
            }
        }

        /**
         * Notifies the status bar that a Emergency Action launch gesture has been detected.
         *
         * TODO (b/169175022) Update method name and docs when feature name is locked.
         */
        @Override
        public void onEmergencyActionLaunchGestureDetected() {
            if (SPEW) Slog.d(TAG, "Launching emergency action");
            if (mBar != null) {
                try {
                    mBar.onEmergencyActionLaunchGestureDetected();
                } catch (RemoteException e) {
                    if (SPEW) Slog.d(TAG, "Failed to launch emergency action");
                }
            }
        }

        @Override
        public void setDisableFlags(int displayId, int flags, String cause) {
            StatusBarManagerService.this.setDisableFlags(displayId, flags, cause);
        }

        @Override
        public void toggleSplitScreen() {
            enforceStatusBarService();
            if (mBar != null) {
                try {
                    mBar.toggleSplitScreen();
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void appTransitionFinished(int displayId) {
            enforceStatusBarService();
            if (mBar != null) {
                try {
                    mBar.appTransitionFinished(displayId);
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void toggleRecentApps() {
            if (mBar != null) {
                try {
                    mBar.toggleRecentApps();
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void setCurrentUser(int newUserId) {
            if (SPEW) Slog.d(TAG, "Setting current user to user " + newUserId);
            mCurrentUserId = newUserId;
        }


        @Override
        public void preloadRecentApps() {
            if (mBar != null) {
                try {
                    mBar.preloadRecentApps();
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void cancelPreloadRecentApps() {
            if (mBar != null) {
                try {
                    mBar.cancelPreloadRecentApps();
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void showRecentApps(boolean triggeredFromAltTab) {
            if (mBar != null) {
                try {
                    mBar.showRecentApps(triggeredFromAltTab);
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
            if (mBar != null) {
                try {
                    mBar.hideRecentApps(triggeredFromAltTab, triggeredFromHomeKey);
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void collapsePanels() {
            if (mBar != null) {
                try {
                    mBar.animateCollapsePanels();
                } catch (RemoteException ex) {
                }
            }
        }

        @Override
        public void dismissKeyboardShortcutsMenu() {
            if (mBar != null) {
                try {
                    mBar.dismissKeyboardShortcutsMenu();
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void toggleKeyboardShortcutsMenu(int deviceId) {
            if (mBar != null) {
                try {
                    mBar.toggleKeyboardShortcutsMenu(deviceId);
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void showChargingAnimation(int batteryLevel) {
            if (mBar != null) {
                try {
                    mBar.showWirelessChargingAnimation(batteryLevel);
                } catch (RemoteException ex){
                }
            }
        }

        @Override
        public void showPictureInPictureMenu() {
            if (mBar != null) {
                try {
                    mBar.showPictureInPictureMenu();
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void setWindowState(int displayId, int window, int state) {
            if (mBar != null) {
                try {
                    mBar.setWindowState(displayId, window, state);
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void appTransitionPending(int displayId) {
            if (mBar != null) {
                try {
                    mBar.appTransitionPending(displayId);
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void appTransitionCancelled(int displayId) {
            if (mBar != null) {
                try {
                    mBar.appTransitionCancelled(displayId);
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void appTransitionStarting(int displayId, long statusBarAnimationsStartTime,
                long statusBarAnimationsDuration) {
            if (mBar != null) {
                try {
                    mBar.appTransitionStarting(
                            displayId, statusBarAnimationsStartTime, statusBarAnimationsDuration);
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void setTopAppHidesStatusBar(boolean hidesStatusBar) {
            if (mBar != null) {
                try {
                    mBar.setTopAppHidesStatusBar(hidesStatusBar);
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public boolean showShutdownUi(boolean isReboot, String reason) {
            if (!mContext.getResources().getBoolean(R.bool.config_showSysuiShutdown)) {
                return false;
            }
            if (mBar != null) {
                try {
                    mBar.showShutdownUi(isReboot, reason);
                    return true;
                } catch (RemoteException ex) {}
            }
            return false;
        }

        // TODO(b/118592525): support it per display if necessary.
        @Override
        public void onProposedRotationChanged(int rotation, boolean isValid) {
            if (mBar != null){
                try {
                    mBar.onProposedRotationChanged(rotation, isValid);
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void onDisplayReady(int displayId) {
            if (mBar != null) {
                try {
                    mBar.onDisplayReady(displayId);
                } catch (RemoteException ex) {}
            }
        }

        @Override
        public void onRecentsAnimationStateChanged(boolean running) {
            if (mBar != null) {
                try {
                    mBar.onRecentsAnimationStateChanged(running);
                } catch (RemoteException ex) {}
            }

        }

        @Override
        public void onSystemBarAttributesChanged(int displayId, @Appearance int appearance,
                AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme,
                @Behavior int behavior, InsetsVisibilities requestedVisibilities,
                String packageName) {
            getUiState(displayId).setBarAttributes(appearance, appearanceRegions,
                    navbarColorManagedByIme, behavior, requestedVisibilities, packageName);
            if (mBar != null) {
                try {
                    mBar.onSystemBarAttributesChanged(displayId, appearance, appearanceRegions,
                            navbarColorManagedByIme, behavior, requestedVisibilities, packageName);
                } catch (RemoteException ex) { }
            }
        }

        @Override
        public void showTransient(int displayId, @InternalInsetsType int[] types,
                boolean isGestureOnSystemBar) {
            getUiState(displayId).showTransient(types);
            if (mBar != null) {
                try {
                    mBar.showTransient(displayId, types, isGestureOnSystemBar);
                } catch (RemoteException ex) { }
            }
        }

        @Override
        public void abortTransient(int displayId, @InternalInsetsType int[] types) {
            getUiState(displayId).clearTransient(types);
            if (mBar != null) {
                try {
                    mBar.abortTransient(displayId, types);
                } catch (RemoteException ex) { }
            }
        }

        @Override
        public void showToast(int uid, String packageName, IBinder token, CharSequence text,
                IBinder windowToken, int duration,
                @Nullable ITransientNotificationCallback callback) {
            if (mBar != null) {
                try {
                    mBar.showToast(uid, packageName, token, text, windowToken, duration, callback);
                } catch (RemoteException ex) { }
            }
        }

        @Override
        public void hideToast(String packageName, IBinder token) {
            if (mBar != null) {
                try {
                    mBar.hideToast(packageName, token);
                } catch (RemoteException ex) { }
            }
        }

        @Override
        public void requestWindowMagnificationConnection(boolean request) {
            if (mBar != null) {
                try {
                    mBar.requestWindowMagnificationConnection(request);
                } catch (RemoteException ex) { }
            }
        }

        @Override
        public void handleWindowManagerLoggingCommand(String[] args, ParcelFileDescriptor outFd) {
            if (mBar != null) {
                try {
                    mBar.handleWindowManagerLoggingCommand(args, outFd);
                } catch (RemoteException ex) { }
            }
        }

        @Override
        public void setNavigationBarLumaSamplingEnabled(int displayId, boolean enable) {
            if (mBar != null) {
                try {
                    mBar.setNavigationBarLumaSamplingEnabled(displayId, enable);
                } catch (RemoteException ex) { }
            }
        }

        @Override
        public void setUdfpsHbmListener(IUdfpsHbmListener listener) {
            synchronized (mLock) {
                mUdfpsHbmListener = listener;
            }
            if (mBar != null) {
                try {
                    mBar.setUdfpsHbmListener(listener);
                } catch (RemoteException ex) { }
            }
        }
    };

    private final GlobalActionsProvider mGlobalActionsProvider = new GlobalActionsProvider() {
        @Override
        public boolean isGlobalActionsDisabled() {
            // TODO(b/118592525): support global actions for multi-display.
            final int disabled2 = mDisplayUiState.get(DEFAULT_DISPLAY).getDisabled2();
            return (disabled2 & DISABLE2_GLOBAL_ACTIONS) != 0;
        }

        @Override
        public void setGlobalActionsListener(GlobalActionsProvider.GlobalActionsListener listener) {
            mGlobalActionListener = listener;
            mGlobalActionListener.onGlobalActionsAvailableChanged(mBar != null);
        }

        @Override
        public void showGlobalActions() {
            if (mBar != null) {
                try {
                    mBar.showGlobalActionsMenu();
                } catch (RemoteException ex) {}
            }
        }
    };

}

到了這里,關(guān)于Android 12系統(tǒng)源碼_系統(tǒng)欄管理服務(wù)(一)StatusBarManagerService服務(wù)介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • springboot基于Web的社區(qū)醫(yī)院管理服務(wù)系統(tǒng)源碼和論文

    springboot基于Web的社區(qū)醫(yī)院管理服務(wù)系統(tǒng)源碼和論文

    在Internet高速發(fā)展的今天,我們生活的各個(gè)領(lǐng)域都涉及到計(jì)算機(jī)的應(yīng)用,其中包括 社區(qū)醫(yī)院管理服務(wù)系統(tǒng) 的網(wǎng)絡(luò)應(yīng)用,在外國(guó)線上管理系統(tǒng)已經(jīng)是很普遍的方式,不過(guò) 國(guó)內(nèi)的 管理系統(tǒng) 可能 還處于起步階段 。社區(qū)醫(yī)院管理服務(wù)系統(tǒng) 具有社區(qū)醫(yī)院信息管理功能的選擇。社區(qū)醫(yī)

    2024年01月20日
    瀏覽(34)
  • Java版工程行業(yè)管理系統(tǒng)源碼-專業(yè)的工程管理軟件-em提供一站式服務(wù) em

    Java版工程行業(yè)管理系統(tǒng)源碼-專業(yè)的工程管理軟件-em提供一站式服務(wù) em

    ? ?Java版工程項(xiàng)目管理系統(tǒng) Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分離 功能清單如下: 首頁(yè) 工作臺(tái):待辦工作、消息通知、預(yù)警信息,點(diǎn)擊可進(jìn)入相應(yīng)的列表 項(xiàng)目進(jìn)度圖表:選擇(總體或單個(gè))項(xiàng)目顯示1、項(xiàng)目進(jìn)度圖表? 2、項(xiàng)目信息 施工地圖:1、展示當(dāng)前角色權(quán)限

    2024年02月13日
    瀏覽(22)
  • java spring cloud 企業(yè)工程管理系統(tǒng)源碼+二次開發(fā)+定制化服務(wù)

    java spring cloud 企業(yè)工程管理系統(tǒng)源碼+二次開發(fā)+定制化服務(wù)

    鴻鵠工程項(xiàng)目管理系統(tǒng) Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分離構(gòu)建工程項(xiàng)目管理系統(tǒng) 1. 項(xiàng)目背景 一、隨著公司的快速發(fā)展,企業(yè)人員和經(jīng)營(yíng)規(guī)模不斷壯大。為了提高工程管理效率、減輕勞動(dòng)強(qiáng)度、提高信息處理速度和準(zhǔn)確性,公司對(duì)內(nèi)部工程管理的提升提出了更高

    2024年02月09日
    瀏覽(20)
  • 基于微服務(wù)、Java、Springcloud、Vue、MySQL開發(fā)的智慧工地管理系統(tǒng)源碼

    基于微服務(wù)、Java、Springcloud、Vue、MySQL開發(fā)的智慧工地管理系統(tǒng)源碼

    智慧工地聚焦施工現(xiàn)場(chǎng)崗位一線,圍繞“人、機(jī)、料、法、環(huán)”五大要素,數(shù)字化工地平臺(tái)與現(xiàn)場(chǎng)多個(gè)子系統(tǒng)的互聯(lián)實(shí)現(xiàn)了工地業(yè)務(wù)間的互聯(lián)互通和協(xié)同共享。數(shù)字化工地管理平臺(tái)能夠盤活工地各大項(xiàng)目之間孤立的信息系統(tǒng),實(shí)現(xiàn)數(shù)據(jù)的統(tǒng)一接入、處理與維護(hù),提高現(xiàn)有系統(tǒng)

    2024年02月11日
    瀏覽(23)
  • java spring cloud 企業(yè)工程管理系統(tǒng)源碼+二次開發(fā)+定制化服務(wù) em

    java spring cloud 企業(yè)工程管理系統(tǒng)源碼+二次開發(fā)+定制化服務(wù) em

    ?Java版工程項(xiàng)目管理系統(tǒng) Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分離 功能清單如下: 首頁(yè) 工作臺(tái):待辦工作、消息通知、預(yù)警信息,點(diǎn)擊可進(jìn)入相應(yīng)的列表 項(xiàng)目進(jìn)度圖表:選擇(總體或單個(gè))項(xiàng)目顯示1、項(xiàng)目進(jìn)度圖表? 2、項(xiàng)目信息 施工地圖:1、展示當(dāng)前角色權(quán)限下

    2024年02月13日
    瀏覽(19)
  • 基于微信小程序的同城寵物服務(wù)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)(源碼+論文)_v_163

    基于微信小程序的同城寵物服務(wù)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)(源碼+論文)_v_163

    摘 要 本同城寵物服務(wù)店微信小程序劃分了微信用戶端和后臺(tái)管理員端,其中微信用戶端使用微信開發(fā)者工具開發(fā)和html、js、css、layui技術(shù),后臺(tái)管理員端使用IDEA開發(fā)工具和spingboot、fastjson、mybatis-plus、thymeleaf、shiro技術(shù)。微信端的用戶可以進(jìn)行微信授權(quán)登錄、搜索寵物用品、

    2024年01月21日
    瀏覽(19)
  • Android 12系統(tǒng)源碼_窗口管理(五)DisplayContent簡(jiǎn)介

    DisplayContent 用于管理屏幕,一塊DisplayContent 對(duì)象實(shí)例代表一個(gè)屏幕設(shè)備,這樣有多個(gè)屏幕的設(shè)備就可以創(chuàng)建多個(gè)DisplayContent 對(duì)象,雖然多數(shù)設(shè)備只有一個(gè)顯示屏,但它們同樣可以創(chuàng)建多個(gè) DisplayContent 對(duì)象,如投屏的時(shí)候,可以創(chuàng)建一個(gè)虛擬的DisplayContent。 1、DisplayContent對(duì)象實(shí)

    2024年02月07日
    瀏覽(20)
  • (附源碼)ssm基于微信小程序的社區(qū)老人健康管理服務(wù)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 畢業(yè)設(shè)計(jì)011513

    (附源碼)ssm基于微信小程序的社區(qū)老人健康管理服務(wù)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 畢業(yè)設(shè)計(jì)011513

    摘要 隨著現(xiàn)在網(wǎng)絡(luò)的快速發(fā)展,網(wǎng)絡(luò)的應(yīng)用在各行各業(yè)當(dāng)中它很快融入到了許多分類管理之中,他們利用網(wǎng)絡(luò)來(lái)做這個(gè)社區(qū)老人健康管理服務(wù)系統(tǒng),隨之就產(chǎn)生了“社區(qū)老人健康管理服務(wù)系統(tǒng) .”,這樣就讓社區(qū)老人健康管理服務(wù)系統(tǒng)更加方便簡(jiǎn)單。 對(duì)于本社區(qū)老人健康管理

    2024年02月08日
    瀏覽(31)
  • ssm基于微信小程序的社區(qū)老人健康管理服務(wù)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 畢業(yè)設(shè)計(jì)-附源碼011513

    ssm基于微信小程序的社區(qū)老人健康管理服務(wù)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 畢業(yè)設(shè)計(jì)-附源碼011513

    摘要 隨著現(xiàn)在網(wǎng)絡(luò)的快速發(fā)展,網(wǎng)絡(luò)的應(yīng)用在各行各業(yè)當(dāng)中它很快融入到了許多分類管理之中,他們利用網(wǎng)絡(luò)來(lái)做這個(gè)社區(qū)老人健康管理服務(wù)系統(tǒng),隨之就產(chǎn)生了“社區(qū)老人健康管理服務(wù)系統(tǒng) .”,這樣就讓社區(qū)老人健康管理服務(wù)系統(tǒng)更加方便簡(jiǎn)單。 對(duì)于本社區(qū)老人健康管理

    2024年02月09日
    瀏覽(37)
  • android h5 宿舍報(bào)修管理系統(tǒng)myeclipse開發(fā)mysql數(shù)據(jù)庫(kù)編程服務(wù)端java計(jì)算機(jī)程序設(shè)計(jì)

    android h5 宿舍報(bào)修管理系統(tǒng)myeclipse開發(fā)mysql數(shù)據(jù)庫(kù)編程服務(wù)端java計(jì)算機(jī)程序設(shè)計(jì)

    一、源碼特點(diǎn) ? android h5 宿舍報(bào)修管理系統(tǒng)是一套完善的WEB+android設(shè)計(jì)系統(tǒng),對(duì)理解JSP java,安卓app編程開發(fā)語(yǔ)言有幫助(系統(tǒng)采用web服務(wù)端+APP端 綜合模式進(jìn)行設(shè)計(jì)開發(fā)),系統(tǒng)具有完整的 源代碼和數(shù)據(jù)庫(kù),系統(tǒng)主要采用B/S模式開發(fā)。 二、功能介紹 本系統(tǒng)的最終用戶為學(xué)生

    2024年02月12日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包