Wie starte ich eine Aktivität ohne Benutzeroberfläche?

74

Ist es in irgendeiner Weise möglich, eine Aktivität über die Hauptfunktion ohne Benutzeroberfläche zu starten? dh gibt es eine Möglichkeit, eine Art "Wrapper" um eine andere Aktivität zu erstellen, dh durch Starten der Hauptaktivität gelangen Sie automatisch zu einer anderen Aktivität.

Wenn dies nicht möglich ist, gibt es eine Möglichkeit, die Hauptaktivität vom Stapel zu entfernen, sodass Sie durch Klicken auf die Schaltfläche "Zurück" nicht zu einer leeren Benutzeroberfläche gelangen? Hier ist ein Beispiel dafür, was ich versuche:

public class WrapperActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:555-1212"));
        startActivity(intent);
    }
}
fjmustak
quelle

Antworten:

32

Sie müssen das Intent-Flag hinzufügen.

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Oder

Rufen Sie " finish();" auf, nachdem Sie die Absicht ausgelöst haben.

Vishwanath
quelle
6
Ich bin nicht sicher, ob der FLAG_ACTIVITY_CLEAR_TOPTrick hier funktioniert, da der ActivityStart von einer anderen Anwendung stammt. finish()sollte aber auf jeden Fall funktionieren.
CommonsWare
Finish hinzugefügt (); und Translucent.NoTitleBar zu manifestieren. Klappt wunderbar.
Fjmustak
@Vishwanath Absicht grundsätzlich nicht unterstützen finish (). Kannst du detailliert beschreiben, wo ich Finish nennen kann und wie?
user170317
2
Sie rufen finish()am Ende der onCreate()Methode der Aktivität auf , kurz bevor sie zurückkehrt.
Intrepidis
128

Android bietet auch ein spezielles Thema dafür:

android:theme="@android:style/Theme.NoDisplay"
Justin
quelle
5
Dies funktioniert gut, führt aber auch dazu, dass das Symbol aus der App-Schublade verschwindet. Damit das Symbol angezeigt wird, müssen Sie die Antwort von Brian515 verwenden.
Lernen Sie OpenGL ES
1
Ich habe auch festgestellt, dass dies funktioniert, aber wenn ich ein Fortschrittsdialogfeld anzeige, wird standardmäßig Holo.Dark verwendet, das nicht dem Stil der restlichen App entspricht.
Andy Johnson
1
@LearnOpenGLES Ich verwende dieses Thema und erhalte immer noch das Symbol in der App-Schublade. Ich finde es auch eine bessere Option, da es eine Reihe von Werten auf NULL setzt, was mich zu der Annahme veranlasst, dass es effizienter ist. android.googlesource.com/platform/frameworks/base/+/refs/heads/…
Givanse
4
Damit dies funktioniert, muss Ihre Aktivität von Activity und nicht von AppCompactActivity erben.
Kof
4
@Kof: Sie können auch einfach den Inhalt von Theme.NoDisplay(nur 6 Attribute) in eine beliebige Erweiterung von kopieren Theme.AppCompat.*, um Ihren eigenen zu erstellen Theme.AppCompat.NoDisplay, der mit funktioniert AppCompatActivity.
MH.
53

Verwenden Sie in Ihrem Manifest das Thema, wenn Sie die Aktivität deklarieren "@android:style/Theme.Translucent.NoTitleBar"

Ex:

<activity android:name="yourActivityName" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar">
seltsamer Quark
quelle
3
Dies ist die richtige Antwort, wenn die App auch in der App-Schublade angezeigt werden soll.
Lernen Sie OpenGL ES
3
Dies öffnet immer noch unsichtbare Benutzeroberfläche, die Sie zurückdrücken müssen, bevor Sie das Telefon weiter verwenden
Jemshit Iskenderov
11

Nur für den Fall, dass Sie Android 6.0+ verwenden oder das Target SDK 23+ ist, führt ein Thema android:theme = "@android:style/Theme.NoDisplay"zu einem fehlerhaften Absturz did not call finish() prior to onResume() completing. Dies ist in der Tat ein Fehler, der von Google-Entwicklern hier erkannt wurde .

Es wird daher empfohlen, eine Aktivität mit folgendem Thema als Problemumgehung zu verwenden.

android:theme = "@android:style/Theme.Translucent.NoTitleBar"

arunwithasmile
quelle
Sie können einen Thread oder eine ausführbare
Datei
8

Verwenden von

<activity android:name="yourActivityName" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar">

erwähnt von Brian515 funktioniert super. Diese Methode ist nützlich, um eine Einstiegspunktaktivität zu erstellen, die entscheidet, welche Aktivität aufgerufen, gestartet, Dienste usw. bereitgestellt werden sollen, ohne dass dem Benutzer eine Benutzeroberfläche angezeigt werden muss. Denken finish()Sie daran, zu verwenden, nachdem Sie Ihre Absicht begonnen haben.

Tmac
quelle
7

Ich denke, das würde dir sehr helfen:

<activity  android:name = "MyActivity" 
          android:label = "@string/app_name" 
          android:theme = "@android:style/Theme.NoDisplay" >
Fermin Genao
quelle
Willkommen bei Stack Overflow! Der Stapelüberlauf funktioniert im Allgemeinen auf Englisch. Bitte stellen Sie sicher, dass Ihr Beitrag für andere so nützlich wie möglich ist, indem Sie ihn übersetzen.
Nathan Tuggy
Achten Sie bei dieser Methode darauf, den Kommentar von
arunwithasmile
Wo würde ich das hinstellen?
dan51 vor
3

Fügen Sie in Ihrem Manifest @android:style/Theme.Translucent.NoTitleBar"wie in einigen der obigen Antworten erwähnt hinzu.

Entfernen Sie auch die setContentView(R.layout.your_activity);Zeile aus Ihrer Datei activity.java.

Vipul Behl
quelle
Wie bearbeite ich eine Android Manifest Datei?
dan51 vor
3

Ich verwende AppCompatActivityund die in dieser SO bereitgestellten Lösungen haben mein Problem nicht gelöst. Hier ist, was für mich funktioniert hat.

Ich habe folgendes in mein hinzugefügt styles.xml.

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
</style>

<style name="AppTheme.NoDisplay">
    <item name="android:windowBackground">@null</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@null</item>
    <item name="android:windowDisablePreview">true</item>
    <item name="android:windowNoDisplay">true</item>
</style>

Für jede Aktivität, bei der ich die Anzeige deaktivieren möchte, habe ich Folgendes geändert:

<activity 
    android:name=".NoDisplayActivity"
    android:theme="@style/AppTheme.NoDisplay">

Prost!

user1506104
quelle
Wo würde ich das zweite Stück Code ablegen?
dan51 vor
Es sollte in Ihre Manifestdatei gehen.
user1506104 vor
2

Sieht ähnlich aus wie die hier gestellte Frage: Entfernen einer Aktivität aus dem Verlaufsstapel

Wenn ja, können Sie Folgendes verwenden:

FLAG_ACTIVITY_NO_HISTORY

Dies sollte funktionieren, um Aktivitäten vom Stapel zu löschen.

Wenn Sie aktuelle Apps ausschließen müssen (lange Home-Taste drücken), können Sie dieses Flag verwenden:

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

Sreedevi J.
quelle
Dies hat nichts mit dem Entfernen einer Aktivität aus dem Verlaufsstapel zu tun.
Justin
@Justin Ich bin mir ziemlich sicher, dass die Frage diesen Teil hat: "Wenn dies nicht möglich ist, gibt es eine Möglichkeit, die Hauptaktivität vom Stapel zu entfernen, damit Sie durch Klicken auf die Schaltfläche" Zurück "nicht zu einer leeren Benutzeroberfläche gelangen?" Was ich glaube, ist ziemlich eng mit dem Geschichtsstapel verbunden, aber ich könnte mich irren.
Sreedevi J
Ich entschuldige mich ... Ich habe die letzten beiden Sätze in der Frage nicht bemerkt. Ich glaube jedenfalls nicht, dass dies das Problem löst. Ich kann mich irren, aber ich glaube nicht, dass eines dieser Flags die Aktivität vom Backstack entfernen würde (z. B. würde das Drücken der Zurück-Taste den Benutzer immer noch zur leeren Benutzeroberfläche führen)
Justin
@ Justin, nein, der Benutzer wird nicht zu einer leeren Benutzeroberfläche zurückgeführt. Dieses Flag oder das Manifest-Äquivalent fügt die Aktivitäten nicht zum Stapel hinzu, sodass Sie nicht mehr darauf zurückgreifen können.
Sreedevi J
2

Wenn Sie nicht mit der Benutzeroberfläche interagieren, klingt das, was Sie versuchen, eher wie ein Android-Dienst.

sfratini
quelle
3
In einigen Fällen ja .... aber nicht in allen Fällen. Es schien etwas zu sein, das oft genug auftauchte - dass die Android-Framework-Ingenieure ein spezielles Thema für Aktivitäten ohne Benutzeroberfläche erstellt haben.
Justin
Wenn ich zum Beispiel eine Bibliothek eines Drittanbieters zum Auswählen von Schriftarten oder Farben verwende, ist normalerweise die Aktivität, die sie startet, erforderlich, um eine Rückrufschnittstelle zu implementieren. Möglicherweise starte ich den Farbwähler jedoch über ein Popup-Fenster. Wenn ich den gesamten Ablauf im Code für mein Popup-Fenster kapseln möchte, anstatt die Benutzeroberfläche meiner Hauptaktivität zu verschmutzen, benötige ich eine temporäre (unsichtbare) Aktivität, um als Listener für die Farbauswahl zu fungieren
Stevey
2

Ich hatte verwendet moveTaskToBack(true)in onResume()setzen die gesamte Aktivität Stapel im Hintergrund.

Tarak
quelle
1
Ich musste diese Methode verwenden, weil ich möchte, dass die Aktivität einige Male angezeigt wird, aber nicht zu anderen Zeiten.
Randy