Grant,
Il problema qui è chiaramente un fraintendimento del modello di applicazione Android. Commonsware ha assolutamente ragione su come risolvere questo problema. Tuttavia, senza comprendere i fondamenti di Android, posso capire perché hai difficoltà ad applicarlo. Quindi, una rapida spiegazione:
Ogni azione in Android inizia con un Intento. Questo è particolarmente vero per le attività. Ogni attività ha un intento. Per rendere l'interfaccia facile per gli sviluppatori, è possibile rispondere a un Intento dal sistema operativo, OPPURE è possibile creare un Intento dalla classe Attività da utilizzare. In generale, è consigliabile fare la prima opzione.
Rispondendo ad una Intent
Al momento del ritiro l'intento di rispondere, si può letteralmente rispondere a qualsiasi Intent. Questa è chiamata un'azione. Se ho creato un Intento chiamato "FOO", l'attività della barra potrebbe prenderlo e rispondere. Abbiamo convenzioni, tuttavia, e il principale di questi è quello di anteporre il nome del pacchetto a qualsiasi Intento che si fa. Ad esempio "com.company.package.FOO". In poche parole, è così che evitiamo collisioni con altre app.
Ogni attività può rispondere a diversi eventi. Questo è definito in AndroidManifest.xml.
<activity android:name="Activity3" ... >
<intent-filter>
<action android:name="com.company.package.FOO"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Sopra, abbiamo anche istituito la categoria di default, così che, a meno che l'utente cambia, saremo l'unica applicazione che risponde al nostro intento personalizzato. Il modo in cui abbiamo poi chiamiamo intenti è quello di utilizzare lo stesso nome che abbiamo creato (vale a dire "com.company.package.FOO")
startActivity(new Intent("com.company.package.FOO"));
Ecco come funziona! Dovresti semplicemente modificare "com.company.package.FOO" qui sopra con il nome del tuo pacchetto (definito dalla tua applicazione) e qualcosa di significativo. Un esempio è "com.testapp.ws.SWAT_FLIES".
Perché il codice non funziona
Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws");
Il codice sopra appare per uno specifico tipo di azione intenti.Ricordate quando hai fatto l'AndroidManifest e la prima attività si inserisce:
<action android:name="android.intent.action.MAIN">
<category android:name="android.intent.category.LAUNCHER">
Beh ... getLaunchIntentForPackage() ottiene solo l'Intenti per quella prima attività. Ecco perché creiamo un intento personalizzato ... In primo luogo, perché non vogliamo che sia la nostra terza attività ad essere il nostro avvio ... E secondo, perché il sistema operativo ci dirà solo l'attività di avvio. Dobbiamo dire con la nostra azione proprio (cioè "com.testapp.ws.SWAT_FLIES")
Spero che questo aiuti,
FuzzicalLogic
Grazie a Mr.Fuzzical Logic per la descrizione dettagliata. Dopo aver riferito la tua spiegazione, ho implementato l'app con successo. Grazie mille! – Grant
come questo può essere raggiunto se voglio inviare i dati da un'attività in un'app a un servizio in un'altra applicazione. ??? – Aada
In realtà, è sufficiente l'Intent ACTION e inviare i dati tramite setExtra prima di avviare startService(). Potrebbe essere necessario prima costruire l'Intento (ad es. Intent myIntent = new Intent ("com.company.app.ACTION") –