Android での Engagement による詳細なレポートAdvanced Reporting with Engagement on Android

このトピックでは、Android アプリケーションでの他のレポート シナリオについて説明します。This topic describes additional reporting scenarios in your Android application. これらのオプションを、 作業開始 チュートリアルで作成されたアプリに適用できます。You can apply these options to the app created in the Getting Started tutorial.

前提条件Prerequisites

このチュートリアルを開始する前に、 作業開始 チュートリアルを完了する必要があります。Before starting this tutorial, you must first complete the Getting Started tutorial.

重要

Android SDK の最小の API レベルは 10 以降 (Android 2.3.3 以降) である必要があります。Your minimum Android SDK API level must be 10 or higher (Android 2.3.3 or higher).

完了したチュートリアルは意図的に直接的かつシンプルになっていましたが、選択できる詳細オプションがあります。The tutorial you completed was deliberately direct and simple, but there are advanced options you can choose.

Activity クラスの変更Modifying your Activity classes

作業開始のチュートリアルで必要だったのは、*Activity サブクラスが、対応する 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. (たとえば、レガシー アクティビティが ListActivity を拡張した場合は、EngagementListActivity も拡張されるようにします)。For example, if your legacy activity extended ListActivity, you would make it extend EngagementListActivity.

重要

EngagementListActivity または EngagementExpandableListActivity を使う場合は、requestWindowFeature(...); に対するすべての呼び出しが super.onCreate(...); に対する呼び出しの前に行われることを確認します。それ以外の場合、クラッシュが発生します。When using EngagementListActivity or EngagementExpandableListActivity, make sure any call to requestWindowFeature(...); is made before the call to super.onCreate(...);, otherwise a crash occurs.

これらのクラスは src フォルダーで見つけることができ、プロジェクトにコピーできます。You can find these classes in the src folder, and can copy them into your project. クラスは JavaDocにも用意されています。The classes are also in the JavaDoc.

別の方法: startActivity()endActivity() を手動で呼び出すAlternate method: call startActivity() and endActivity() manually

Activity クラスをオーバーロードできないか、そうしたくない場合は、代わりに 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.

重要

Android SDK は、アプリケーションが閉じられる場合でも endActivity() メソッドを呼び出すことはありません (Android では、アプリケーションが閉じられることはありません)。The Android SDK never calls the endActivity() method, even when the application is closed (on Android, applications are never closed). このため、"すべて" のアクティビティの onResume コールバック内で startActivity() メソッドを呼び出し、"すべて のアクティビティの onPause() コールバック内で endActivity() メソッドを呼び出すことを "強く" お勧めします。Thus, it is HIGHLY recommended to call the startActivity() method in the onResume callback of ALL your activities, and the endActivity() method in the onPause() callback of ALL your activities. これは、セッションがリークしないことを保証する唯一の方法です。This is the only way to be sure that sessions are not leaked. セッションがリークした場合、(セッションが保留中である限り、サービスが接続されたままになるため)、Engagement サービスが Engagement バックエンドから切断されることはありません。If a session is leaked, the Engagement service never disconnects from the Engagement backend (since the service stays connected as long as a session is pending).

たとえば次のようになります。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();
  }
}

この例は、EngagementActivity クラスとそのバリアントに似ています。ソース コードは src フォルダーに提供されています。This example is similar to the EngagementActivity class and its variants, whose source code is provided in the src folder.

Application.onCreate() の使用Using Application.onCreate()

Application.onCreate() とその他のアプリケーション コールバックに配置したすべてのコードは、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. Engagement のプロセス内の不要なメモリの割り当てとスレッド、重複するブロードキャスト レシーバーやサービスなど、望ましくない副作用が発生する可能性があります。It may have unwanted side effects, like unneeded memory allocations and threads in the Engagement's process, or duplicate broadcast receivers or services.

Application.onCreate() をオーバーライドする場合は、次のコード スニペットを 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...
 }

同じことを Application.onTerminate()Application.onLowMemory()Application.onConfigurationChanged(...) に対しても行うことができます。You can do the same thing for Application.onTerminate(), Application.onLowMemory(), and Application.onConfigurationChanged(...).

EngagementApplicationApplication の代わりに拡張することもできます。コールバック Application.onCreate() は、プロセス チェックを実行し、現在のプロセスが Engagement サービスをホストするプロセスでない場合のみ Application.onApplicationProcessCreate() を呼び出します。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.

AndroidManifest.xml ファイルのタグTags in the AndroidManifest.xml file

AndroidManifest.xml ファイルのサービス タグでは、 android:label 属性を使って、エンド ユーザーの電話の "実行中のサービス" 画面に表示される Engagement サービスの名前を選択できます。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. この属性には "<Your application name>Service" を設定することをお勧めします (例: "AcmeFunGameService")。We recommended setting this attribute to "<Your application name>Service" (for example, "AcmeFunGameService").

android:process 属性を指定すると、Engagement サービスが独自のプロセスで実行されることが保証されます (Engagement をアプリケーションと同じプロセス内で実行すると、メイン/UI スレッドの反応が遅くなる可能性があります)。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).

ProGuard でのビルドBuilding with ProGuard

アプリケーション パッケージを ProGuard でビルドする場合は、いくつかのクラスを保持する必要があります。If you build your application package with ProGuard, you need to keep some classes. 次の構成スニペットを使うことができます。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>;
 }