Android: onDestroy () hoặc phương thức tương tự trong lớp Ứng dụng


75

Tôi đang mở rộng lớp Ứng dụng để làm việc với một số biến toàn cục cần ngữ cảnh. Tôi biết có phương thức onCreate () trong lớp Ứng dụng được gọi trước bất kỳ onCreate () nào khác trong các hoạt động, nhưng tôi muốn biết liệu có onDestroy () hoặc phương thức tương tự trong lớp Ứng dụng có thể bị ghi đè để tôi sẽ có thể lưu trữ các biến trong bộ nhớ liên tục, hủy đăng ký trình nghe và gửi thông báo cuối cùng đến máy chủ trước khi quy trình ứng dụng bị giết? Nếu không, có cách nào khác để làm điều đó?


Không, thực hiện điều này trong các phương pháp thích hợp ActivityhoặcService
Michael Butscher

13
Đã làm điều đó. Thật là phiền toái. Trên thực tế, lý do rất Tôi đang mở rộng ứng dụng là bởi vì sử dụng dịch vụ android làm cho tôi muốn khóc ... hoặc nhảy ra khỏi tòa nhà :(
Có lẽ Julius

Câu trả lời:


33

Không có cuộc gọi lại như vậy trên thiết bị sản xuất cho lớp Ứng dụng.

Những việc bạn muốn làm thường phải được thực hiện ngay sau khi thực hiện các thay đổi hoặc trong onPause()thành phần ứng dụng tương ứng.


8

Trong Android, không có khái niệm đóng ứng dụng. Người dùng chỉ rời đi: đây là sự kiện duy nhất mà bạn sẽ biết ( onPause()trong một hoạt động). Bạn nên thiết kế ứng dụng của mình sao cho phù hợp với vòng đời này.

Thông thường, bạn nên lưu mọi thay đổi ngay lập tức nhưng không đồng bộ, để giao diện người dùng không bị treo. Điều này tốt hơn nhiều so với việc lưu các thay đổi trong onPause()vì nếu điều gì đó xấu xảy ra trước khi ứng dụng bị tạm dừng (ứng dụng bị treo, người dùng hết pin), tất cả dữ liệu đã được lưu đúng cách.

SharedPreferencesđã lưu các thay đổi một cách không đồng bộ nên nếu bạn sử dụng nó, bạn không cần làm gì khác. Nếu không, bạn có thể sử dụng Kotlin coroutines hoặc nếu bạn sử dụng Java, cái cũ tốt AsyncTasklà rất tốt.


5

Bạn có thể ghi đè lên onDestroy()cái Activitynào sẽ là cái cuối cùng được đóng trong ứng dụng của bạn và kiểm tra xem nó đã hoàn tất chưa. Trong trường hợp này, mã của bạn sẽ không được gọi khi xoay thiết bị. Nhưng bạn nên biết rằng điều đó onDestroy()không được gọi khi một ứng dụng được đóng thông qua nút trang chủ của thiết bị.

@Override
public void onDestroy(){
    super.onDestroy();
    if(isFinishing()){
        //do your stuff here
    }
}

4

Trước hết: Tôi là một người mới bắt đầu tuyệt đối

Tôi cần thực thi một số mã khi ứng dụng của tôi thoát (vâng, tôi không biết điều đó trong Android) và điều này hoạt động tốt đối với tôi:

-Tôi có MyApplication wich mở rộng Ứng dụng. Là một thành viên của MyApplication, có một trường AtomicInteger có tên là activeActiilitiesNumber và một phương thức getter công khai.

-Tất cả các hoạt động ứng dụng mở rộng MyActivy (chính nó mở rộng Hoạt động)

-MyActivity ghi đè các phương thức onCreate, onResume và onStop và cũng có một trường được bảo vệ: Protected MyAppication mAppState;

a) OnCreate(){
super.onCreate();
mAppState=this.getApplication();...}


b) onResume(){
super.OnResume();
myAppState.getactiveActivitiesNumber().addAndGet(1)
....}

c) onStop(){
super.onStop()

if (myAppStatemyAppState.getactiveActivitiesNumber()..decrementAndGet()<1){
...call exiting code (for instance a public method defined in MyApplication}
}

Nó có một vấn đề: nếu bạn bắt đầu bất kỳ hoạt động nào không thuộc về ứng dụng của bạn (ví dụ: gửi email), nó sẽ kích hoạt phương thức thoát.

Một vấn đề khác (không biết liệu nó có phải là một vấn đề thực tế hay không) là không có gì đảm bảo tan trong một số tình huống onStop sẽ được gọi.

Hy vọng điều này giúp đỡ.


2

Bạn có thể sử dụng registerActivityLifecycleCallbacks()trong lớp Ứng dụng với các lệnh gọi lại sau (Tôi khuyên bạn nên tạo một AppLifecycleCallbackslớp mở rộng ActivityLifecycleCallbacks):

public interface ActivityLifecycleCallbacks {
    void onActivityCreated(Activity activity, Bundle savedInstanceState);
    void onActivityStarted(Activity activity);
    void onActivityResumed(Activity activity);
    void onActivityPaused(Activity activity);
    void onActivityStopped(Activity activity);
    void onActivitySaveInstanceState(Activity activity, Bundle outState);
    void onActivityDestroyed(Activity activity);
}
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.