All the protocols are mostly alike, but two exceptions:
1. tel: is using ACTION_DIAL instead of ACTION_VIEW
2. sms: is much more complicated then others.

Because there is no such shared inner logic here to merge the processing of each protocol, i choose to treat them separately.
Is it ok for you? @xingnan