Qual è lo scopo di queste interfacce?
CharSequenceè un'interfaccia Java standard che rappresenta una sequenza di caratteri. Stringè l'implementazione concreta più comunemente usata di CharSequence, seguita da StringBuilder.
Spannedè un CharSequencecon "intervalli" che indica la formattazione da applicare a parti del testo, dove quegli intervalli non possono essere modificati.
Spannableè un Spanned, che aggiunge la possibilità di modificare gli intervalli (per aggiungere o rimuovere la formattazione), ma non per modificare il testo stesso.
SpannedStringè un'implementazione concreta Spanneddell'interfaccia.
SpannableStringè un'implementazione concreta Spannabledell'interfaccia.
in quali scenari è più comune usarli?
Quando c'è un metodo che ne restituisce uno (ad esempio, getText()su un EditText) o quando c'è un metodo che ne prende uno come parametro (ad esempio, setText()su a TextView).

Il tuo caso di utilizzo citato Html.fromHtml()è forse il più comune nello sviluppo Android convenzionale, poiché un TextViewcon a Spannedè molto più leggero di un WebView. Tuttavia, ci sono altri casi d'uso, come:
In quali casi è meglio evitare di utilizzarli?
Sono straordinariamente terribili nel combattere la calvizie, la rimozione della neve, la riparazione della pompa di calore, la preparazione di un soufflé, ecc.
:-)
Ci sono evidenti impatti sulle prestazioni da considerare quando si utilizza uno di essi?
Le interfacce, per definizione, non hanno "impatti sulle prestazioni": sono semplicemente una descrizione di un'API.
Non sono a conoscenza che SpannableStringsia significativamente più lento rispetto SpannedStringa qualsiasi operazione particolare. Tuttavia, SpannableStringBuilder(che consente di manipolare il testo oltre alle estensioni che formattano quel testo) potrebbe essere un po 'più lento di SpannableStringo SpannedStringper varie cose. Tuttavia, se le differenze di prestazioni sono sufficienti o meno importanti dipenderà dall'utilizzo.