2013-03-21 33 views
5

Tôi đang sử dụng dịch vụ AIDL trong ứng dụng của mình. Tôi cũng muốn chạy một quy trình khác, vì vậy tôi sử dụng android:process=":remote" trong khai báo dịch vụ trong tệp kê khai.sử dụng android: process = ": remote" tạo lại đối tượng ứng dụng Android

Vấn đề của tôi là khi quá trình :remote bắt đầu, nó có vẻ tái tạo đối tượng Application.

Tôi thực sự không làm như vậy khi tôi ghi đè đối tượng ứng dụng và gọi nhiều công cụ của khách hàng theo phương thức onCreate(). Tuy nhiên, tôi muốn mã dịch vụ cư trú trong cùng một gói ứng dụng với khách hàng.

Tôi có thể đạt được điều đó không? Đối tượng Application có được tạo lại khi quá trình mới bắt đầu không?

Đánh giá cao sự trợ giúp của bạn. Cảm ơn!

Trả lời

4

Tôi cũng muốn chạy nó khác quá trình

Tại sao? Giá trị nào thêm vào người dùng, để bù đắp thêm RAM, CPU và chi phí pin? Rất ít ứng dụng cần nhiều quá trình.

Vấn đề của tôi là khi ': từ xa' quá trình bắt đầu nó dường như tái tạo đối tượng Application

Tất nhiên rồi. Mỗi quá trình đều có riêng của nó.

Tôi thực sự không với điều đó như tôi ghi đè lên đối tượng ứng dụng và gọi rất nhiều thứ client trong 'onCreate()' phương pháp

Sau đó thoát khỏi android:process=":remote". Người dùng của bạn sẽ cảm ơn bạn.

Tuy nhiên, tôi muốn mã dịch vụ cư trú trong cùng một gói ứng dụng với ứng dụng khách.

Dịch vụ nào?

Đối tượng ứng dụng luôn được tạo lại khi quá trình mới bắt đầu?

Có.

+0

thì tại sao thuộc tính android: process = ": remote" có thể được đặt cho từng thành phần? Tôi có nghĩa là không phải là nó để cho các thành phần được chạy trong các quá trình khác nhau? Tôi thực sự muốn sự linh hoạt này trong trường hợp nếu dịch vụ từ xa bị treo do đó nó sẽ không sụp đổ khách hàng của tôi quá. –

+1

@ user1986565: "Tôi thực sự muốn tính linh hoạt này trong trường hợp dịch vụ từ xa bị treo do đó nó sẽ không làm hỏng máy khách của tôi" - nhà phát triển tài năng sử dụng các kỹ thuật khác, chẳng hạn như xử lý ngoại lệ chưa xử lý, để giải quyết vấn đề này, thay vì lãng phí CPU của người dùng , RAM và pin. – CommonsWare

+0

có dịch vụ từ xa lãng phí nhiều RAM CPU và pin hơn cục bộ không? Ý tôi là - nó thực hiện cùng một mã. Vì vậy, CPU và sử dụng pin là như nhau. Nó có đống riêng của nó, nhưng heap đang phát triển nên nó không nên quá lãng phí. Liệu tôi có sai? –

1

Như đã đề cập bởi CommonsWare, mỗi quy trình sẽ có đối tượng Application riêng.

Trong phương thức Application.onCreate(), bạn có thể kiểm tra xem phương thức có đang được gọi từ trong quá trình chính hay từ trong quá trình từ xa và khởi tạo các nội dung khác nhau tương ứng.

@Override 
public void onCreate() 
{ 
    super.onCreate(); 

    if(isRemoteProcess(this)) 
    { 
     // initialize remote process stuff here 
    } 
    else 
    { 
     // initialize main process stuff here 
    } 
} 

private boolean isRemoteProcess(Context context) 
{ 
    Context applicationContext = context.getApplicationContext(); 
    long myPid = (long) Process.myPid(); 
    List<RunningAppProcessInfo> runningAppProcesses = ((ActivityManager) applicationContext.getSystemService("activity")).getRunningAppProcesses(); 
    if (runningAppProcesses != null && runningAppProcesses.size() != 0) 
    { 
     for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses) 
     { 
      if (((long) runningAppProcessInfo.pid) == myPid && "YOUR_PACKAGE_NAME:remote".equals(runningAppProcessInfo.processName)) 
      { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
Các vấn đề liên quan