2013-04-23 34 views
6

ứng dụng Android của chúng tôi sinh ra một quá trình shell logcat và sau đó đọc kết quả của nó để xử lý. Tuy nhiên, khi ứng dụng dừng (ví dụ: khi khởi động lại sau khi biên dịch lại trong quá trình phát triển), quá trình đăng nhập sẽ tiếp tục chạy. Dưới đây là ví dụ về hành vi này:Android: Quá trình con (logcat) tiếp tục chạy sau khi quá trình cha mẹ (ứng dụng) chết

processes = new ArrayList<Process>(); 

try { 
    processes.add(Runtime.getRuntime().exec("logcat -v time")); 
    processes.add(Runtime.getRuntime().exec("logcat -v time")); 
    processes.add(Runtime.getRuntime().exec("logcat -v time")); 
    processes.add(Runtime.getRuntime().exec("logcat -v time")); 
} catch (IOException e) { 
    // oh no! 
} 

Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { 
    for (Process p : processes) { 
     p.destroy(); 
    } 
    }; 
}); 

Thêm phương thức này vào phương thức onCreate() của ứng dụng thử nghiệm, khởi động ứng dụng, sau đó ngừng sử dụng trình quản lý cài đặt. Các quy trình con sẽ tiếp tục chạy, giờ đây có id mẹ là 1.

Trong How to kill logcat process initiated by Android application?, đề xuất sử dụng ProcessBuilder, nhưng đó không phải là giải pháp và quá trình cũng sẽ tiếp tục chạy.

Trong Stop child process when parent process stops nó đã được suggsted sử dụng móc ngắt - không hoạt động như được minh họa ở trên.

Cảm ơn!

+0

Bạn đã thử gọi p.waitFor() sau p.destroy() chưa? Cuộc gọi cũ chờ quá trình con chấm dứt và nhận trạng thái trả về, trước khi tiếp tục hủy bỏ trạng thái tiếp theo. – Vikdor

+0

@Vikdor Cảm ơn, nhưng không, không hoạt động. Trong thực tế, việc thêm một cuộc gọi đăng nhập vào hook shutdown cho thấy rằng nó không được gọi khi nào ứng dụng (force-) dừng lại. – hez

+0

Tôi đoán bản sao của 'processes' trong' new Thread() 'rỗng. Bạn đã đăng nhập từ vòng lặp 'for' hoặc từ bên ngoài vòng lặp? Bạn có thể đánh dấu các quá trình là dễ bay hơi để các chủ đề sẽ không lưu lại bản sao, và sau đó kiểm tra? – Vikdor

Trả lời

1

Điều bạn có thể làm là xoay vòng một tập lệnh khác trong đó mục đích duy nhất là xem chương trình Java của bạn. Bất cứ khi nào nó chết, giết tất cả các con của nó quá.

Một ví dụ mong manh:

int pid = android.os.Process.myPid(); 
String script = "while [ -d /proc/" + pid + " ];do sleep 1;done; killall logcat"; 
Process p = Runtime.getRuntime().exec("/system/bin/sh", "-c", script); 

này giả định rằng quá trình của bạn không chạy như là người chủ, do đó chỉ giết chết quá trình logcat riêng của mình. Trong chức năng tắt máy của bạn, trước tiên bạn nên giết các quy trình khác (logcat) và sau đó chạy p.destroy(); để dừng tập lệnh sát thủ này.

Có thể cải thiện tập lệnh ở trên bằng cách xóa sử dụng killall. Thay vào đó, hãy lấy ID quy trình của các quy trình logcat của bạn bằng cách sử dụng Phản ánh (this answer điểm đến http://www.golesny.de/p/code/javagetpid) và chuyển chúng đến kill.

+0

Rực rỡ, bạn rất thông minh. Cảm ơn một tỷ người! – Krypton

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