Activity nicht mehrfach öffnen

foxylion

foxylion

Fortgeschrittenes Mitglied
10
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
 
Es gibt ein REUSE Flag das man Intents mitgeben kann.
 
  • Danke
Reaktionen: foxylion
Und wie kann ich das ganze der "Main"-Activity mitgeben?
Weil ich starte ja das App ohne eine Activity über nen Intent aufzurufen.
 
Du musst die Flags dem Intent übergeben. Wie sonst rufst du denn eine Activity auf aus der Notification?
 
Manchmal macht mir diese Vermischung von Deutsch und Englisch echt Angst.
 
Dann bist du wohl kein Entwickler ;)
Intent, Activity und Notification sind Klassen, also Eigennamen und wie soll man ein Flag in deutsch nennen?
 
TobiTobsen schrieb:
Oder generell für Softwareentwicklung, eins der Design pattern, das Singleton.

JAVA DESIGN PATTERNS, Creational Patterns - Singleton Pattern

Hab noch nich viel Erfahrung mit Android, sollte dennoch klappen...

... 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:
 
Warum genau sind Singletons schlecht? Und was ist ein DI-Framework?
 
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.
 
the_alien schrieb:
Du musst die Flags dem Intent übergeben. Wie sonst rufst du denn eine Activity auf aus der Notification?
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?
 
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?
 
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
 
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?
 
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?
 
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));
 

Ähnliche Themen

Gemini-Media
Antworten
1
Aufrufe
1.815
swa00
swa00
SaniMatthias
Antworten
19
Aufrufe
940
swa00
swa00
M
  • maksimilian
Antworten
15
Aufrufe
1.695
maksimilian
M
Zurück
Oben Unten