Androidマルチユーザー対応

3976 ワード

マルチユーザを感知できるアプリケーションの構築
マルチユーザをサポートするデバイスでは、デバイス上のアプリケーションは、必要に応じて異なるユーザを感知する必要がある.
一部のアプリケーションでは、一部のコンポーネント(サービス)を単一の例として実行する必要があり、任意のユーザからの要求を受け入れることができる.Androidシステムは現在、システムアプリケーションのみがこの機能を使用することをサポートしています.
システムアプリケーションの利点は、リソースを節約し、各ユーザ間の1つまたは複数の共有リソースを判定し、単一のサーバを使用することによってネットワークオーバーヘッドを削減することである.
マルチユーザ権限モデル:
感知可能なマルチユーザ関連トピックを構築するには、次の手順に従います.
a)単例コンポーネントの有効化
アプリケーションを一例として認識するには、android:singleUser=「true」をAndroidリストのサービスまたはプロバイダに追加します.
ユーザー0としてのみ実行されるプロセスでは、コンポーネントがインスタンス化されます.プロバイダまたはサービスに接続されているすべてのユーザ要求は、指定されたパスでユーザ0のプロセスに送信されます.
コンポーネントがアプリケーション内の唯一のコンポーネントである場合、アプリケーションインスタンスは1つだけ実行されます.パッケージ内のアクティビティは、各ユーザのそれぞれのプロセスで開始され、uidは対応するユーザのuidの範囲内に出ます.
b)複数のユーザ又は資料におけるサービス
すべてのサービスが他のユーザーまたは作業profileでインスタンスを実行する必要はありません.一部のシステム・サービスがユーザー0としてのみ実行される場合、他のユーザーのアイデンティティ実行時にサービス・コンポーネントが無効になります.
グループにリソースを保持します.次の例のコードは、サービスのエントリポイントでこの操作を実行する方法を示しています.
//Add on all entry points such as boot_completed or other manifest-listed receivers and providers
if (!UserManager.isSystemUser()) {
    // Disable the service
    ComponentName targetServiceName = new ComponentName(this, TargetService.class);
    //   PackageManager.setApplicationEnabledSetting()      
    context.getPackageManager().setComponentEnabledSetting(
        targetServiceName, COMPONENT_ENABLED_STATE_DISABLED, 0);
}

c)ユーザーとのやり取り
権限の設定
マルチユーザ関連APIを使用するには、次の権限が必要です.
       INTERACT_ACROSS_USERS (signature|system)
       INTERACT_ACROSS_USERS_FULL (signature)
       /> 
       
API
以下のAPIを用いる、アプリケーションが複数のユーザを感知できることを確保する.
1.ユーザーハンドル、ユニークIDの抽出:
  • int userHandle = UserHandle.getCallingUserId();//転送されたBinder呼び出しからハンドル
  • を取得
  • int userHandle = getSystemService(Context.USER_SERVICE).getUserHandle();//アプリケーションプロセスが実行するユーザーハンドル
  • を取得する
  • int userHandle = getSystemService(Context.USER_SERVICE).getUserHandle(userSerialNumber);//ユーザシリアル番号からユーザハンドル
  • を取得する.
  • long serialNumber =  getSystemService(Context.USER_SERVICE).getSerialNumberForUser(UserHandle user);//ユーザシリアル番号
  • の取得
    2.特定のユーザーのサービス、Activity、およびブロードキャストの開始
  • Context.startActivityAsUser(Intent,UserHandle)
  • Context.bindServiceAsUser(Intent, ... ,UserHandle)
  • Context.sendBroadcastAsUser(Intent, ... , UserHandle)
  • Context.startServiceAsUser(Intent, ... , UserHandle)

  • UserHandleは、ユーザを表示することもできるし、以下の特殊なハンドルの1つであることもできる:UserHandle.CURRENT & UserHandle.ALL.CURRENTは、現在フロントにいるユーザを識別します.
    ALLはすべてのユーザーを識別し、すべてのユーザーにブロードキャストを送信する場合はUserHandleを使用します.ALL.
    3.ユーザーコンポーネント間通信権限
  • は、自身のアプリケーションのコンポーネントと通信し、INTERAACT_を使用するACROSS_USERS
  • 他のアプリケーションのコンポーネントと通信し、INTERSACT_を使用するACROSS_USERS_FULL

  • 4.ユーザープロセスで実行され、ユーザー0のsingleUserコンポーネントにアクセスするプロキシコンポーネントを作成する必要がある場合があります.
    5.UserManagerを使用してデバイス上のユーザーを問い合わせる
  • Boolean supports =UserManager.supportMultipleUsers();//デバイスペアがマルチユーザ
  • をサポートしているかどうかを問い合わせる
  •  users= getSystemService(Context.USER_SERVICE).getUsers();//デバイス上のユーザ情報を問い合せ、ユーザ情報リスト
  • に戻る.
  • UserInfo user = getSystemService(Context.USER_SERVICE).getUserInfo(UserHandle);//ユーザー情報の照会
  • 6.リスニングコールバックの登録
    登録によりContentObserver、PackageMonitor、BroadcastReceiverで複数のユーザーに新しく追加されたAPIを使用して、特定のユーザーまたはすべてのユーザーおよびコールバックをリスニングできます.
    (コールバック開始ユーザに関する他の情報を提供することができる).このような新しく追加されたAPIは、APIパラメータリストに複数のユーザに関するパラメータ:int userHandleが新たに追加されたことが顕著な特徴である.例えば:
    ContentObserverがuri変更登録インタフェースをリスニングする(ContentResolverクラス)
       public final void registerContentObserver(Uri uri, boolean notifyForDescendents,ContentObserver observer, @UserIdInt int userHandle)  //      
       public final void registerContentObserver(@NonNull Uri uri, boolean notifyForDescendants,@NonNull ContentObserver observer)