Activity.finish () hoạt động như thế nào trong Android?


Câu trả lời:


123

Nó có thoát ngay lập tức hay hoàn thành chức năng mà nó được gọi không?

Phương thức được gọi finish()sẽ chạy đến khi hoàn thành. Các finish()hoạt động thậm chí sẽ không bắt đầu cho đến khi bạn trở về điều khiển Android.


3
Sau đó, làm thế nào để kết thúc một hoạt động được gọi bởi StartAvtivityforResults () mà không hoàn thành?
Ayush Pateria

@CommonsWare Làm thế nào chúng tôi có thể đảm bảo rằng onStop luôn được gọi? Trong ứng dụng của tôi, OnStop và onDestroy không được gọi trong một số trường hợp và trong những trường hợp đó, hoạt động con mất quá nhiều thời gian để hoàn thành và có vẻ như Ứng dụng đã bị treo ... Trong khi khi onStop được gọi là mọi thứ hoạt động bình thường. Tôi đang sử dụng Galaxy y với Android 2.3.6 ... xem câu hỏi của tôi tại stackoverflow.com/questions/13928591/… làm ơn giúp !!!
Amit

@CommonsWare tôi đã kiểm tra rất đúng. +1 cho bạn Nhưng tôi muốn hỏi một câu hỏi Tôi đã viết finish () như một câu lệnh đầu tiên trong hàm của tôi, sau đó nó đang thực thi toàn bộ hàm và sau đó finish () được gọi là cách quản lý này.
Nikhil Agrawal

@NikhilAgrawal, bạn có thể trả về hàm của mình ngay sau khi kết thúc () được gọi.
antonio081014

Có phải finish () cũng gọi onPause () và onStop () trước khi gọi onDestroy () không?
sr09

20

Mỗi sự kiện vòng đời như onCreate, onResume, onPause.... onDestroycủa một Hoạt động luôn luôn kêu gọi một chủ đề duy nhất - Các "chủ đề chính".

Tóm lại, chuỗi này được hỗ trợ bởi một Hàng đợi mà tất cả các sự kiện hoạt động sẽ được đăng. Luồng này có thể thực thi tất cả các sự kiện này theo thứ tự chèn.

Nếu bạn đang gọi finish()trong một trong các lệnh gọi lại vòng đời như onCreate()... thì một thông báo "kết thúc" sẽ được thêm vào hàng đợi này nhưng luồng không được tự do chọn và thực hiện hành động "kết thúc" cho đến khi phương thức thực thi hiện tại trả về tức là Luồng được giải phóng khỏi nhiệm vụ hiện tại.


13

ondestroy() là cuộc gọi cuối cùng bạn nhận được trước khi hoạt động của bạn bị hủy.

Điều này có thể xảy ra do hoạt động đang kết thúc (ai đó đã gọi finish() nó hoặc do hệ thống đang tạm thời hủy phiên bản hoạt động này để tiết kiệm dung lượng. Bạn có thể phân biệt giữa hai tình huống này bằng isFinishing() phương pháp.


1

Nếu có hai hoạt động A và B. Và luồng của bạn đang đi từ A> B; và B = A gọi finish().

Sau đó,

Phương thức mà bạn đã gọi finish()sẽ thực thi như Mark đã đề cập. Và luồng gọi lại sẽ như sau:

  1. onPause() của activity A
  2. onRestart()> onStart()> onResume()Của Hoạt động B
  3. Sau đó, đến sự khác biệt thực sự. Nếu bạn không gọi finish()từ activity A; chỉ onStop()trong số Activity Asẽ được gọi ở đây. Trong khi, trong trường hợp này, chúng tôi đã gọi finish()từ đâu Activity A; Vì vậy, onStop()onDestroy()cả hai sẽ được gọi cho activity A.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.