web-dev-qa-db-ja.com

Android:processの使用

このAndroidManifest.xmlファイルがあります。

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:versionCode="1" Android:versionName="1.0.0.0721"
Android:process="com.lily.process" package="com.lily.test">

    <provider Android:authorities="com.lily.test"
      Android:name="com.lily.test.provider" 
      Android:process="com.lily.process">
    </provider>

「Android:process」はマニフェストタグとプロバイダータグの両方として追加されます。プロバイダータグとして追加された場合、「com.lily.process」プロセスでプロバイダーを実行できます。しかし、マニフェストタグとして記述された場合、それはどのように使用されますか?試しましたが、特定したプロセスですべてのコンポーネントを実行できるわけではありません。

38
jiangyan.lily

Android:processがアプリケーションタグの属性として有用であると感じる人はあまりいないことに同意します。ただし、activityタグの属性として有用であることがわかりました。

アクティビティのAndroid:processの目的は、特定の名前を持つプロセスでアクティビティを起動するように指定することです。その名前の選択は、(それを起動したものとは異なる)独自のプロセスでアクティビティを分離するか、同じ名前を使用する他のアクティビティと単一のプロセスで強制的に共存させるために使用できます。

開発ガイドごと( http://developer.Android.com/guide/topics/manifest/activity-element.html ):

「この属性に割り当てられた名前がコロン(「:」)で始まる場合、必要に応じてアプリケーション専用の新しいプロセスが作成され、アクティビティはそのプロセスで実行されます。プロセス名が小文字で始まる場合、アクティビティは、その名前のグローバルプロセスで実行されます。ただし、そうする許可があれば、さまざまなアプリケーションのコンポーネントがプロセスを共有できるため、リソースの使用量が削減されます。」

最近、この属性は、特定の状況下で、一部のデバイスに適用される16MBのヒープ制限にかなり近いアプリのヘルプアクティビティの起動に関する問題を解決するのに役立つことがわかりました。そのような状況では、ヘルプアクティビティを起動すると、アプリが制限を超えてしまい、強制的に終了しました。

Android:processタグを使用することで、ヘルプアクティビティを独自の別のプロセスで起動するように指定できました。このプロセスには独自の16MBのヒープがあり、それを起動したメインアプリのヒープにはカウントされませんでした。これにより、ヘルプが起動されたときに、アプリがヒープ領域を使い果たしたりクラッシュしたりするのを完全かつ完全に防ぎました。

起動アプリにパッケージ名がある場合

com.mycompany.mymainapp

したがって、同じ文字列であるプロセス名が割り当てられます。

Android:process=":myhelp"

起動されたアクティビティでは、プロセス名が割り当てられます

com.mycompany.mymainapp:myhelp

そのプロセスには、独自の個別のプロセスIDがあり、これを表示できます(たとえば、DDMSで)。

少なくとも、それは私の経験です。私のテストは、これまで、16MBのヒープ制限を持つように構成されたCM6(Android 2.2.1)を実行している古いMoto Droidで実行されました。

私の場合、ユーザーがヘルプをアプリとは別のものであると認識したくないので、

Android:excludeFromRecents="true"

ヘルプアクティビティが最近のアプリ(長押しのホーム)リストに表示されないようにする属性。私も含めた

Android:taskAffinity="com.mycompany.mymainapp.HelpActivity"

ここで、HelpActivityは、独自のタスクでアクティビティを分離するためのヘルプアクティビティの名前です。

私も追加しました:

Android:launchMode="singleInstance"

ユーザーがヘルプを呼び出すたびにこのアプリの複数のインスタンスが作成されないようにします。

フラグも追加しました:

Intent.FLAG_ACTIVITY_NEW_TASK

ヘルプアクティビティを起動するために使用されるインテントに。

これらのパラメーターは、Android:process属性を使用する用途に応じて、必要になる場合と必要ない場合があります。

Androidデバイス用に開発する際にメモリ制限に遭遇する頻度を考慮すると、場合によっては、アプリの一部をそれぞれ独自のヒープを持つ個別のプロセスに分割できるテクニックがありますこれを行うには隠れた危険があるかもしれませんが、私はまだ検討も経験もしていませんが、私の特定の例ではこれまでのところ非常に良いです。

111
Carl

@Carl

隠れた危険があるかもしれません:

  • 同じプロセス内にバックグラウンドサービス(例:Android:process = ":myhelp")がある場合、メモリを解放できません。
  • シングルトンパターンは使用できません。

参照: http://developer.Android.com/training/articles/memory.html#MultipleProcesses

このプロセスは、UIにテキストを表示するだけで、サイズがほぼ3倍の4MBになりました。これは重要な結論につながります。アプリを複数のプロセスに分割する場合、UIを担当するのは1つのプロセスだけです。他のプロセスはUIを回避する必要があります。これにより、プロセスで必要なRAMが急速に増加します(特にビットマップアセットや他のリソースの読み込みを開始した後)。 UIが描画された後のメモリ使用量。

5
see2851

Android:processおよびshareduseridを使用して、パッケージ間でリソースを渡すことができます。私の場合、これは今便利です:)

ソースコードの例: https://github.com/ikust/hello-sharedprocess

1

Android:processcautionとともに使用する必要があります

(以下のリンクからの引用)

Androidのあまり知られていないが、一見ドキュメント化されていない動作は、アプリケーションの各プロセスが独自のアプリケーションインスタンスを持つことです。

そのため、別のプロセスで実行されるサービスがある場合、startService()を呼び出すと、アプリのAppplicationクラスが初期化されます。

詳細情報— AndroidアプリケーションonCreateの呼び出し)でサービスを開始