1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Activity nicht mehrfach öffnen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von foxylion, 11.08.2010.

  1. foxylion, 11.08.2010 #1
    foxylion

    foxylion Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    109
    Erhaltene Danke:
    10
    Registriert seit:
    04.06.2010
    Phone:
    HTC One X
    Hallo,

    ich hab folgendes Problem:

    Ich hab eine ganz einfach Activity und führe diese aus.
    In der zur Activity zugehörigen View gibt es einen Button, wenn ich den klicke wird eine Notification ausgelöst.
    Öffne ich jetzt das Notification-Fenster und klicke diese an, öffnet sich das Activity Fenster ein zweites mal, kann ich das irgendwie verhindern und einfach das aktuelle Fenster das offen ist wieder in den Vordergrund bringen?

    Gruß & Danke
    foxyyy
     
  2. the_alien, 11.08.2010 #2
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Es gibt ein REUSE Flag das man Intents mitgeben kann.
     
    foxylion bedankt sich.
  3. foxylion, 12.08.2010 #3
    foxylion

    foxylion Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    109
    Erhaltene Danke:
    10
    Registriert seit:
    04.06.2010
    Phone:
    HTC One X
    Und wie kann ich das ganze der "Main"-Activity mitgeben?
    Weil ich starte ja das App ohne eine Activity über nen Intent aufzurufen.
     
  4. the_alien, 13.08.2010 #4
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Du musst die Flags dem Intent übergeben. Wie sonst rufst du denn eine Activity auf aus der Notification?
     
  5. Sasheem, 13.08.2010 #5
    Sasheem

    Sasheem Fortgeschrittenes Mitglied

    Beiträge:
    397
    Erhaltene Danke:
    39
    Registriert seit:
    18.03.2010
    Phone:
    Samsung Galaxy S4
    Manchmal macht mir diese Vermischung von Deutsch und Englisch echt Angst.
     
  6. the_alien, 13.08.2010 #6
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Dann bist du wohl kein Entwickler ;)
    Intent, Activity und Notification sind Klassen, also Eigennamen und wie soll man ein Flag in deutsch nennen?
     
  7. TobiTobsen, 15.08.2010 #7
    TobiTobsen

    TobiTobsen Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    09.08.2010
  8. the_alien, 15.08.2010 #8
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Nope, klappt nicht.
     
  9. ko5tik, 16.08.2010 #9
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    ... dieser Entwurfsmuster sollte aber vermieden werden (am Besten verboten,
    so was lasse ich den Entwicklern nicht durchgehen). Es hat jedoch eine Daseinsberechtigung im Android, solange wir keine DI-Framework haben
    (an dem ich gerade im Verborgenen arbeite) :cool:
     
  10. the_alien, 16.08.2010 #10
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Warum genau sind Singletons schlecht? Und was ist ein DI-Framework?
     
  11. ko5tik, 16.08.2010 #11
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
  12. TobiTobsen, 16.08.2010 #12
    TobiTobsen

    TobiTobsen Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    09.08.2010
    Aso... warum klappt das nicht?
     
  13. the_alien, 16.08.2010 #13
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Weil das Android System die Instanzen erstellt und eine Activity einen öffentlichen Konstruktor haben muss. Du sagst Android nur welche Activity Klasse er nehmen soll und die Instanz wird dann ausserhalb erstellt. Dementsprechend kann man Flags setzen die genauer sagen was mit der Activity passieren soll. Ein Reuse holt eine "alte" Activity aus dem Stack und benutzt diese.
     
  14. foxylion, 17.08.2010 #14
    foxylion

    foxylion Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    109
    Erhaltene Danke:
    10
    Registriert seit:
    04.06.2010
    Phone:
    HTC One X
    Okay, habs jetzt erst gesehn, wo das Intent hin ist, aber ich kann keine Flag die Ähnlichkeiten mit "Reuse" hat finden wenn ich addFlags als Methode benutze, wo finde ich die?
     
  15. the_alien, 17.08.2010 #15
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
  16. foxylion, 17.08.2010 #16
    foxylion

    foxylion Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    109
    Erhaltene Danke:
    10
    Registriert seit:
    04.06.2010
    Phone:
    HTC One X
    Okay, jetzt hab ichs soweit, dass sich die Activity aus der Notification maximal einmal starten lässt, allerdings sind das dann immer noch 2x wenn ich die Notification aus der Main-Acitivity starte, hier mal ein Beipsiel:

    Code:
    package de.foxylion.android.test;
    
    import android.app.Activity;
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    
    public class Test extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            
            String ns = Context.NOTIFICATION_SERVICE;
            NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
    
            int icon = R.drawable.icon;
            CharSequence tickerText = "Hello";
            long when = System.currentTimeMillis();
    
            Notification notification = new Notification(icon, tickerText, when);
    
            Context context = getApplicationContext();
            CharSequence contentTitle = "My notification";
            CharSequence contentText = "Hello World!";
            Intent notificationIntent = new Intent(this, this.getClass());
            notificationIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            
            PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    
            notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
            notification.flags = Notification.FLAG_NO_CLEAR;
    
    
            mNotificationManager.notify(1, notification);
        }
    }
    Wenn ich das App starte geht das Fenster einmal auf, dann beim klicken auf die Notification noch einmal. Ich hätte es gerne wirklich nur ein einziges mal.
    Muss ich dafür dann beim Starten des Apps die Activity versteckt lassen und eine neue sichtbare erzeugen, oder geht das einfacher?
     
  17. the_alien, 18.08.2010 #17
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Ok, langsam zweifel ich gerade an meinen Erinnerungen ;)
    Ich hab mich nochmal eingelesen und singleTop sollte das sein was du suchst. Du kannst es direkt in der Manifest.xml verankern für die Activity:
    Application Fundamentals | Android Developers
     
  18. foxylion, 18.08.2010 #18
    foxylion

    foxylion Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    109
    Erhaltene Danke:
    10
    Registriert seit:
    04.06.2010
    Phone:
    HTC One X
    Hm, mein Beispiel-App tut jetzt, da geht das Fenster nur noch einmal auf.

    Ich hab allerdings noch ne größere App in der ich eine Activity starten kann in der ich Einstellungen mache, wenn die offen ist öffnet sich die Main-Activity ein zweites mal, was ja nicht Sinn der Sache ist.

    Da die Notification permanent ist kann ich ja alle Activity-Fenster zumachen, und wieder auf den Launcer kommen, mach ich dann das App über die Notification auf, funktioniert alles genau so wie es soll, aber nur dann.

    Wie bring ich das jetzt alles zusammen, sodass die Activity auch wenn sie von Android gestartet wird von der Notification übernommen werden kann?
     
  19. the_alien, 18.08.2010 #19
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Damit ich das richtig verstehe.
    1) Du öffnest die App und siehst die Main Activity.
    Über die Notification kommst du immer genau zu dieser Instanz?

    2) Du öffnest die App und gehst in eine Sub Activity.
    Über die Notification wird die Main Activity ein zweites mal geöffnet?

    Welche Parameter hast du in der Manifest.xml und welche übergibst du bei der Notification?
     
  20. foxylion, 18.08.2010 #20
    foxylion

    foxylion Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    109
    Erhaltene Danke:
    10
    Registriert seit:
    04.06.2010
    Phone:
    HTC One X
    Ja genau.

    Die Notification bekommt folgende Flags:
    Code:
            Intent notificationIntent = new Intent(activity, activity.getClass());
            notificationIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            PendingIntent contentIntent = PendingIntent.getActivity(activity, 0, notificationIntent, 0);
            notification.contentIntent = contentIntent;
    Die Main Activity wird über die Manifest gestartet:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="de.foxylion.android.test"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon"
                     android:label="@string/app_name"
                     android:debuggable="true">
            <activity android:name="de.foxylion.android.test.Test"
                      android:label="@string/app_name"
                      android:launchMode="singleTop">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            
            <activity android:name="de.foxylion.android.test.persistence.Settings"
                      android:launchMode="singleTop">
            </activity>
        </application>
        
        <uses-sdk android:targetSdkVersion="6" android:minSdkVersion="6"/>
        
        <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    </manifest>
    und die SubActivity wird so gestartet:
    Code:
    startActivity(new Intent(this, de.foxylion.android.ogamecheck.persistence.Settings.class));
     

Diese Seite empfehlen