Hoe een dialoogvenster van een dienst te tonen

Ik heb heel veel berichten over dit onderwerp gelezen, maar niets werkt voor mij (of heeft niet het effect dat ik wens).

Ik heb een applicatie die na het inloggen een achtergrondservice start (implementatie van de serviceklasse). Deze service synchroniseert zichzelf met een server en als er een nieuwe bestelling komt, wordt er een melding gemaakt.

Tot nu toe werkt alles goed, ik heb de melding en het bericht Toast. Ik zou echter graag een dialoogvenster hebben dat de gebruiker op de hoogte brengt van de nieuwe bestelling.

Zoals ik heb begrepen, kunt u een activiteit starten vanuit de service, die het dialoogvenster weergeeft. Dit werkt, maar de activiteit begint boven de huidige activiteitenstapel en geeft het dialoogvenster weer. Ik heb een activiteit zonder view bijgevoegd en deze geeft de dialoog correct weer op een zwarte achtergrond.

Wat ik wil is om het dialoogvenster over de huidige activiteit weer te geven, waardoor de feitelijke achtergrond (de actieve activiteit) vervaagt en het dialoogvenster wordt weergegeven.

Is dit op de een of andere manier mogelijk?

Dank je, Filip

42
toegevoegd de auteur araks, de bron

5 antwoord

We kunnen alleen dialoogvenster van service weergeven als het een systeemwaarschuwingsdialoog is. Stel daarom de parameterindeling TYPE_SYSTEM_ALERT in op Dialoog als volgt:

dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

Maar het heeft de toestemming SYSTEM_ALERT_WINDOW nodig. Vergeet dus niet om deze permissin toe te voegen in het Manifest-bestand.


104
toegevoegd
@chakrapani dit werkte als een charme, maar alsjeblieft, hoe kan ik het negeren ??? Zie mijn vraag http://stackoverflow.com/questions/21913249/unable-to-dismis‌ s -alertdialog
toegevoegd de auteur Lisa Anne, de bron
je bent schattig, dit zou het geaccepteerde antwoord moeten zijn
toegevoegd de auteur Muhammed Refaat, de bron
Bedankt, het loste mijn probleem op.
toegevoegd de auteur mh taqia, de bron
Dit zou NIET het geaccepteerde antwoord moeten zijn. Waarschuwingsdialogen zijn alleen voor ALERTS! Hij staat bovenaan, zelfs als het gaat om telefoongesprekken en het wijzigen van de batterijstatus. Wees je bewust van wat je doet als je de param system_alert gebruikt.
toegevoegd de auteur JacksOnF1re, de bron
Ok, laten we hier niet meer over ruzie maken. Als je weet wat je doet, dan is alles in orde. Misschien was deze kanttekening voldoende geweest en mijn reactie was een beetje te hard.
toegevoegd de auteur JacksOnF1re, de bron
@deej Ik wil geen antwoord geven. Maar ik was in staat uit te leggen waarom dit een slechte praktijk is en waarom het niet het antwoord zou moeten zijn. En dat is alleen een opmerking waard.
toegevoegd de auteur JacksOnF1re, de bron
@deej Wil je slechte programmeurs? Omdat dat is hoe je slechte programmeurs krijgt. "Niets anders doet er toe" - dat is de reden waarom StackOverflow meer en meer een voorbeeldsite voor kopiëren en plakken krijgt. Triest, maar waar.
toegevoegd de auteur JacksOnF1re, de bron
Het feit dat het een toestemming vereist die gewoonlijk niet kan worden verkregen, zou een redelijk goede taak moeten zijn om zich tegen misbruik te beschermen. Er zijn legitieme gebruiken hiervan.
toegevoegd de auteur Chris Stratton, de bron
@ JacksOnF1e MOET dit het geaccepteerde antwoord zijn als het de vraag beantwoordt. Niets anders doet ertoe
toegevoegd de auteur deej, de bron
@ JacksOnF1re kan niet akkoord gaan. Niemand beperkt je om uit te leggen waarom iets niet goed is, maar het zou eigenlijk een kanttekening moeten zijn. Beantwoord de vraag en leg uit dat het een slechte gewoonte is, omdat dit en dat en bla-blah. Het huidige antwoord biedt echter een oplossing. En het is zelfs beter omdat geen extra rechten vereist zijn. Toch denk ik dat het beter is om eerst de vraag te beantwoorden.
toegevoegd de auteur deej, de bron
Ja, maar de stijl van de dialoogknop is ook veranderd!
toegevoegd de auteur zionpi, de bron
Laten we serieus worden: dit is het juiste antwoord :-) Thanx!
toegevoegd de auteur Yoraco Gonzales, de bron
@ JacksOnF1re soms moet je eigenlijk een waarschuwing weergeven bovenop alles ... zoals een kritieke melding .. als de app die je ontwikkelt een soort van service is met weinig geheugen en je echt een waarschuwing wilt wanneer het geheugen bijna leeg is, wat je ook aan het doen bent .. dan is het prima imo
toegevoegd de auteur yeahman, de bron
zoals Chris Stratton opmerkte ... de toestemming is er voor een reden ..
toegevoegd de auteur yeahman, de bron
Heel erg bedankt werkte voor mij
toegevoegd de auteur Aayushi, de bron
TYPE_SYSTEM_ALERT Deze constante is in API-niveau 26 gedeprecieerd voor niet-systeem-apps. Gebruik in plaats hiervan TYPE_APPLICATION_OVERLAY .
toegevoegd de auteur Shady Boshra, de bron

Ik beveel ten zeerste sterk aan dat je dit NIET DOET (het druist in tegen het Android-ontwerp en de UI-richtlijnen). Meldingen zijn de beste manier om te bereiken wat u doet (wat klinkt alsof u al hebt volbracht).

Dat gezegd hebbende, als je het moet doen, zou ik aanraden om gewoon een activiteit met een Dialog-thema te gebruiken. Op die manier hoeft u geen aparte dialoog op te starten. Zie http://developer.android.com/guide/topics/ui/themes.html# ApplyATheme voor hoe dit te doen.

40
toegevoegd
Dit is wat ik tot nu toe heb gedaan. Is dit eigenlijk de manier waarop bijvoorbeeld een oproepmelding wordt weergegeven? Welke activiteit u ook voert, als iemand u belt, krijgt u een dialoogvenster als u de oproep wilt aannemen of niet. Is het ook gewoon een activiteit met een DialogTheme? (Sorry, ik ben te lui om dat op te zoeken in de bronnen :)
toegevoegd de auteur Filip Majernik, de bron
dit geeft eigenlijk geen antwoord op de vraag.
toegevoegd de auteur Vladyslav Matviienko, de bron
Het antwoord is: doe het niet. Als u dit gaat doen, start u een activiteit met een thema dat eruitziet als een dialoogvenster. Probeer de klasse van de dialogen niet in een dienst te stoppen omdat deze gedoemd is te mislukken.
toegevoegd de auteur Justin Breitfeller, de bron
Het starten van een activiteit door het indrukken van een knop in een melding is prima. Maar het is ook niet hetzelfde als het tonen van een dialoog van een dienst.
toegevoegd de auteur Justin Breitfeller, de bron
Ik weet niet zeker hoe dat wordt behandeld. U bent meer dan welkom om nog een SO-vraag te stellen, maar als mijn antwoord uw probleem heeft opgelost, klik dan op het selectievakje naast mijn oplossing om het te accepteren.
toegevoegd de auteur Justin Breitfeller, de bron
Een use case hiervoor: ik heb een melding met een actie erop. Meestal wanneer de gebruiker de actie selecteert die deze op de achtergrond in een service wordt uitgevoerd. Soms moet echter een waarschuwingsvenster worden weergegeven.
toegevoegd de auteur Mark Gjøl, de bron
Door een nieuwe activiteit in te voeren, wordt onPause() aangeroepen voor de huidige activiteit die wordt weergegeven en als noHistory = true voor die activiteit, wordt die activiteit vernietigd. Dit is misschien niet wat je wilt. Maar ja, misschien wel. Wees je gewoon bewust van dat gedrag.
toegevoegd de auteur JohnyTex, de bron
Maar is het technisch mogelijk om AlertDialog op eigen kracht vanuit de service weer te geven?
toegevoegd de auteur Rahul Sundar, de bron

u kunt beginnen door te leren hoe u een activiteit kunt maken die op een dialoogvenster lijkt (geen titelbalk, transparante achtergrond, "zwevend" effect, enz.) en nee, je kunt niet zomaar een dialoog starten zonder een activiteit

4
toegevoegd
wees niet eigenwijs, we zijn niet allemaal zo goed als jij ...
toegevoegd de auteur Jmorvan, de bron

U kunt geen dialoogvenster weergeven. Maar u kunt op een verrassende manier gaan door uw aangepaste weergave op te blazen zodat u een dialoogvenster op het scherm kunt tonen wanneer aan bepaalde voorwaarden is voldaan.

1
toegevoegd

Nee, u kunt geen activiteiten die niet "de uwe" zijn kapen en deze opdracht geven om een ​​dialoogvenster weer te geven. Uw benadering om uw eigen activiteit te starten is de klassieke.

0
toegevoegd