DevCorner620

DevCorner: sostituiamoci a Google Now

Roberto Orgiu

Sappiamo tutti come si avvia Google Now, ma questa settimana ci chiederemo se è possibile sostituirci ad esso ed avviare la nostra applicazione al movimento verso l’alto caratteristico della ricerca di Big G.

La risposta, come in molti casi, è affermativa, ed è anche abbastanza semplice da realizzare: in realtà non ci chiederà che la creazione di un Drawable XML, la scelta di due icone e la modifica del nostro Manifest.

Iniziamo quindi a scegliere due icone, una per lo stato normale (quello che vediamo non appena iniziamo la pressione) ed una per lo stato di selezione, che verrà visualizzata quando andremo a raggiungere il punto di lancio dell’Activity, supponendo che si chiamino ic_normal ed ic_activated rispettivamente.

Creiamo quindi una cartella drawable e inseriamoci all’interno il nostro file launch_button.xml, che avrà il codice seguente:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:state_active="true" android:drawable="@drawable/ic_activated" />
<item android:state_focused="true" android:state_enabled="true" android:drawable="@drawable/ic_normal" />
<item android:state_enabled="true" android:drawable="@drawable/ic_normal" />
</selector>

Con questo codice creiamo quindi un’icona con base ic_normal, che viene modificata in ic_activated al bisogno, ma possiamo divertirci come preferiamo aggiungendo e modificando i parametri come specificato nelle linee guida per sviluppatori Android.

Ora che abbiamo creato la nostra icona, non ci resta che scegliere l’Activity che vogliamo lanciare (supponiamo si tratti di NowActivity) e modificare il Manifest, aggiungendo all’interno del tag relativo a questa finestra un nuovo intent-filter che ci permetterà di intercettare le chiamate di ASSIST (quelle cui risponde anche Google Now) ed avviare la nostra NowActivity.

<intent-filter>
<action android:name="android.intent.action.ASSIST"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

Per modificare invece le icone ed utilizzare i livelli appena creati, dobbiamo includere nella stessa sezione (giusto sotto la chiusura del filtro appena inserito) un tag meta-data, che specificherà al sistema come usare le icone

<meta-data android:name="com.android.systemui.action_assist_icon" android:resource="@drawable/launch_button" />

Ora, il nostro software è funzionale, ma per renderlo perfetto dobbiamo rendere indipendente il suo task, in modo da scollegarlo dal resto dell’applicazione e far sì che alla pressione del tasto back del nostro dispositivo non vengano visualizzate altre parti della nostra app (magari precedentemente visitate); inoltre, è bene escludere questa Activity dalle applicazioni recenti e dalla history di Android, in modo da non lasciar traccia del suo avvio. Per completare quindi il quadro, non ci resta che aggiungere questi meta-dati nel tag dell’Activity:

<activity android:name="NowActivity"
android:label="@string/app_name"
android:icon="@drawable/ic_activity"
android:taskAffinity=""
android:excludeFromRecents="true"
android:noHistory="true">

Se volete provare subito l’esempio appena descritto, fate un salto su AndroidFileHost, mentre su GitHub troverete i sorgenti relativi a questo DevCorner e sul nostro forum tutto l’aiuto di cui possiate aver bisogno.