Autore Topic: [medio] Visualizzazione applicazioni aperte e chiuse di recente  (Letto 3751 volte)

Offline Agafi

  • Utente normale
  • ***
  • Post: 173
  • Respect: +10
    • svetlana-tomasevschi-perini
    • agafist
    • Mostra profilo
  • Dispositivo Android:
    SE Xperia Neo,LG Optimus One,Asus EEE Pad Transformer,HTC Magic Vodafone
  • Play Store ID:
    Agafi
  • Sistema operativo:
    Win7
+2
Livello di difficoltà: medio
Versione SDK utilizzata: 1.5
Link al sorgente: http://code.google.com/p/managermultitask/source/checkout

Applicazione che visualizza in una barra scorrevole le applicazioni Running e quelle Recently Closed.

Caso pratico:

Android mette a disposizione delle api per avere la lista delle applicazioni in esecuzione nel sistema e quelle che sono state chiuse di recente:

Codice (Java): [Seleziona]
ActivityManager actvityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<RunningTaskInfo> procInfos = actvityManager.getRunningTasks(NUMERO_PROCESSI);
List<RecentTaskInfo> recInfos = actvityManager.getRecentTasks(NUMERO_PROCESSI, ActivityManager.RECENT_WITH_EXCLUDED);

Grazie alle due liste caricate in alto abbiamo la possibilità di prelevare tutte quelle informazioni che ci serviranno per la visualizzazione dell'icona e della label del programma e soprattutto del package e della classe da far poi esguire come Intent o eventualmente da killare.

Codice (Java): [Seleziona]
...
TextView tv = null;
ImageView iv = null;
Drawable img = null;
View vApp = null;
img = parent.getPackageManager().getApplicationIcon(packageName);
if (oclKillActivity==null){              
        vApp = parent.getLayoutInflater().inflate(R.layout.app_recently, null);
}else{
        vApp = parent.getLayoutInflater().inflate(R.layout.app_running, null);
}
iv = (ImageView) vApp.findViewById(R.id.IV_icon);
iv.setOnClickListener(oclStartActivity);
iv.setOnLongClickListener(oclKillActivity);
iv.setTag(this);
iv.setOnClickListener(oclStartActivity);
tv = (TextView) vApp.findViewById(R.id.TV_label);
iv.setImageDrawable(img);
tv.setText(parent.getPackageManager().getApplicationLabel(parent.getPackageManager().getApplicationInfo(packageName, 0)));
tv.setVisibility(View.VISIBLE);
vApp.setMinimumWidth(60);
...

Per aggiungere dinamicamente ad una View altre view definite a livello di layout xml si può utilizzare la seguente sintassi:

Codice (Java): [Seleziona]
        context.getLayoutInflater().inflate(<layout xml>, <root optional>);  
La scelta stilistica di visualizzazione che abbiamo scelto con JD è stata quella di mostrare le icone delle applicazioni Running in primo piano e scrollabili da sinistra verso destra e di mostrare le applicazioni Recently Closed alla sinistra di quelle Running.
Cio' ha comportato l'estensione di alcuni Layout poichè  per conoscere la width delle View aggiunte a runtime bisognava aspettare il passaggio del metodo onMeausre di ogni singola view aggiunta.

Nel nostro caso:
(Metodo onMeasure(..) di LinearLayoutElencoTask)
Codice (Java): [Seleziona]
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        
        if (this.getWidth()>0){                
                dimensioneViewAppoggio=screenWidth-(this.getWidth()-posizioneFineRecentlyApplication);
                ImageView v=new ImageView(this.getContext());
                v.setImageResource(it.mp.multitask.R.drawable.sfondo);
                v.setMinimumWidth(dimensioneViewAppoggio);                             
                addViewInLayout(v, -1, new LayoutParams(dimensioneViewAppoggio, 1));                   
        }                              
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

Abbiamo dovuto poi spostare l'invocazione del metodo super.onMeasure(...) dopo i calcoli per fare in modo che la dimensione della View inserita (a caldo) fosse ricalcolata.

L'applicazione sarà possibile attivarla tramite long pressure del tasto "Search" (in qualsiasi applicazione ci troviamo) oppure come al solito nel menu contente tutte le applicazioni. Per fare questo abbiamo modellato l'Android Manifest in questo modo:
Codice (XML): [Seleziona]
<intent-filter>
        <action android:name="android.intent.action.SEARCH_LONG_PRESS" />
        <category android:name="android.intent.category.LAUNCHER"></category>
        <category android:name="android.intent.category.DEFAULT"></category>
        <action android:name="android.intent.action.MAIN"></action>
</intent-filter>



Spero che questo tutorial vi possa essere utile ;-)

Un saluto Agafi e JD




« Ultima modifica: 25 Maggio 2010, 14:17:45 CEST da JD »