2011-08-22 7 views
30

私はこれの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> 

「アンドロイド:プロセスは」、それは、プロバイダタグとして追加された場合、私は知っている、マニフェストタグとプロバイダタグの両方として追加されプロバイダは "com.lily.process"プロセスで実行できます。しかし、マニフェストタグとして書かれたとき、その使用法は何ですか? 私は試しましたが、特定したプロセスですべてのコンポーネントが動作しているとは限りません。

+0

あなたはプロバイダ名「com.com」に余分なパッケージがあるようです。 – CrackerJack9

答えて

93

私は多くの人々は、Androidを見つけるだろうと同意するだろう:プロセスは、アプリケーション・タグの属性として有用であることが。しかし、私はそれがアクティビティタグの属性として有用であることを発見しました。

アクティビティに対する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 

このプロセスには独自のセパレータteプロセスID(DDMSなど)を表示できます。

すると、その、少なくとも、私の経験をされています。私のテストでは、これまでCM6(アンドロイド2.2を実行している古いモトドロイド上で実行されています。1)、16MBのヒープリミットを持つように構成されています。私の場合は

、私は、ユーザーが自分のアプリケーションから分離しているように助けを知覚したくなかったので、私は

android:excludeFromRecents="true" 

最近のアプリに表示されたヘルプ活動を防止するための属性(長いが含まれて-Press Home)リストを表示します。私はまた、

を含ま
android:taskAffinity="com.mycompany.mymainapp.HelpActivity" 
HelpActivityは、私も追加

独自のタスクでの活動を分離するために、ヘルプ活動の名前をある

android:launchMode="singleInstance" 

このアプリの複数のインスタンスを防ぐためにユーザーがヘルプを呼び出すたびに作成されることを防ぎます。ヘルプ活動を起動するために使用されるテントに

Intent.FLAG_ACTIVITY_NEW_TASK 

は、私はまた、フラグを追加しました。

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

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

+0

あなたの答えをありがとう、これは非常に役に立ちました!ユーザーが「最近のアプリ」のUIでアプリケーションをスワイプしたときに、リモートプロセスがどのように殺されるかを明らかにできるかどうかは疑問だ。私は[この質問を読む](http://android.stackexchange.com/questions/19987/what-actually-happens-when-you-swipe-an-app-out-of-the-recent-apps-list#_ = _)、あなたが同じ行動を経験したかどうかを知りたい。 –

+0

@スティーブン:それはとても面白いです。私はその行動について全く知らなかった。 Androidの考え方は、一般的に、ユーザーが[戻る]ボタンを使用してアプリから完全に離れる場合を除いて、OSに決定させることでした。私はちょうど自分のアプリhttps://play.google.com/store/apps/details?id=com.goalstate.WordGames.FullBoard.trialsuite(ヘルプのためにこのアプローチを使用しています)を走らせて、アプリのプロセスやヘルププロセスは、両方とも(最近使用されたリストに残っているにもかかわらず)両方を殺すようです。 DDMSを実行している間にこれを試してみてください。 – Carl

+0

私はRecentsからアクティビティを隠すために費やした努力を理解します。しかし、それは新しいプロセスを膨張させることとは関係がありませんか? – zgulser

5

@Carl

隠された危険がある場合があります。同じプロセスでバックグラウンドサービス(:アンドロイド::プロセス= "myhelp" 例えば)がある場合は

  • メモリが解放することはできません。
  • シングルトンパターンは使用できません。

参考:http://developer.android.com/training/articles/memory.html#MultipleProcesses

プロセスは、現在ではほとんど単に UIにテキストを示すことによって、4メガバイトに、サイズが3倍になりました。これは重要な結論につながります: あなたのアプリを複数のプロセスに分割する場合は、1つのプロセス がUIを担当する必要があります。 これは、プロセスによって必要とされるRAM(ビットマップアセットやその他のリソースの読み込みを開始すると特に )を速やかに増やすため、他のプロセスはUIを使用しないでください。 UIが描画されると、 はメモリ使用量を減らすことが困難または不可能になることがあります。

+0

私の場合、ユーザーはアプリのメインアクティビティからヘルプにアクセスし、ヘルプが参照されるとヘルププロセスを終了し、メインアクティビティとそのプロセスに戻ります。ですから、ヘルプの表示中に一時的な余分なメモリが必要な場合は、これがうまく動作します。 もちろん、私のヘルププロセスにはUIが関わっていますが、これで問題は発生しません。私は、ユーザーがヘルプを見て別のアプリケーションに直接行く場合、OSはメモリを提供するために自分のアプリケーションのプロセスの両方を投げ捨てることができると信じています。 – Carl

+0

自分の例のヘルププロセスはサービスではないことに注意してください。それは活動です。また、ヘルププロセスはメインプロセスで作成されたオブジェクトを使用しないため、メインプロセス内でシングルトンパターンの使用を妨げるものは何もなく、実際にはそのパターンを使用します。 – Carl

関連する問題