2011-08-22 36 views
30

Tôi có tập tin AndroidManifest.xml này:Sử dụng android: quá trình

<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: quá trình" được thêm vào cả hai thẻ và nhà cung cấp như manifest thẻ, tôi biết nếu nó được thêm vào như là một thẻ nhà cung cấp, các nhà cung cấp có thể được chạy trong quá trình "com.lily.process". Nhưng việc sử dụng nó là gì khi được viết dưới dạng thẻ kê khai? Tôi đã thử, nhưng không phải tất cả các thành phần có thể chạy trong quá trình được xác định.

+0

có vẻ như bạn có gói phụ trong tên nhà cung cấp "com.com" – CrackerJack9

Trả lời

93

tôi sẽ đồng ý rằng không có nhiều người sẽ tìm thấy android: quá trình có ích như một thuộc tính của thẻ ứng dụng. Tuy nhiên, tôi nhận thấy nó hữu ích như một thuộc tính của thẻ hoạt động .

Mục đích của android:process trên một hoạt động là xác định rằng hoạt động của bạn sẽ được khởi chạy trong quá trình có tên cụ thể. Sự lựa chọn tên đó có thể được sử dụng để cô lập hoạt động trong quá trình riêng của nó (khác với cái đã khởi chạy nó), hoặc buộc nó phải sống trong một quá trình duy nhất với các hoạt động khác có cùng tên.

mỗi Guide Dev (http://developer.android.com/guide/topics/manifest/activity-element.html):

"Nếu tên được gán cho thuộc tính này bắt đầu với một dấu hai chấm (':'), một quá trình mới, tư nhân để ứng dụng, được tạo ra khi nó cần thiết và Nếu tên quá trình bắt đầu bằng một ký tự chữ thường, hoạt động sẽ chạy trong một tiến trình toàn cục của tên đó, với điều kiện là nó có quyền làm như vậy. sử dụng." Gần đây tôi đã tìm thấy thuộc tính này hữu ích trong việc giải quyết vấn đề tôi đã đưa ra hoạt động trợ giúp cho ứng dụng, trong một số trường hợp, khá gần với giới hạn 16MB vẫn áp dụng cho một số thiết bị. Khởi động hoạt động trợ giúp của nó là, trong những tình huống đó, đẩy ứng dụng của tôi vượt quá giới hạn, dẫn đến một lực lượng gần gũi.

Bằng cách sử dụng thẻ android:process, tôi có thể chỉ định rằng hoạt động trợ giúp của mình sẽ được khởi chạy trong một quy trình riêng của riêng nó. Quá trình này đã có 16MB của riêng mình, và nó không được tính vào đống ứng dụng chính của tôi đã khởi chạy nó. Điều này ngăn chặn vĩnh viễn và hoàn toàn ứng dụng của tôi khỏi không gian heap và bị lỗi khi trợ giúp được khởi chạy.

Nếu ứng dụng ra mắt của bạn có tên gói

com.mycompany.mymainapp 

và do đó được gán một tên quá trình đó là cùng một chuỗi, sau đó, nếu bạn sử dụng

android:process=":myhelp" 

về hoạt động giới thiệu của bạn, nó sẽ được chỉ định tên quá trình

com.mycompany.mymainapp:myhelp 

và quy trình đó sẽ có riêng, separa te process ID, mà bạn có thể xem (ví dụ trong DDMS).

Điều đó, ít nhất, là trải nghiệm của tôi. Thử nghiệm của tôi cho đến nay đã được thực hiện trên một chiếc Moto Droid cũ chạy CM6 (Android 2.2.1), được định cấu hình để có giới hạn 16MB.

Trong trường hợp của tôi, vì tôi không muốn người dùng cảm nhận được sự giúp đỡ như là tách biệt với ứng dụng của tôi, tôi bao gồm các thuộc tính

android:excludeFromRecents="true" 

để ngăn chặn các hoạt động giúp đỡ từ xuất hiện trên các ứng dụng gần đây (dài -press Home) danh sách. Tôi cũng bao gồm

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

nơi HelpActivity là tên của các hoạt động giúp đỡ, để phân biệt hoạt động trong nhiệm vụ riêng của mình

Tôi cũng nói thêm:

android:launchMode="singleInstance" 

để ngăn chặn nhiều trường hợp của ứng dụng này được tạo mỗi lần người dùng gọi trợ giúp.

Tôi cũng đã thêm lá cờ:

Intent.FLAG_ACTIVITY_NEW_TASK 

để tiếp cận mục đích sử dụng để khởi động các hoạt động giúp đỡ.

Các thông số này có thể hoặc không cần thiết, tùy thuộc vào việc sử dụng bạn đang tạo thuộc tính android:process.

Xem xét tần suất gặp giới hạn bộ nhớ khi phát triển cho thiết bị Android, trong một số trường hợp, có thể cho phép bạn chia nhỏ các phần của ứng dụng thành các quy trình riêng biệt. quà tặng. Có thể có những mối nguy hiểm tiềm ẩn trong việc thực hiện điều này mà tôi chưa xem xét hoặc có kinh nghiệm, nhưng cho đến nay, rất tốt, trong trường hợp cụ thể của tôi.

+0

Cảm ơn câu trả lời của bạn, điều này rất hữu ích! Tôi tự hỏi liệu bạn có thể làm sáng tỏ một số quy trình từ xa bị giết khi người dùng xóa ứng dụng trong giao diện người dùng "ứng dụng gần đây". Tôi đã đọc [câu hỏi này] (http://android.stackexchange.com/questions/19987/what-actually-happens-when-you-swipe-an-app-out-of-the-recent-apps-list#_ = _) và tôi tò mò muốn biết bạn có trải nghiệm hành vi tương tự không. –

+0

@Steven: Điều đó rất thú vị; Tôi đã không biết về hành vi đó chút nào. Triết lý của Android nói chung là để hệ điều hành quyết định, khác với khi người dùng sử dụng nút Quay lại để thoát khỏi ứng dụng. Tôi chỉ cố gắng chạy ứng dụng của riêng tôi https://play.google.com/store/apps/details?id=com.goalstate.WordGames.FullBoard.trialsuite (sử dụng phương pháp này cho Trợ giúp của nó), và vuốt xuống một trong hai quá trình của ứng dụng hoặc quá trình trợ giúp dường như giết cả hai (mặc dù người còn lại vẫn còn trong danh sách được sử dụng gần đây). Bạn có thể thử điều này trong khi chạy DDMS để chắc chắn. – Carl

+0

Tôi hiểu nỗ lực bạn đã dành để ẩn hoạt động khỏi Cuộc gọi gần đây. Nhưng liệu nó có liên quan gì đến việc lạm phát một quy trình mới? – zgulser

5

@Carl

mối nguy hiểm

Có thể được ẩn:

  • Memory không thể được phát hành Khi có một dịch vụ nền (ví dụ: android: quá trình = ": myhelp") trong quá trình tương tự.
  • Không thể sử dụng mẫu Singleton.

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

Quá trình này hiện đã gần như tăng gấp ba lần kích thước, đến 4MB, chỉ đơn giản bằng cách hiển thị một số văn bản trong giao diện người dùng. Điều này dẫn đến một kết luận quan trọng: Nếu bạn đang sẽ chia ứng dụng của bạn thành nhiều quy trình, chỉ một quy trình phải chịu trách nhiệm về giao diện người dùng. Các quy trình khác nên tránh bất kỳ giao diện người dùng nào, vì điều này sẽ nhanh chóng tăng RAM theo quy trình (đặc biệt là khi bạn bắt đầu tải các tài sản bitmap và các tài nguyên khác). Sau đó, có thể khó hoặc không thể giảm mức sử dụng bộ nhớ khi giao diện người dùng được vẽ.

+0

Trong trường hợp của tôi, người dùng truy cập trợ giúp từ hoạt động chính của ứng dụng và thường thoát khỏi quy trình trợ giúp sau khi được tư vấn, quay lại hoạt động chính và quy trình của nó. Vì vậy, đối với một chút tạm thời của bộ nhớ thêm trong khi hiển thị trợ giúp, điều này hoạt động rất tốt. Và tất nhiên quy trình trợ giúp của tôi liên quan đến giao diện người dùng, nhưng điều này không gây ra sự cố. Tôi tin rằng nếu người dùng truy cập trực tiếp từ việc xem trợ giúp cho một ứng dụng khác, thì hệ điều hành sẽ có thể tung cả hai quy trình của ứng dụng của riêng tôi ra khỏi bộ nhớ để cung cấp bộ nhớ, nếu cần bởi ứng dụng khác đó. – Carl

+0

Tôi xin lưu ý rằng quy trình trợ giúp trong ví dụ của riêng tôi không phải là một dịch vụ; nó là một hoạt động. Ngoài ra, quá trình trợ giúp không sử dụng các đối tượng được tạo trong tiến trình chính, vì vậy không có gì ngăn cản việc sử dụng một mẫu đơn trong quá trình chính của tôi, và trên thực tế tôi sử dụng mẫu đó. – Carl

Các vấn đề liên quan