Czym różni się jawne i niejawne wywołanie aktywności w Androidzie?

Jaka jest różnica między jawnym i ukrytym wywołaniem aktywności w Androidzie? Jeśli wyjaśnisz odpowiedź prostym przykładem będzie dobry.

Author: naXa, 2012-04-23

5 answers

Na przykład:

Implicit activity call

W filtrze intencji tworzysz akcję dla swojej aktywności, więc inna aplikacja może wywołać Twoją aktywność za pomocą tej akcji w następujący sposób:

<activity android:name=".BrowserActivitiy" android:label="@string/app_name">
   <intent-filter>
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <data android:scheme="http"/> 
   </intent-filter>
</activity>

A drugi sposób na wywołanie intencji ukrytej jest poniżej:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
startActivity(intent);

Explicit activity call

Wykonujesz połączenie, które wskazuje dokładnie, która klasa aktywności:

Intent intent = new Intent(this, ActivityABC.class);
i.putExtra("Value", "This value for ActivityABC");
startActivity(intent);

Mam nadzieję, że to pomoże Ci zrozumieć więcej o jawnej i ukrytej aktywności call in android.

Więcej informacji o Android Intent znajdziesz tutaj
 50
Author: MichaelP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-29 01:46:29
  1. jawne intencje są używane do wywołania określonego komponentu. Kiedy wiesz, który komponent chcesz uruchomić i nie chcesz dać użytkownikowi wolnej kontroli nad tym, którego komponentu użyć.Na przykład masz aplikację, która ma 2 Działania. Ćwiczenie A i ćwiczenie B. chcesz uruchomić ćwiczenie B z ćwiczenie A. w tym przypadku definiujesz jawną intencję kierowania aktywnośćb, a następnie używasz jej do bezpośredniego wywołania.
  2. Implicit Intents są używane, gdy masz pojęcie, co chcesz to zrobić, ale nie wiesz, który komponent powinien zostać uruchomiony. Lub jeśli chcesz dać użytkownikowi opcję wyboru pomiędzy listą komponentów do użycia. Jeśli te zamiary są wysyłane do systemu Android wyszukuje wszystkie składniki, które są zarejestrowane dla konkretnej akcji i typu danych. Jeśli zostanie znaleziony tylko jeden komponent, Android uruchomi komponent bezpośrednio. Na przykład masz aplikację, która używa aparatu do robienia zdjęć. Jedną z cech aplikacji jest to, że dajesz użytkownikowi możliwość przesłania wykonanych przez niego zdjęć. Nie wiesz, jaki rodzaj aplikacji ma użytkownik, który może wysyłać zdjęcia, a także chcesz dać użytkownikowi opcję wyboru, której zewnętrznej aplikacji użyć, jeśli ma więcej niż jedną. W takim przypadku nie użyjesz wyraźnego zamiaru. Zamiast tego powinieneś użyć ukrytej intencji, która ma ustawioną akcję na ACTION_SEND i dodatkowe dane ustawione na URI zdjęcia.

Wyraźny zamiar jest zawsze dostarczany do jego cel, bez względu na to, co zawiera; filtr nie jest konsultowany. Ale ukryta intencja jest dostarczana komponentowi tylko wtedy, gdy może przejść przez jeden z filtrów komponentu

 24
Author: Varun Bhatia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-22 10:53:44

Zobacz tutaj

Http://developer.android.com/guide/topics/intents/intents-filters.html

Jawne intencje (działania) odnoszą się do określonej klasy i ogólnie są dostępne tylko dla Twoich pakietów. Domyślne intencje odnoszą się do filtrów intencji, w których aplikacje publicznie ogłaszają, że mogą obsługiwać określone typy danych lub mogą świadczyć określone usługi, np. wysyłać wiadomości e-mail. Z domniemanymi intencjami, użytkownicy wybierają, która aktywność (Zazwyczaj pakiet) ma użyj do obsługi intencji lub jeśli ustawiona jest domyślna obsługa, jest uruchamiana.

 2
Author: Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-22 22:41:24

Istnieją dwa rodzaje intencji:

  • Explicit Intent:

    Podczas tworzenia obiektu Intent gdy jawnie określamy i przekazujemy nazwę komponentu docelowego bezpośrednio w intencie , jest to jawny intent.

  • Implicit Intent:

    W tym przypadku delegujemy zadanie oceny zarejestrowanych komponentów (rejestracja odbywa się zwykle za pomocą filtrów intent, które omówimy później) na Androida w oparciu o intent Dane i zamierzona akcja (jak wysłać e-mail, zrobić zdjęcie, pin lokalizacja na mapie, itp.), które mijamy. Więc Android automatycznie odpali komponent z tej samej aplikacji lub innej aplikacji, która może obsługiwać wiadomość intencyjną / zadanie. idea w tym przypadku jest taka, że powiedzmy, że musimy przypiąć lokalizację na mapie, w tym celu nie musimy kodować własnej działalności, aby sobie z tym poradzić. Zamiast tego po prostu przekaż dane lokalizacji do aplikacji takiej jak Google maps, która może wykonać zadanie na naszej aplikacji w imieniu.

Źródło: http://codetheory.in/android-intents/

 1
Author: YOmna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-30 07:56:47

Kiedy użyć którego?

Explicit intent: Kiedy wiesz, który komponent może obsłużyć twoje żądanie. Więc ty wyraźnie wymieniasz nazwę komponentu w intencji.

Intent i = new Intent(context,DetailActivity.class);  // DetailActivity.class is the component name
startActivity(i);

Implicit intent: Jeśli nie wiesz, która aplikacja może obsłużyć twoje żądanie, to wspominasz akcję w intent i pozwalasz OS zdecydować, które aplikacje są / są odpowiednie do twojego zadania.

Przykład: Odtwarzanie Muzyki

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(file);
startActivity(intent);

Jak OS decyduje?

Gdy jest wywołanie niejawne z intencją, system operacyjny usuwa akcję i dopasowuje ją do wszystkich filtrów intencyjnych wszystkich zarejestrowanych działań wszystkich aplikacji używających PackageManager, a następnie zapełnia wynik jako listę. Nazywa się
Istnieje więc możliwość, że w Twoim urządzeniu nie jest dostępna żadna aplikacja, która obsłuży twoje żądanie. W takim przypadku otrzymasz wyjątek NullPointer.

Więc a bezpieczniejszym sposobem na wywołanie ukrytej intencji byłoby to

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(file);
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}
 0
Author: Rohit Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-06 12:14:59