Segnalazione avanzata con Engagement in AndroidAdvanced Reporting with Engagement on Android

Questo argomento descrive scenari di segnalazione aggiuntivi nell'applicazione Android.This topic describes additional reporting scenarios in your Android application. È possibile applicare queste opzioni all'app creata nell'esercitazione introduttiva .You can apply these options to the app created in the Getting Started tutorial.

PrerequisitiPrerequisites

Prima di iniziare questa esercitazione, è necessario completare l'esercitazione introduttiva .Before starting this tutorial, you must first complete the Getting Started tutorial.

Importante

L'API di Android SDK deve essere almeno di livello 10 o superiore (Android 2.3.3 o versioni successive).Your minimum Android SDK API level must be 10 or higher (Android 2.3.3 or higher).

Anche se l'esercitazione completata è stata volutamente diretta e semplice, sono disponibili opzioni avanzate.The tutorial you completed was deliberately direct and simple, but there are advanced options you can choose.

Modifica delle classi ActivityModifying your Activity classes

Nell'esercitazione introduttiva è stato sufficiente fare in modo che le sottoclassi *Activity ereditassero dalle corrispondenti classi Engagement*Activity.In the Getting Started tutorial, all you had to do was to make your *Activity subclasses inherit from the corresponding Engagement*Activity classes. Se, ad esempio, l'attività legacy estende ListActivity, si fa in modo di estendere EngagementListActivity.For example, if your legacy activity extended ListActivity, you would make it extend EngagementListActivity.

Importante

Quando si usa EngagementListActivity o EngagementExpandableListActivity, assicurarsi che tutte le chiamate a requestWindowFeature(...); vengano eseguite prima della chiamata a super.onCreate(...);. In caso contrario, si verificherà un arresto anomalo del sistema.

Queste classi sono incluse nella cartella src e possono essere copiate nel progetto.You can find these classes in the src folder, and can copy them into your project. Sono reperibili anche in JavaDoc.The classes are also in the JavaDoc.

Metodo alternativo: chiamare manualmente startActivity() e endActivity()Alternate method: call startActivity() and endActivity() manually

Se non si può o non si vuole eseguire l'overload delle classi Activity, è possibile avviare e terminare le attività chiamando direttamente i metodi di EngagementAgent.If you cannot or do not want to overload your Activity classes, you can instead start and end your activities by calling the EngagementAgent's methods directly.

Importante

Android SDK non chiama mai il metodo endActivity(), neanche alla chiusura dell'applicazione; in Android le applicazioni in realtà non vengono mai chiuse. Per questo motivo, è ALTAMENTE consigliabile chiamare il metodo startActivity() nel callback onResume di TUTTE le attività e il metodo endActivity() nel callback onPause() di TUTTE le attività. È l'unico modo per evitare la perdita di sessioni. In caso di perdita di una sessione, il servizio Engagement non si disconnetterà mai dal back-end di Engagement, dato che il servizio rimane connesso fintanto che una sessione è in sospeso.

Di seguito è fornito un esempio: Here is an example:

public class MyActivity extends Some3rdPartyActivity
{
  @Override
  protected void onResume()
  {
    super.onResume();
    String activityNameOnEngagement = EngagementAgentUtils.buildEngagementActivityName(getClass()); // Uses short class name and removes "Activity" at the end.
    EngagementAgent.getInstance(this).startActivity(this, activityNameOnEngagement, null);
  }

  @Override
  protected void onPause()
  {
    super.onPause();
    EngagementAgent.getInstance(this).endActivity();
  }
}

Questo esempio è simile alla classe EngagementActivity e alle relative varianti, il cui codice di origine è disponibile nella cartella src.This example is similar to the EngagementActivity class and its variants, whose source code is provided in the src folder.

Uso di Application.onCreate()Using Application.onCreate()

Il codice inserito in Application.onCreate() e in altri callback dell'applicazione verrà eseguito per tutti i processi dell'applicazione, incluso il servizio Engagement.Any code you place in Application.onCreate() and in other application callbacks is run for all your application's processes, including the Engagement service. È possibile che si verifichino effetti collaterali indesiderati, ad esempio allocazioni di memoria e thread superflui nel processo di Engagement oppure ricevitori o servizi di trasmissione duplicati.It may have unwanted side effects, like unneeded memory allocations and threads in the Engagement's process, or duplicate broadcast receivers or services.

Se si esegue l'override di Application.onCreate(), è consigliabile aggiungere il frammento di codice seguente all'inizio della funzione Application.onCreate():If you override Application.onCreate(), we recommend adding the following code snippet at the beginning of your Application.onCreate() function:

 public void onCreate()
 {
   if (EngagementAgentUtils.isInDedicatedEngagementProcess(this))
     return;

   ... Your code...
 }

È possibile eseguire la stessa operazione per Application.onTerminate(), Application.onLowMemory() e Application.onConfigurationChanged(...).You can do the same thing for Application.onTerminate(), Application.onLowMemory(), and Application.onConfigurationChanged(...).

È anche possibile estendere EngagementApplication anziché Application: il callback esegue il controllo del processo Application.onCreate() e chiama Application.onApplicationProcessCreate() solo se il processo corrente non è quello che ospita il servizio Engagement. Per gli altri callback vengono applicate le stesse regole.You can also extend EngagementApplication instead of extending Application: the callback Application.onCreate() does the process check and calls Application.onApplicationProcessCreate() only if the current process is not the one hosting the Engagement service, the same rules apply for the other callbacks.

Tag nel file AndroidManifest.xmlTags in the AndroidManifest.xml file

Nel tag service nel file AndroidManifest.xml l'attributo android:label consente di scegliere il nome del servizio Engagement così come verrà presentato agli utenti finali nella schermata dei servizi in esecuzione sul telefono.In the service tag in the AndroidManifest.xml file, the android:label attribute allows you to choose the name of the Engagement service as it appears to end users in the "Running services" screen of their phone. È consigliabile impostare questo attributo su "<Your application name>Service", ad esempio "AcmeFunGameService".We recommended setting this attribute to "<Your application name>Service" (for example, "AcmeFunGameService").

Se si specifica l'attributo android:process , il servizio Engagement verrà eseguito nel relativo processo; l'esecuzione di Engagement nello stesso processo dell'applicazione può ridurre la reattività del thread principale o dell'interfaccia utente.Specifying the android:process attribute ensures that the Engagement service runs in its own process (running Engagement in the same process as your application makes your main/UI thread potentially less responsive).

Compilazione con ProGuardBuilding with ProGuard

Se si compila il pacchetto dell'applicazione con ProGuard, è necessario mantenere alcune classi.If you build your application package with ProGuard, you need to keep some classes. È possibile usare il frammento di codice di configurazione seguente:You can use the following configuration snippet:

-keep public class * extends android.os.IInterface
-keep class com.microsoft.azure.engagement.reach.activity.EngagementWebAnnouncementActivity$EngagementReachContentJS {
<methods>;
 }