Laucher启动的顺序如下:
Entry Point: src/launcher/index.js
=>React.createElement(RootContainer, { store });
=>RootContainer.js
=>Root.jsx
=> <AppManagementContainer />
=> AppManagementView.jsx <AppManagementView />
=> AppItem.jsx <AppItem />
=> <SettingsContainer />
=> <AboutView />
1、src/main/index.js: electronApp.on('ready', () => {}}
2、src/main/windows.js: openOfficialAppWindow(appName, sourceName)
2.1 src/main/apps.js:getOfficialAppWindow
2.1.1 src/main/apps.js:getOfficialAppsFromSource
2.1.1.1 src/main/config.js:getAppsJsonPath(读取apps.json文件并解析)
apps.json内如如下:
2.2 src/main/windows.js: openAppWindow
3、src/main/windows.js:openLauncherWindow()
最终显示的界面如下
4、启动Bluetooth Low Enery(点击Open)的流程
openAppSelected(app)
function mapDispatchToProps(dispatch) {
return {
onInstall: (name, source) =>
dispatch(AppsActions.installOfficialApp(name, source)),
onRemove: (name, source) =>
dispatch(AppsActions.removeOfficialApp(name, source)),
onReadMore: homepage => openUrl(homepage),
// Launcher actions
onAppSelected: app => dispatch(AppsActions.checkEngineAndLaunch(app)),
onCreateShortcut: app =>
dispatch(DesktopShortcutActions.createShortcut(app)),
onShowReleaseNotes: appid => dispatch(ReleaseNotes.show(appid)),
onUpgrade: (name, version, source) =>
dispatch(AppsActions.upgradeOfficialApp(name, version, source)),
setAppManagementShow: show =>
dispatch(AppsActions.setAppManagementShow(show)),
setAppManagementFilter: filter =>
dispatch(AppsActions.setAppManagementFilter(filter)),
};
}
checkEngineAndLaunch(app) ==> launch(app)
//appsActions.js
export function launch(app) {
// The apps in state are Immutable Maps which cannot be sent over IPC.
// Converting to plain JS object before sending to the main process.
const appObj = app.toJS();
const sharedData =
`App version: ${appObj.currentVersion};` +
` Engine version: ${appObj.engineVersion};`;
sendAppUsageData(EventAction.LAUNCH_APP, sharedData, appObj.name);
ipcRenderer.send('open-app', appObj);
}
通过ipcRender.send('open-app', appObj);发送命令给主进程,让主进程启动相应app
//src/main/index.js
ipcMain.on('open-app-launcher', () => {
windows.openLauncherWindow();
});
ipcMain.on('open-app', (event, app) => {
windows.openAppWindow(app);
});