Qual é o significado de android.intent.action.MAIN?

86

Eu vi tantas explicações diferentes e confusas ..

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

Qual é o significado de

<action android:name="android.intent.action.MAIN" />

e

 <category android:name="android.intent.category.LAUNCHER" />

e

 <category android:name="android.intent.category.DEFAULT" />
Gero
fonte

Respostas:

74

android.intent.action.MAIN significa que essa atividade é o ponto de entrada do aplicativo, ou seja, quando você inicia o aplicativo, essa atividade é criada.

Dos documentos

ACTION_MAIN with category CATEGORY_HOME -- Launch the home screen.

Além disso, daqui

Atividade Ação Comece como um ponto de entrada principal, não espera receber dados.

android.intent.category.DEFAULT é usado principalmente para intenções implícitas. Se sua atividade deseja ser iniciada por uma intenção implícita, ela deve incluir este catetor em seu filtro. Se sua atividade puder ser iniciada por um intent implícito quando nenhuma categoria específica for atribuída a ela, seu filtro de intent deve incluir esta categoria.

android.intent.category.LAUNCHER

categoria - fornece informações adicionais sobre a ação a ser executada.

CATEGORY_LAUNCHER significa que deve aparecer no Iniciador como um aplicativo de nível superior

Veja a documentação ..

  1. http://developer.android.com/reference/android/content/Intent.html
  2. http://developer.android.com/guide/topics/manifest/action-element.html
Lal
fonte
3
Não, MAIN sozinho não vai "iniciar a atividade em casa". MAINtem muitos usos.
CommonsWare
94

ACTION_MAINé considerado um ponto de entrada para o aplicativo. Normalmente, ele se combina com CATEGORY_LAUNCHERum <intent-filter>para indicar uma atividade que deve aparecer no inicializador da tela inicial ou em qualquer outra coisa que se considere um inicializador. Esses "iniciadores" podem consultar PackageManager, usando queryIntentActivities(), para localizar essas atividades e exibi-las para o usuário.

No entanto, ACTION_MAINpode ser usado em combinação com outras categorias para outros fins especializados. Por exemplo, CATEGORY_CAR_DOCKcom ACTION_MAINindica uma atividade que deve ser considerada uma candidata a ser exibida quando o usuário deixa o telefone cair em uma doca de carro fornecida pelo fabricante.

Quando um Intenté usado com startActivity(), se Intentainda não estiver colocado em uma categoria, ele será colocado em CATEGORY_DEFAULT. Portanto, um <activity> <intent-filter>precisa especificar alguns <category> , usando, <category android:name="android.intent.category.DEFAULT" />se nada mais.

CommonsWare
fonte
1
voto positivo! Eu sabia que você responderia e estou esperando para ler, pois esperava uma resposta clara e concisa. obrigado
Spurdow de
6
Uhm, você ainda não explicou por que precisamos de ambos. Quer dizer, ACTION MAIN = ENTRY POINT, entendi. CATEGORY_LAUCHER = Para indicar que uma atividade deve aparecer no inicializador da tela inicial. Essas duas frases são iguais, apenas formuladas de forma diferente, não são?
FRR
9
@feresr: Não, não são. Você pode dizer isso lendo a resposta, incluindo o segundo parágrafo, que fornece um exemplo de um uso diferente do ACTION_MAINque não envolve um iniciador no estilo da tela inicial.
CommonsWare
2
@ vgokul129: Como os iniciadores da tela inicial procuram especificamente atividades que tenham um <intent-filter>com <action android:name="android.intent.action.MAIN" />e <category android:name="android.intent.category.LAUNCHER" />.
CommonsWare
2
@ vgokul129: "Para ser preciso durante um clique no ícone no iniciador, nenhum startActivity (intenção) deve chamar" - somente se você escrever sua própria tela inicial com seu próprio iniciador que oferece esse tipo de capacidade. O comportamento de um iniciador de tela inicial depende dos implementadores dessa tela inicial. A maioria se concentra em iniciar atividades lançáveis ​​anunciadas, já que essa é a função principal de um lançador. Você está convidado a ter uma atividade que chama finish()imediatamente, mas os usuários pensarão que seu aplicativo está quebrado.
CommonsWare
2
<action android:name="android.intent.action.MAIN"/>

É a atividade principal deste aplicativo

 <category android:name="android.intent.category.LAUNCHER" />

Está na categoria LAUNCHER, o que significa que recebe um ícone em qualquer coisa que se considere um “iniciador”, como a tela inicial

 <category android:name="android.intent.category.DEFAULT" />

A chamada para startActivity () sempre adicionará a categoria DEFAULT se nenhuma outra categoria for especificada.

Geralmente, basta adicionar, android.intent.category.DEFAULTmesmo se você tiver outras categorias. Isso garantirá que, se Requesting Intent não fornecer nenhuma categoria ao iniciar o uso do intent startActivity(intent), sua Atividade de recebimento também poderá receber esses Intents.

Fonte: The Busy Coders Guide to Android Development

https://commonsware.com/Android/

Shubhamhackz
fonte