Eine App welche lediglich dazu da sein soll, ein Intent zu senden

  • Antworten:17
devdev
  • Forum-Beiträge: 21

30.09.2016, 18:12:26 via Website

Hallo Leute,

ich bin dabei ein unternehmensspezifische KontakteGUI zu entwickeln, welche von einem Dritthersteller aufgerufen werden soll. Nun ist es so, dass dieser Dritthersteller nur in der Lage ist eine App zu starten und nicht ein Intent zu versenden. Ich weiss, klingt dämlich, ist aber so. und in den nächsten 4Wochen wird sich daran auch nichts ändern.

Nun brauch ich also einer Art Proxy-App welche lediglich dazu da wäre, sobald diese gestartet wird, ein Intent an mein Hauptprogramm zu senden, welche dann die KontakteGUI enthält.

Frage: Wie kann ich eine App schreiben, welche keine Activity startet, sondern lediglich den Start mitkriegt, ein Intent versendet und sich beendet.

Fall jemand eine Antwort darauf hat, oder dem eine elegantere Variante einfällt: schreiben...

Vieler Grüße
devdev

— geändert am 30.09.2016, 18:15:35

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.09.2016, 18:50:33 via Website

Hallo devdev,
darf ich fragen wozu das gut sein soll?
Das macht doch keinen Sinn, wenn ich ein Intent von deiner ProxyApp sende ist es doch das gleiche wie wenn ich auf die App (Icon im Appdrawer) drücke. Ein klick auf das Icon öffnet auch nur die Activity per Intent...
Vlt. willst du mal den Hintergrund erklären, evtl. geht das auch einfacher

LG Pascal //It's not a bug, it's a feature. :) ;)

Ludy

Antworten
devdev
  • Forum-Beiträge: 21

04.10.2016, 12:40:43 via Website

"Ein klick auf das Icon öffnet auch nur die Activity per Intent... "

Nicht ganz gleich. Eine App wird soweit ich weis, über den Package-Namen gestartet. Falls ich mich irre, bitte um Aufklärung. Diese Variante unterstützt der Dritthersteller auch.

Antworten
devdev
  • Forum-Beiträge: 21

04.10.2016, 13:39:06 via Website

Der Hintergrund ist, folgender:
meineApp ist (im optimalfall) die einzige, die dem Benutzer auf dem Gerät angezeigt wird(bis auf eine Dritthersteller-App(Telefonie), welche von meinerApp aufgerufen wird). Diese Dritthersteller-App soll eine Kontakte-GUI anzeigen, welche in meinerApp implementiert ist. Der Dritthersteller bietet als Schnittstelle jedoch nur die Möglichkteit eine App über ihren package-Namen zu starten (die aus dem Manifest, z.B. package="de.app.meine"), womit die default-launch-Activity gestartet werden würde, bietet jedoch jedoch nicht die Möglichkeit ein Intent direkt zu konfigurieren. Daher meine Idee mit der Proxy-App, welche beim Starten dann mir den angepassten Intent verschickt.

Die Anforderung ist ebenfalls, dass diese Kontakte-GUI in meinenApp verbaut ist, da diese App nach möglichkeit zu keinem Zeitpunkt in den Hintergrund gelangen soll. Diese Proxy-Lösung wäre ein Workaround, bei dem diese Anforderung zeitweise aufgegeben wird...

Ich hoffe diese Ausführung ist deutlicher ausgefallen als die erste...
Falls es eine elegantere Möglickteit gibt als dies Proxy-App: bin gerne bereit vorschläge zu hören...

— geändert am 04.10.2016, 13:42:58

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.10.2016, 13:42:40 via Website

Du kannst doch direkt deinen Package Namen der Kontakte GUI angeben, dann sollte diese doch direkt gestartet werden. Was bracuhst du da noch ein Proxy App.

Ja eine App wird über den PackageNamen gestartet, du kannst aber in einem intent auch einen externen PackageNamen angeben und dann wird diese externe App gestartet. Und genau das mach deine Drittanbeiterapp d.h. da den richtigen PackgeNamen eintragen und sollte gehen

Oder hab ich was vergessen?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
devdev
  • Forum-Beiträge: 21

04.10.2016, 13:53:18 via Website

verstehe ich richtig: externer packageName für eine Activity? dieser packageName muss dann im manifest gepflegt werden um diese dem System bekannt zu machen. Stimmts? hast Du einen Beispiel oder Link zu einem?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.10.2016, 14:34:32 via Website

Genau. Du könntest per Intent auch WhatsApp starten wenn du den Package und Activitynamen weißt.
Gerade habe ich leider kein Beispiel zur Hand

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
swa00
  • Forum-Beiträge: 3.704

04.10.2016, 14:48:55 via Website

zum beispiel Maps

Uri gmmIntentUri = Uri.parse("google.navigation:q="+destination+"&mode=d");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
mapIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

oder

PackageManager manager = context.getPackageManager();
Intent in = manager.getLaunchIntentForPackage("de.whateverpackage"));
if (in != null)
{
in.addCategory(Intent.CATEGORY_LAUNCHER);
.......
}

lg
Stefan

— geändert am 04.10.2016, 15:06:31

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
devdev
  • Forum-Beiträge: 21

04.10.2016, 16:03:04 via Website

Ja, leute, das ist schon klar, wenn ich da selbt rein coden kann, ist es kein problem. Mein Problem ist, dass ich in der App des Drittanbieter lediglich die Möglickeit habe als Parameter den Packagenamen anzugeben. In Etwa so:
Starte "de.app.meine"

Mehr Möglickteiten habe ich nicht.

Und nach diesem Aufruf (Starte "de.app.meine") soll meineApp mit der Activity der KontaktGUI gestartet sein. Dabei ist zu beachten, dass meineApp per default mit einer anderen Activity startet, sprich, NICHT mit der KontaktGUI .

— geändert am 04.10.2016, 16:06:33

Antworten
swa00
  • Forum-Beiträge: 3.704

04.10.2016, 16:16:06 via Website

Na das muss ich erst mal auseinander nehmen ...

Sorry, das ist aber auch nicht einfach zu verstehen , was du genau möchtest :-)

EDIT : Ahhhhhhh, ich glaube ich habe es : :-)

Warum gehst du nicht hin und baust dir die Proxy so , dass diese ohne GUI gelauncht wird und sich nach Absenden des Intents direkt ein System.exit(0) macht ???
Ergo ein Theme.Translucent.NoTitleBar, und dann kein setContentview und dann direkt das exit;

(Grausam, müsste aber funktionieren )

Du kannst aber auch einen Broadcast schicken, auf das deine (bereits offene) App reagiert, die dann die KontakUI öffnet.- Würde ich so machen.

lg
Stefan

— geändert am 04.10.2016, 16:52:11

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.10.2016, 16:49:43 via App

Hast du denn nicht mal versucht die Activity direkt zu launchen mit de.meinPackage.meineActivity?
Dabei ist zu beachten dass die Activity auch in der manifest als potentiell zustarten markiert ist.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
swa00
  • Forum-Beiträge: 3.704

04.10.2016, 16:53:48 via Website

Hast du denn nicht mal versucht die Activity direkt zu launchen mit de.meinPackage.meineActivity?
Dabei ist zu beachten dass die Activity auch in der manifest als potentiell zustarten markiert ist.

Oder so ..........

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
devdev
  • Forum-Beiträge: 21

05.10.2016, 12:06:19 via Website

@swa: Habe so gemacht, und siehe da, es proxt was das zeug hält. Allerdings wenn man aus den KontakteGUI jetzt den zurück-button betätigt, dann gelangt man natürlich nicht in der Drittanbieterapp, sondern in der HauptActivity von meinerApp... Schlecht halt...

@Pascal: Diese Variante wäre genial. Habe jedoch bereits probiert: klappt nicht... Nur um sicher zu gehen, "potentiell startbar" heisst, ich definiere die activities wie folgt im Manifest:

<activity
    android:name="de.app.meine.MainActivity"
    android:label="@string/main_app">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name="de.app.meine.ContactsActivity"
    android:label="@string/contacts_ui">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Diese Variante ging wie gesagt nicht.

Antworten
swa00
  • Forum-Beiträge: 3.704

05.10.2016, 12:11:20 via Website

@swa: Habe so gemacht, und siehe da, es proxt was das zeug hält. Allerdings wenn man aus den KontakteGUI jetzt den zurück-button betätigt, dann gelangt man natürlich nicht in der Drittanbieterapp, sondern in der HauptActivity von meinerApp... Schlecht halt...

Na dann machste das , was ich dir schon oben bei MAPS gezeigt habe

.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

und zwar auf die DrittanbieterApp ( das Package weisste ja )
.
.

Das Ganze dann in onBackPressed() (inclusive einem Finish bzw wieder einem System.exit())

P.S Du hast aber schon ein ziemlich gewöhnungsbedüftiges Konzept :-)

lg
Stefan

— geändert am 05.10.2016, 12:21:52

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.10.2016, 13:28:59 via App

Bringt es was wenn du die Categoy default noch hinzufügst also dass es komplett so ist wie die main?

Ansonsten:
Warum kannst du nicht deine Main aufrufen diese analysiert das intent und wenn es von der Drittabbieter App kommt dann wird die passende Activity aufgerufen. Dann ist deine MainActivity einfach er proxy wenn von bestimmter App geöffbet

— geändert am 05.10.2016, 13:30:29

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
swa00
  • Forum-Beiträge: 3.704

05.10.2016, 13:33:09 via Website

Anmerkung :

Du "doktorst" hier mit einem Workaround rum und ich frage mich die Ganze Zeit , warum du es nicht weit einfacher löst.

a) Du schmeisst die Proxy weg ( ich frage mich echt , warum du die brauchst)
b) Anstatt baust du eine KontaktUI Activty Klasse und machst sie als eigenständige App oder/und bindest sie noch in deine App ein.
c) Der Drittanbieter kann die KontaktUI starten / Deine App auch

Fertig

— geändert am 05.10.2016, 14:28:15

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
devdev
  • Forum-Beiträge: 21

05.10.2016, 14:51:16 via Website

@Pascal: wenn ich wüsste wie das geht, würde ich deine Variante sofort nehmen. Was das Netz so hergibt, stimmt mich aber nicht gerade positiv... Habe auch den Intent tatsächlich analysiert, welchen ich beim Auslösen über den Drittanbieter in meinerApp erhalte. Das Ergebnis ist nicht allzu erfolgsversprechend:

Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10400000 pkg=de.app.meine cmp=de.app.meine/.MainActivity }

Aber falls Du einen konkreten Beispiel hast, wäre ich froh über diese Art der Lösung.

@Stefan: bin für alle einfachen Lösungen offen, solange diese funzen.
Habe auch die Idee von der eigenständigen App inzwischen umgesetzt, auch wenn ich dafür meineApp in mehrere Module aufsplitten musste. Bin gar nicht glücklich mit der Lösung, diese ist jedoch bisher die einzige die funktioniert.
Deinen Vorschlag

mapIntent.setPackage("com.app.drittanbieter");
mapIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

werde ich gleich ausprobieren.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.10.2016, 15:18:10 via App

Wenn der drittanbieter die App per Intent ganz normal startet dürfte das gehen:
http://stackoverflow.com/a/37761737
Musst halt mal schauen was du da an Daten bekommst. Damit kannst du dir ein Filter bauen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten