这几天在分析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
});
},