2012-06-09 8 views
10

Ho due applicazioni Android, supponiamo che siano "A" e "B", "A" ha cinque attività e desidero chiamare la sua attività specifica dall'evento clic di "B". Ho provato questo modo di chiamare un'applicazione da un altro:Android: attività di chiamata di un'altra applicazione

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws"); 
startActivity(LaunchIntent); 

"com.testapp.ws" è il nome del pacchetto di "A".

Questo esegue "A" dalla sua prima attività non ancora dall'attività specifica. Come posso chiamare l'attività specificata da A?

risposta

30

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

+0

Grazie a Mr.Fuzzical Logic per la descrizione dettagliata. Dopo aver riferito la tua spiegazione, ho implementato l'app con successo. Grazie mille! – Grant

+0

come questo può essere raggiunto se voglio inviare i dati da un'attività in un'app a un servizio in un'altra applicazione. ??? – Aada

+0

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") –

20

Passo # 1: Aggiungere un <intent-filter> alla terza azione con un'azione personalizzata:

<intent-filter> 
    <action android:name="com.testapp.ws.SOMETHING_USEFUL"/> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 

Passo # 2: avviare l'attività utilizzando un adeguato Intent:

startActivity(new Intent("com.testapp.ws.SOMETHING_USEFUL")); 
+0

Cosa devo aggiungere Qui ?? "SOMETHING_USEFUL" nella classe xml e Activity? Puoi spiegare di più? Grazie! – Grant

+1

Che dire della 'categoria', è necessario qui? –

+1

@ Eng.Fouad: Ah, sì, è necessario un elemento '' per la categoria 'DEFAULT' in quel' '- le mie scuse. – CommonsWare

0

Ci sono casi in cui non si sta utilizzando due applicazioni che si hanno specificamente funzionalità di modifica a favore o non si può decidere di fare intenti personalizzati, quindi in questo caso non v'è alternativa (con una migliore controllo degli errori per la disponibilità):

Intent intent = new Intent(); 
intent.setClassName("PACKAGE_NAME", "PACKAGE_NAME.TARGET_ACTIVITY"); 
if (isCallable(context, intent)) { 
    // Attach any extras, start or start with callback 
} else { 
    // Respond to the application or activity not being available 
} 

da qualche parte nella classe principale o in una sottoclasse che maniglie metodi generali:

public static boolean isCallable(Activity activity, Intent intent) { 
    List<ResolveInfo> list = activity.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY); 
    return list.size() > 0; 
} 
1

Ecco il codice per aprire un app (ex WhatsApp) da un'altra applicazione

public class MainActivity estende Activity {

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button bClock = (Button) findViewById(R.id.button1); 
    bClock.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
    Intent i = new Intent(Intent.ACTION_MAIN); 
    PackageManager managerclock = getPackageManager(); 
    i = managerclock.getLaunchIntentForPackage("com.whatsapp"); 
    i.addCategory(Intent.CATEGORY_LAUNCHER); 
    startActivity(i); 
    } 
    }); 

} }

Problemi correlati