2012-06-09 17 views
10

Mam dwie aplikacje dla systemu Android, przypuśćmy, że są to litery "A" i "B", "A" ma pięć działań i chcę wywołać jego konkretną aktywność z zdarzenia kliknięcia przycisku "B". Przetestowałem ten sposób nazywając jeden wniosek od innego:Android: Aktywność połączeń innej aplikacji

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

„com.testapp.ws” to nazwa pakietu „A”.

Powoduje to ponowne uruchomienie "A" z pierwszej aktywności, a nie określonej czynności. Jak mogę wywołać określoną aktywność A?

Odpowiedz

30

Grant,

Kwestia tutaj jest wyraźnie nieporozumieniem dla modelu aplikacji Android. Commonsware ma absolutną rację, jeśli chodzi o rozwiązanie tego problemu. Jednak bez zrozumienia podstaw Android, widzę, dlaczego masz trudności z zastosowaniem go. Krótkie wyjaśnienie:

Każda operacja w Androidzie zaczyna się od intencji. Dotyczy to w szczególności działań. Każde działanie ma intencję. Aby interfejs był łatwy dla programistów, możesz odpowiedzieć na zamiar z systemu operacyjnego, LUB możesz utworzyć Intent z klasy Działania, której chcesz użyć. Ogólnie najlepszą praktyką jest wykonanie pierwszej opcji.

Odpowiadając zamiarem

Podczas podnoszenia zamiarem odpowiedzieć, można dosłownie odpowiedzi na ich przeznaczenie. Nazywa się to Akcją. Jeśli utworzyłem intencję zwaną "FOO", Aktywność Baru może ją odebrać i odpowiedzieć. Mamy jednak konwencje, a podstawową zasadą jest podawanie nazwy pakietu w jakimkolwiek intencjach. Na przykład "com.company.package.FOO". Mówiąc najprościej, jest tak, aby uniknąć kolizji z innymi aplikacjami.

Każde działanie może reagować na różne zdarzenia. Jest to określone w 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> 

powyżej, również ustawić kategorię do domyślnych ustawień, tak, że jeśli użytkownik zmieni go, będziemy tylko aplikacja, która reaguje na nasze zlecenie intencyjny. Sposób, w jaki my wywołujemy Intent jest użycie tej samej nazwie, że stworzenia (czyli „com.company.package.FOO”)

startActivity(new Intent("com.company.package.FOO")); 

To jak to działa! Po prostu zmieniłbyś powyższy "com.company.package.FOO" na swoją nazwę pakietu (zdefiniowaną przez twoją aplikację) i coś znaczącego. Przykładem jest "com.testapp.ws.SWAT_FLIES".

Dlaczego Twój kod nie działa

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

Powyższy kod wygląda dla konkretnego rodzaju Intent działania.Pamiętaj, kiedy dokonał AndroidManifest i pierwszy aktywny można umieścić:

<action android:name="android.intent.action.MAIN"> 
<category android:name="android.intent.category.LAUNCHER"> 

Cóż ... getLaunchIntentForPackage() pobiera tylko intencyjny w tej pierwszej czynności. To jest DLACZEGO tworzymy niestandardowe intencje ... Po pierwsze, ponieważ tak naprawdę nie chcemy aby nasza 3. Aktywność była naszym początkiem ... A po drugie, ponieważ system operacyjny powie nam tylko Aktywność początkową. Musimy powiedzieć to z naszego własnego działania (tj „com.testapp.ws.SWAT_FLIES”)

nadzieję, że to pomoże,

FuzzicalLogic

+0

Dzięki Mr.Fuzzical Logic za szczegółowy opis. Po przekazaniu wyjaśnień, pomyślnie zaimplementowałem aplikację. Dziękuję bardzo! – Grant

+0

jak to osiągnąć, jeśli chcę wysłać dane z jednej czynności w jednej aplikacji do usługi w innej aplikacji? – Aada

+0

Właściwie, po prostu potrzebujesz akcji Intent i wysyłasz dane przez setExtra przed uruchomieniem startService(). Być może będziesz musiał najpierw skonstruować Intent (tj. Intent myIntent = new Intent ("com.company.app.ACTION") –

20

Krok 1: Dodaj <intent-filter> do trzeciego aktywności z akcji niestandardowej:

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

Krok # 2: start tej działalności przy użyciu odpowiedniego Intent:

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

Co należy dodać do tutaj? "SOMETHING_USEFUL" w xml i klasie aktywności? Czy możesz wyjaśnić więcej? Dzięki! – Grant

+1

Co z "kategorią", czy jest to konieczne? –

+1

@ Eng.Fouad: Ach, tak, będziesz potrzebować elementu '' dla kategorii "DEFAULT" w tym '' - moje przeprosiny. – CommonsWare

0

Istnieją przypadki, w których nie mogą używać dwie aplikacje, które konkretnie ma możliwości edycji dla lub może nie chcieć, aby własne zamiary, więc w tym przypadku nie jest alternatywą (z lepiej błąd sprawdzania dostępności):

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 
} 

Gdzieś w głównej klasy lub podklasy, który obsługuje ogólne metody:

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

Oto kod, aby otworzyć aplikację (ex WhatsApp) z innej aplikacji

public class główną działalność rozciąga Aktywny {

/** 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); 
    } 
    }); 

} }

Powiązane problemy