2010-07-28 40 views
13

Ho un'applicazione Android, quando viene eseguito un servizio, voglio mostrare la notifica sulla barra di stato. Quindi l'utente può navigare verso un'altra applicazione premendo il tasto HOME. Tuttavia, quando provo a riportare l'applicazione in esecuzione precedente a Front tramite l'icona di notifica, c'è qualche problema con l'attività esistente. Anche io lo dichiaro come modalità "Single Top" (voglio eseguire l'attività esistente poiché è in esecuzione un servizio associato), in qualche modo l'attività OnDestroy è stata chiamata prima di OnResume. Ecco il mio codice di creazione dell'oggetto di notifica. Potresti per favore indicarmi che cosa è sbagliato. Grazie.Come portare l'attività Android esistente in primo piano tramite notifica

+0

possibili duplicati: http://stackoverflow.com/questions/4047683/android-how-to-resume-an-app-from-a-notification, http://stackoverflow.com/questions/5502427/resume-application-and-stack-from-notification – Philipp

risposta

-2

Quando un'attività è in background, Android può interrompere l'attività in qualsiasi momento per liberare risorse. Consultare la documentazione Activity per i dettagli completi sul ciclo di vita.

L'attività deve essere preparata per salvare il suo stato nei metodi onPause o onSaveInstanceState. Il documento di cui sopra ha ulteriori dettagli sul salvataggio dello stato persistente.

+1

Non penso che l'attività debba essere chiamata da "onDestroy". Solo "onPause" viene chiamato quando si passa allo sfondo. E "onResume" viene chiamato quando torna al frontend. Se faccio semplicemente clic sull'icona dell'applicazione per riavviare l'applicazione, non ci sono problemi, viene chiamato solo "OnResume". Tuttavia, se provo a fare clic sull'icona di notifica, l'attività diventa "onDestroy" -> "OnResume", che causa problemi. – user404012

+0

onPause viene chiamato quando passa in background. Tuttavia, come i suoi stati nel documento di riferimento, Android può scegliere di uccidere l'attività in qualsiasi momento se ha bisogno delle risorse, e quindi onDestroy verrà chiamato. Non si può dipendere dal fatto che onDestroy non verrà chiamato, quindi è necessario gestirlo correttamente salvando lo stato. –

23
private void showNotification() { 
    Intent toLaunch = new Intent(getApplicationContext(), MySingleTopActivity.class); 

    //add these two lines will solve your issue 
    toLaunch.setAction("android.intent.action.MAIN"); 
    toLaunch.addCategory("android.intent.category.LAUNCHER"); 

    PendingIntent intentBack = PendingIntent.getActivity(getApplicationContext(), 0, toLaunch, PendingIntent.FLAG_UPDATE_CURRENT); 

    notification.setLatestEventInfo(getApplicationContext(), getText(R.string.GPS_service_name), text, intentBack); 
    ... 
} 
+0

notification.setLatestEventInfo (getApplicationContext(), getText (R.string.GPS_service_name), text, intentBack); text dovrebbe essere a Launch mi sembra .. – Siddhesh

+0

+1 con la menzione che la dichiarazione PendingIntent dovrebbe essere 'PendingIntent contentIntent = PendingIntent.getActivity (this, 0, toLaunch, 0);' – Calin

8

vi consiglio di fare questo,

private void showNotification() 
{ 

Intent toLaunch = new Intent(getApplicationContext(), DummyActivity.class); 

// You'd need this line only if you had shown the notification from a Service 
toLaunch.setAction("android.intent.action.MAIN"); 

PendingIntent intentBack = PendingIntent.getActivity(getApplicationContext(), 0,toLaunch, PendingIntent.FLAG_UPDATE_CURRENT); 

.... 
} 

Il DummyActivity dovrebbe semplicemente essere un'attività che si finisce sempre in caso OnCreate.

Nel file manifest, aggiungere queste righe

<activity class=".DummyActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
    </intent-filter> 
</activity> 

Spero che questo aiuta ...

+0

Questa è stata l'unica soluzione che ha funzionato per me in Android 2.2+. Grazie – Darcy

+0

Contento che abbia funzionato per te :) –

+0

@Sharique Abdullah Questa è una soluzione molto intelligente, grazie :) – Lev

0

Un altro modo per lanciare il vostro intento pacchetto.

private void NotificationwithLaucherSelfPackage(Context context , int notification_id){ 
     Notification noti = new Notification.Builder(context) 
       .setContentTitle("Your Title") 
       .setContentText("Your Text") 
       .setSmallIcon(R.drawable.abc_ic_menu_share_mtrl_alpha) 
       .setContentIntent(PendingIntent.getActivity(context ,notification_id , getLauncherIntent(context) , PendingIntent.FLAG_UPDATE_CURRENT)) 
       .build(); 
     NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); 
    } 

private Intent getLauncherIntent(Context context){ 
     return context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); 
    } 
Problemi correlati