2010-07-28 12 views
13

Ich habe eine Android-Anwendung, wenn es einen Dienst ausführt, möchte ich die Benachrichtigung in der Statusleiste anzeigen. Dann könnte der Benutzer zu einer anderen Anwendung navigieren, indem er die Taste HOME drückt. Wenn ich jedoch versuche, die zuvor ausgeführte Anwendung über das Benachrichtigungssymbol an den Anfang zu bringen, liegt ein Problem mit der vorhandenen Aktivität vor. Sogar ich erkläre es als "Single Top" -Modus (Ich möchte die vorhandene Aktivität ausführen, da ein verbundener Dienst ausgeführt wird), irgendwie wurde OnDestroy dieser Aktivität vor OnResume aufgerufen. Hier ist mein Code zum Erstellen des Benachrichtigungsobjekts. Könnten Sie mir bitte zeigen, was falsch ist? Vielen Dank.Wie Android vorhandene Aktivität nach vorne zu bringen über Benachrichtigung

private void showNotification() 
{ 

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

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

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

möglich Duplikate: 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

Antwort

-2

Wenn sich eine Aktivität im Hintergrund befindet, kann Android die Aktivität jederzeit beenden, um Ressourcen freizugeben. Vollständige Details zum Lebenszyklus finden Sie in der Dokumentation Activity.

Ihre Aktivität muss darauf vorbereitet sein, ihren Status in den Methoden onPause oder onSaveInstanceState zu speichern. Das Dokument, auf das oben verwiesen wird, enthält zusätzliche Details zum Speichern des persistenten Zustands.

+1

Ich denke nicht, dass die Aktivität von "onDestroy" aufgerufen werden soll. Nur "onPause" wird aufgerufen, wenn es in den Hintergrund geht. Und "onResume" wird aufgerufen, wenn es zurück zum Frontend geht. Wenn ich einfach auf das Anwendungssymbol klicke, um die Anwendung neu zu starten, gibt es kein Problem, nur "OnResume" wird aufgerufen. Wenn ich jedoch versuche, auf das Benachrichtigungssymbol zu klicken, wird die Aktivität "onDestroy" -> "OnResume" ausgeführt, was ein Problem verursacht. – user404012

+0

onPause wird aufgerufen, wenn es in den Hintergrund tritt. Wie in dem entsprechenden Dokument angegeben, kann Android jedoch jederzeit die Aktivität abbrechen, wenn die Ressourcen benötigt werden, sodass onDestroy aufgerufen wird. Sie können sich nicht darauf verlassen, dass onDestroy nicht aufgerufen wird, daher müssen Sie sich durch das Speichern des Zustands richtig damit befassen. –

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, intentionBack); Text sollte zuLaunch ich denke .. – Siddhesh

+0

+1 mit der Erwähnung, dass die PendingIntent-Deklaration sollte 'PendingIntent contentIntent = PendingIntent.getActivity (this, 0, toLaunch, 0);' – Calin

8

Ich würde empfehlen Sie dies tun,

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); 

.... 
} 

Die DummyActivity sollte einfach eine Tätigkeit sein, die sich immer in der oncreate Ereignis beendet ist.

In der Manifest-Datei, fügen Sie diese Zeilen

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

Ich hoffe, das ...

+0

Dies war die einzige Lösung, die für mich funktionierte Android 2.2+. Danke – Darcy

+0

Froh, dass es für Sie funktioniert :) –

+0

@Sharique Abdullah Dies ist eine sehr clevere Problemumgehung, danke :) – Lev

0

Ein anderer Weg, hilft Ihr Paket Absicht zu starten.

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()); 
    } 
Verwandte Themen