这几天在分析b2g中OTA部分的代码,记录一下settings与system app的IPC方式。
说是“猥琐的”IPC方式,只是因为我没见过,呵呵,不过请教了同事,这种方式在b2g中还是比较常见的。
简单的说,这种IPC方式是通过系统的preference来实现的,某一个preference是一个共享的媒介,在ProcessA中set一个preference,然后在ProcessB中监听这个preference,preference的值就当做是ProcessA传递给ProcessB的数据。
结合代码看一下就明白了。
1. gaia/apps/settings/js/panels/about/update_check.js
settings作为ProcessA,将'gaia.system.checkForUpdates'设置为true。
this._settings.createLock().set({ 'gaia.system.checkForUpdates': true });
2. gaia/apps/system/js/update_manager.js
system app作为ProcessB,监听‘gaia.system.checkForUpdates’的变化,如果变化的值为true,则进行下一步check。
SettingsListener.observe('gaia.system.checkForUpdates', false, this.checkForUpdates.bind(this)); ………… checkForUpdates: function su_checkForUpdates(shouldCheck) { if (!shouldCheck) { return; } this._dispatchEvent('force-update-check'); if (!this._settings) { return; } var lock = this._settings.createLock(); lock.set({ 'gaia.system.checkForUpdates': false }); },