2010-07-13 16 views
15

Vì vậy, tôi có Hoạt động của tôi và nhấn nút "Thoát" tôi gọi Activity.finish(). Điều này có hiệu quả đóng ứng dụng của tôi.Làm thế nào để giết hoạt động của riêng tôi - một cách khó khăn

Vấn đề: Quá trình Dalvik của đơn đăng ký của tôi vẫn bị treo xung quanh dưới dạng zombie trong nền. Có vẻ như điều này là bình thường vì các ứng dụng khác cũng làm như vậy. Ngay cả ví dụ hello-world treo xung quanh trong bộ nhớ ..

Tôi có thể sống với điều này, nhưng unfortunatley hành vi này làm cho sự phát triển của ứng dụng của tôi là một nỗi đau. Tôi có một dịch vụ từ xa được kết nối với Hoạt động của tôi và dịch vụ này sẽ không tải xuống cho đến khi Hoạt động của tôi bị dỡ bỏ (như đã nói, nó không bao giờ thực hiện).

Mọi thứ bằng cách nào đó được giữ nguyên không có lý do chính đáng.

Làm cách nào để có thể thực sự xóa Hoạt động của tôi khỏi bộ nhớ?

Tôi đang tìm một cái gì đó như Activity.finish_and_kill_my_process_please() gọi hoặc một cái gì đó tương tự.

Trả lời

8

Vì vậy, tôi có Hoạt động của tôi và khi nhấn nút "Thoát", tôi gọi Activity.finish(). Điều này có hiệu quả đóng ứng dụng của tôi.

Please don't do this.

Quy trình Dalvik của đơn đăng ký vẫn bị treo xung quanh như một zombie ở nền.

Quy trình được lưu trong bộ nhớ cache, để Android có thể tái sử dụng tiềm năng. Bạn có thể bỏ qua nó một cách an toàn.

Tôi có một dịch vụ từ xa kết nối với Hoạt động của tôi, và dịch vụ này sẽ không dỡ bỏ cho đến khi Hoạt động của tôi unloads (mà như đã nói nó không bao giờ làm).

Bạn có thể có một lỗi trong ứng dụng của bạn, chẳng hạn như gọi startService() và thất bại trong việc gọi stopService(), hoặc gọi bindService() và thất bại trong việc gọi unbindService().

6

Hãy thử sử dụng phương pháp killBackgroundProcesses:

ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
activityManager.killBackgroundProcesses("name.of.your.package"); 

Bạn sẽ cần thêm quyền KILL_BACKGROUND_PROCESSES đến file AndroidManifest.xml của bạn.

+0

Ok, có vẻ như phương pháp này không còn là một phần của lớp ActivityManager ?? – bugzy

+0

Có một API mới cho Android 2.2 Froyo nhưng đây là một ý tưởng rất tồi. Quyền đó được đánh dấu là NGUY HIỂM và người dùng sẽ thấy rằng ứng dụng của bạn có khả năng giết các ứng dụng khác. – Tom

+0

Trong khi chấm dứt quá trình của một ứng dụng gần như không bao giờ là ý tưởng hay bên ngoài các bài kiểm tra tối nghĩa trong quá trình phát triển, đây là cách xoay vòng không cần thiết để thực hiện. Một quá trình có thể chỉ đơn giản là thoát() hoặc tự hủy - nó không cần phải yêu cầu ActivityManager làm như vậy. –

24
  1. Gọi hoàn thành(); vào nút bấm
  2. Thêm dòng này vào phương pháp onDestroy:

android.os.Process.killProcess (android.os.Process.myPid());

public void onDestroy() { 
     super.onDestroy(); 
     android.os.Process.killProcess(android.os.Process.myPid()); 
    }  
+8

Đối với một ứng dụng phát hành KillProcess() không phải là một ý tưởng tốt. Nhưng đối với giai đoạn phát triển (tăng tốc độ chấm dứt của một ứng dụng cho mục đích gỡ lỗi) đây là một cuộc sống tiết kiệm. +1. – an00b

+0

Chắc chắn hữu ích khi phát triển (để sử dụng tạm thời) – Diljeet

+1

Điều này rất hữu ích để giúp tôi dỡ bỏ một lib gốc :-) – Miquel

3

Bằng cách giết chết quá trình này bạn có thể ngăn chặn các ứng dụng completely.from màn hình cuối cùng vào nút bấm lại bạn có thể giết chết quá trình theo:

public void onBackPressed() { 
     super.onBackPressed(); 
     int pid = android.os.Process.myPid(); 
     android.os.Process.killProcess(pid); } 
0

Bằng việc sử dụng ActivityManager chúng ta có thể đóng một ứng dụng khác nữa.

private ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); 
am.restartPackage("com.jimmy.appToBeClosed"); 

để sử dụng mã ở trên phải có quyền android.permission.RESTART_PACKAGE trong tệp kê khai.

+0

restartPackage hiện không được chấp nhận. sử dụng killBackgroundProcesses thay thế. – rfinz

4

Vâng, nếu không chỉ hoạt động, mà còn là ứng dụng mà bạn muốn chấm dứt, bạn có thể sử dụng

System.exit(0)

Người ta nói rằng nó bị phản đối hoặc ví dụ xấu, nhưng, cũng đó là Java tinh khiết và làm việc ...

+0

Bạn có biết tại sao mọi người nói những điều đó không? Liệu nó có liên quan đến cách ứng dụng "sống" trong Android O.S.? Điều này là hấp dẫn để sử dụng trong một trong các ứng dụng của tôi .. nhưng tôi muốn biết lý thuyết đằng sau sự nản lòng đầu tiên. – snapfractalpop

+2

Vâng, tôi nghĩ họ nói điều đó vì Android có thể tự quản lý các ứng dụng; vì vậy chúng tôi không nên chọc mũi của chúng tôi. Tôi nói đây là bullsh * t mặc dù: Nếu đó là ứng dụng của tôi, những người khác nhưng tôi có thể biết khi nào chấm dứt nó? :) –

0

System.exit() ngay lập tức trút toàn bộ máy ảo với tất cả các thư viện bản xứ, các dịch vụ và vv

1

Tương tự như các System.exit (0) ở phía bên Java, bạn cũng có thể gọi một người gốc phương pháp trong khi onD estroy gọi exit (0) ở phía C/C++. Điều này dường như buộc lib phải thoát hoàn toàn. Nó làm việc cho tôi!