@Override public void onReceive(final Context context, final Intent intent) {
		final Uri data = intent.getData();
		if (data == null) return;
		final String pkg = data.getSchemeSpecificPart();
		if (pkg == null) return;
		if (Intent.ACTION_PACKAGE_CHANGED.equals(intent.getAction())) {
			final String[] changed_components = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST);
			if (changed_components == null || changed_components.length != 1 || ! pkg.equals(changed_components[0]))
				return;		// Skip component-level changes, we only care about package-level changes.
		} else if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction()) && intent.getBooleanExtra(Intent.EXTRA_REPLACING, false))
			return;			// Skip the package removal broadcast if package is being replaced. ACTION_PACKAGE_ADDED will arrive soon.
		onPackageEvent(pkg);
	}
Called by {@link AppLabelCache} when app label is lazily-loaded or updated (changed from cache)
mobile/src/main/java/com/oasisfeng/common/app/AppListProvider.java