2016-07-13 8 views
1

Ich versuche, meine Aktivität von einer Benachrichtigung fortzusetzen, aber es erstellt die Aktivität neu und wird nicht fortgesetzt.Fortsetzen der Aktivität von der Benachrichtigung, die onCreate aufruft

Wie alle Beiträge in Bezug auf dieses Problem, erwähnen Sie die Erstellung eines PendingIntent und die Einstellung mit den entsprechenden Flags (wie im folgenden Code gezeigt), und das Hinzufügen der singleTop|singleInstance AndroidManifest.

Mitteilung Code:

NotificationManager mNotifyMan = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
     mNotifyMan.cancelAll(); 
     Notification.Builder mNB = new Notification.Builder(this); 
     mNB.setOngoing(true); 
     Intent intent = new Intent(parentContext, main.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 
     PendingIntent pendingIntent = PendingIntent.getActivity(parentContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

     mNB.setContentIntent(pendingIntent); 
     mNB.setSmallIcon(R.drawable.ic_notify_icon); 
     mNB.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_noti_large)); 
     mNB.setContentTitle(Title); 
     mNB.setContentText(Message); 
     mNB.setColor(0); 
     mNotifyMan.notify(777, mNB.build()); 

Ich verstehe, muss man eine Absicht mit dem aktuellen Kontext übergeben.

Beim Fortsetzen einer Aktivität über onPause() unter onResume() wird der letzte Aktivitätsstatus wiederhergestellt und wiederhergestellt, d. H. Ein laufender Thread-Zähler hat inkrementierte Werte.

Problem:

Wenn aus der Meldung wieder aufzunehmen (d.h. Klick auf die Benachrichtigung), wird die Aktivität wiederhergestellt. Ich habe versucht, dies zu lösen, indem

wenn onPause() ausgeführt wird, den aktuellen Aktivitätsstatus über die Basisklasse an die Benachrichtigung senden und so die Benachrichtigung mit dem aktuellen Status neu erstellen.

Hier ist meine AndroidManifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.cynetstudios.wifimanager"> 

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-feature android:name="android.hardware.wifi" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme" 
     android:launchMode="singleInstance"> 

     <activity android:name="com.cynetstudios.frequencyselector.main" android:configChanges="orientation|screenSize|keyboardHidden"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service android:name="com.cynetstudios.frequencyselector.serviceWifiFreqManager" android:exported="false"/> 
    </application> 

</manifest> 

ich trivial fehlt etwas sein könnte, einen Rat?

+0

Der Startmodus 'singleInstance' ist nicht der richtige Weg, um damit umzugehen. Wenn Ihre App mehr als 1 "Aktivität" hat, wird Ihre App viel Zeit verlieren. Sie sollten http://stackoverflow.com/questions/5502427/resume-application-and-stack-from-notification/5502950#5502950 –

Antwort

2

Sie können Ihre Aktivität des launchModeSingleTask, SingleTop oder SingleInstance je nachdem, wie Sie einstellen, möchte, dass deine Aktivität wirkt.

Später können Sie die onNewIntent-Methode Ihrer Aktivität verarbeiten, wenn Ihre Aktivität geöffnet ist, wenn der Benutzer auf Ihre aktive Benachrichtigung klickt.

Auch Sie müssen Activity LaunchMode in dieser Atcitvity Teil definieren. Ich habe deine XML bearbeitet.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.cynetstudios.wifimanager"> 

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-feature android:name="android.hardware.wifi" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <activity android:name="com.cynetstudios.frequencyselector.main" 
      android:configChanges="orientation|screenSize|keyboardHidden" 
      android:launchMode="singleInstance"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service android:name="com.cynetstudios.frequencyselector.serviceWifiFreqManager" android:exported="false"/> 
    </application> 

</manifest> 

Ich hoffe, das wird Ihnen helfen.

1

launchMode sollte in Activity Abschnitt verwendet werden (nicht-Anwendung)

+0

danke anschauen, versuchen – KGCybeX

+0

danke, die Anleitung, die ich folgte, zeigte den launchMode in der Anwendung tag , das funktioniert, danke – KGCybeX

0

Versuchen

Intent.FLAG_ACTIVITY_CLEAR_TOP

mit

Intent.FLAG_ACTIVITY_NEW_TASK

Stellen Sie sie als Flags für die Absicht

+0

laut der Dokumentation, löscht CLEAR_TOP alle Aktivitäten bis zu diesem Punkt, so dass es nach oben – KGCybeX

+0

Das bedeutet, es wird keine neue Instanz der Aktivität starten – ammcom

0

dies Probieren Sie es Ihnen helfen kann:

intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

und als @Alexander setzen Android sagt: launchMode = "singleTop" in Aktivitäts-Tag

0
Intent intent = new Intent(Intent.ACTION_MAIN); 
intent.addCategory(Intent.CATEGORY_LAUNCHER); 
intent.setClass(this, main.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 
startActivity(intent); 

Sie können diese Absicht versuchen. Eine solche Absicht wird vom System-App-Launcher verwendet, der Ihre Aktivität nur anzeigt (nicht neu erstellt), wenn sie nicht getötet wird.

Verwandte Themen