Sự khác biệt giữa onStart () và onResume ()


176

Tôi không thể hiểu ý nghĩa của onStart()trạng thái chuyển tiếp. Các onResume()phương pháp luôn được gọi sau onStart(). Tại sao nó không thể onResume()được gọi sau onRestart()onCreate()các phương thức chỉ loại trừ onStart()? Mục đích của nó là gì?

Tại sao chúng ta không thể sống mà không có onStart(). Tôi vẫn coi nó là dư thừa (có lẽ vì không hiểu ý nghĩa của nó hoàn toàn).


Xem tại đây để xem vòng đời của ứng dụng: d.android.com/guide/topics/fundamentals.html
ykatchou

Công cụ này là dễ dàng. Hãy thử giải thích điều này VỚI Fragment, bây giờ đó là lập trình Android cho bạn!
Scott Biggie

Câu trả lời dưới đây không có mã thực tế với lời giải thích. Đây là mã giải thích nó với đoạn.
Atul

Câu trả lời:


306

Tại sao không thể gọi onResume () sau khi các phương thức onRestart () và onCreate () chỉ loại trừ onStart ()? Mục đích của nó là gì?

OK, vì câu trả lời đầu tiên của tôi khá dài nên tôi sẽ không mở rộng thêm nữa nên hãy thử điều này ...

public DriveToWorkActivity extends Activity
    implements onReachedGroceryStoreListener {
}

public GroceryStoreActivity extends Activity {}

XIN LƯU Ý: Tôi đã cố tình bỏ qua các cuộc gọi đến những thứ như super.onCreate(...)v.v ... Đây là mã giả vì vậy hãy cho tôi một số giấy phép nghệ thuật ở đây. ;)

Các phương pháp để làm DriveToWorkActivitytheo ...

protected void onCreate(...) {
    openGarageDoor();
    unlockCarAndGetIn();
    closeCarDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

protected void onStart() {
    startEngine();
    changeRadioStation();
    switchOnLightsIfNeeded();
    switchOnWipersIfNeeded();
}

protected void onResume() {
    applyFootbrake();
    releaseHandbrake();
    putCarInGear();
    drive();
}

protected void onPause() {
    putCarInNeutral();
    applyHandbrake();
}

protected void onStop() {
    switchEveryThingOff();
    turnOffEngine();
    removeSeatBeltAndGetOutOfCar();
    lockCar();
}

protected void onDestroy() {
    enterOfficeBuilding();
}

protected void onReachedGroceryStore(...) {
    Intent i = new Intent(ACTION_GET_GROCERIES, ...,  this, GroceryStoreActivity.class);
}

protected void onRestart() {
    unlockCarAndGetIn();
    closeDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

OK, vậy nó là một cái dài khác (xin lỗi mọi người). Nhưng đây là lời giải thích của tôi ...

onResume()là khi tôi bắt đầu lái xe và onPause()là khi tôi dừng lại tạm thời. Vì vậy, tôi lái xe sau đó đạt đèn đỏ nên tôi dừng lại ... đèn sáng và tôi tiếp tục. Một đèn đỏ khác và tôi dừng lại, sau đó màu xanh lá cây để tôi tiếp tục. Các onPause() -> onResume() -> onPause() -> onResume()vòng lặp là một chặt chẽ và xảy ra nhiều lần thông qua cuộc hành trình của tôi.

Vòng lặp từ bị dừng trở lại thông qua khởi động lại (chuẩn bị thực hiện hành trình của tôi) để bắt đầu lại có lẽ ít phổ biến hơn. Trong một trường hợp, tôi phát hiện ra Cửa hàng tạp hóa và GroceryStoreActivitynó được bắt đầu (buộc tôi DriveToWorkActivityđến điểm onStop()). Khi tôi trở về từ cửa hàng, tôi đi qua onRestart()onStart()sau đó tiếp tục hành trình của mình.

Tôi có thể đặt mã đó onStart()vào cả hai onCreate()onRestart()không bận tâm đến việc ghi đè lên onStart()tất cả, nhưng càng cần phải thực hiện giữa onCreate() -> onResume()onRestart() -> onResume(), tôi càng nhân đôi nhiều thứ.

Vì vậy, để yêu cầu một lần nữa ...

Tại sao không thể gọi onResume () sau khi các phương thức onRestart () và onCreate () chỉ loại trừ onStart ()?

Nếu bạn không ghi đè onStart()thì đây thực sự là những gì xảy ra. Mặc dù onStart()phương thức Activitysẽ được gọi ngầm, nhưng hiệu quả trong mã của bạn là hiệu quả onCreate() -> onResume()hoặc onRestart() -> onResume().


Điều này ngụ ý rằng cả hai onCreate()onRestart()sẽ chia sẻ rất nhiều mã chung, phải không?
Dheeraj Vepakomma

1
@Dheeraj: Không nhất thiết. Đây là mã giả và có nghĩa là chỉ minh họa cách mỗi giai đoạn của vòng Activityđời có thể được sử dụng. Giai đoạn tạo onCreate(...)có thể làm rất tốt khi bắt đầu các thành viên thể hiện (các thành phần UI, v.v.) nhưng 'khởi động lại' không cần phải làm điều đó. Trên thực tế nhiều Activitieskhông thực sự cần phải thực hiện nhiều hơn onCreate(...), onResume()onPause()các phương pháp khác có sẵn cho trường hợp bạn có thể cần phải làm những việc khác và quan trọng là phải hiểu nơi để đặt mã.
Squonk

1
Đây là lý do tại sao tôi ghét API Android so với iOS và thậm chí WP7 ... Tôi đã tạo ra một trò chơi chạy trên cả ba trong C # và tôi phải nói rằng tôi rất thất vọng với Google và Android. Họ dường như đang thiếu trong bộ phận thiết kế Ngôn ngữ / API. Tôi thực sự hy vọng một số hệ điều hành điện thoại linux khác sẽ tiếp quản, vì tôi nói chung là bỏ phiếu cho Nguồn mở nói chung ...
zezba9000

2
@Tim: OK, đến với một thiết kế tốt hơn. Làm thế nào bạn sẽ đối phó với một kịch bản trên điện thoại di động khi ai đó đang sử dụng một ứng dụng (ứng dụng của bạn) và họ đột nhiên nhận được một cuộc gọi điện thoại? Nhà thiết kế ứng dụng không gọi một cách rõ ràng các Activityphương thức vòng đời - đó là HĐH Android thực hiện và thực hiện rất hiệu quả (giả sử nhà phát triển ứng dụng biết họ đang làm gì và cũng viết mã hiệu quả). Nếu bạn thực hiện nhiều phát triển Android, bạn sẽ nhận ra lý do tại sao mọi thứ hoạt động theo cách họ làm - nó không hoàn hảo 100% nhưng nó khá tốt.
Squonk

9
Tôi nghĩ rằng câu trả lời của Nilesh dưới đây rõ ràng hơn nhiều. Sự khác biệt chính giữa onStartonResumelà 'khả năng hiển thị' và 'tương tác người dùng'. Ẩn dụ lái xe ô tô này là khó hiểu và không thực sự hữu ích.
KJ

142

Câu trả lời ngắn:

Chúng ta không thể sống mà không khởi động vì đó là trạng thái khi hoạt động trở nên "hiển thị" với người dùng, nhưng người dùng không thể "tương tác" với nó nhưng có thể khiến nó bị chồng chéo với một số hộp thoại nhỏ khác. Khả năng tương tác với người dùng này là khả năng phân biệt onStart và onResume. Hãy nghĩ về nó như một người đằng sau cánh cửa kính. Bạn có thể nhìn thấy người đó nhưng bạn không thể tương tác (nói / nghe / bắt tay) với anh ấy. OnResume giống như công cụ mở cửa sau đó bạn có thể bắt đầu tương tác.

Ngoài ra, onRestart () là cái ít được hiểu nhất. Chúng ta có thể đặt câu hỏi là tại sao không trực tiếp truy cập onStart () hoặc onResume () sau onStop () thay vì onRestart (). Sẽ dễ hiểu hơn nếu chúng ta lưu ý rằng onRestart () tương đương một phần với onCreate () nếu phần tạo được bỏ qua. Về cơ bản cả hai trạng thái đều dẫn đến onStart () (tức là Hoạt động trở nên hiển thị). Vì vậy, cả hai tiểu bang phải "chuẩn bị" những thứ sẽ được hiển thị. OnCreate có trách nhiệm bổ sung để "tạo" nội dung được hiển thị

Vì vậy, cấu trúc mã của chúng có thể phù hợp với một cái gì đó như:

onCreate()
{
     createNecessaryObjects();

     prepareObjectsForDisplay();
}


onRestart()
{
     prepareObjectsForDisplay();

}

Toàn bộ sự nhầm lẫn được gây ra do Google đã chọn các tên không trực quan thay vì một cái gì đó như sau:

onCreateAndPrepareToDisplay()   [instead of onCreate() ]
onPrepareToDisplay()            [instead of onRestart() ]
onVisible()                     [instead of onStart() ]
onBeginInteraction()            [instead of onResume() ]
onPauseInteraction()            [instead of onPause() ]
onInvisible()                   [instead of onStop]
onDestroy()                     [no change] 

Sơ đồ hoạt động có thể được hiểu là:

Vòng đời hoạt động của Android


4
Khi tôi giải thích nó cho sinh viên, tôi sử dụng mayOnInvisible () thay vì onStop (). Và sử dụng mayOnDestroy () thay vì onDestroy (). Những cái tên này hoạt động tốt như những lời giải thích tôi tìm thấy. Thiết nghĩ, tôi sẽ không muốn Google thực sự đổi tên này.
Stephan Branchot

Tôi như tên gợi ý của bạn, họ giúp làm cho một số ý nghĩa của phần này của API Android lố bịch. Tôi vẫn có một câu hỏi nói chung về vòng đời. Trong tất cả các sơ đồ, nó cho thấy có một đường dẫn từ onPause trực tiếp đến onResume. Tôi không nghĩ rằng tôi đã từng thấy con đường đó thực sự đi theo trong mọi trường hợp. Nó luôn đi theo đường dẫn từ onStop đến onStart. Điều gì sẽ kích hoạt con đường khác?
Dewey Vozel

@StephanBranchot tại sao bạn sử dụng có thể ... ()? Tại sao "có thể"?
Mary Paździoch

1
@Damnum, Để được giải thích gần đây nhất về vòng đời Activity, tôi khuyên bạn nên kiểm tra khóa học Android Udacity trung gian do Google tạo. Nó miễn phí, giả sử bạn nhấp vào nút màu xanh để truy cập tài liệu của nó miễn phí, chứ không phải nút dùng thử (cũng không phải nút nanodegree). udacity.com/cference/developing-android-apps--ud853
Stephan Branchot

1
@Damnum, tôi khuyên bạn nên hỏi câu hỏi đó trong diễn đàn udacity liên quan đến video bạn đã xem. Nhưng về cơ bản, tôi nghĩ nó phụ thuộc vào hộp thoại đang được sử dụng, cho dù đó là hoạt động của hộp thoại hay chỉ là hộp thoại.
Stephan Branchot

29

onStart()được gọi khi hoạt động đang trở nên hiển thị cho người dùng. onResume()được gọi khi hoạt động sẽ bắt đầu tương tác với người dùng. Bạn có thể muốn làm những điều khác nhau trong trường hợp này.

Xem liên kết này để tham khảo.



10

Cuốn sách "Xin chào, Android, Giới thiệu Nền tảng phát triển di động của Google" đưa ra một lời giải thích hay về vòng đời của các ứng dụng Android. May mắn thay họ có chương cụ thể trực tuyến như một đoạn trích. Xem hình trên trang 39 trong http://media.pragprog.com/title/eband3/con accept.pdf

Nhân tiện, cuốn sách này rất được khuyến khích cho người mới bắt đầu Android!


2
Hình ảnh đẹp và cuốn sách hay, nhưng nó vẫn không đưa ra câu trả lời tại sao chúng ta thực sự cần phương thức onStart () và những điều đặc biệt chúng ta có thể làm trong đó chúng ta không thể làm trong onResume ().
Eugene

8
onStart () KHÔNG được gọi, nếu ứng dụng bị tạm dừng. Ứng dụng của bạn bị "tạm dừng" nếu một ứng dụng khác đạt được trọng tâm nhưng KHÔNG làm mờ hoàn toàn ứng dụng của bạn. Vì vậy, bạn có thể làm những việc khác nhau ở trạng thái "tạm dừng" so với bạn sẽ làm trong trạng thái "Đã dừng". Do đó, bạn có thể làm những việc khác nhau nếu ứng dụng của bạn chỉ được "tiếp tục" từ trạng thái tạm dừng so với khi bạn làm ứng dụng của mình "bắt đầu" từ trạng thái dừng hoặc bắt đầu hoàn toàn. cái đó có giúp ích không?
Martin Booka Weser

7

Một ví dụ đặc biệt khó chịu là khi bạn quyết định hiển thị Hộp thoại được quản lý từ một Hoạt động bằng cách sử dụng showDialog(). Nếu người dùng xoay màn hình trong khi hộp thoại vẫn mở (chúng tôi gọi đây là "thay đổi cấu hình"), thì Hoạt động chính sẽ trải qua tất cả các cuộc gọi vòng đời kết thúc cho đến khi onDestroy(), sẽ được tạo lại và quay trở lại qua các vòng đời. Tuy nhiên, điều bạn có thể không mong đợi là, onCreateDialog()onPrepareDialog()(các phương thức được gọi khi bạn thực hiện showDialog()và bây giờ lại tự động tạo lại hộp thoại - tự động vì nó là hộp thoại được quản lý) được gọi giữa onStart()onResume(). Điểm đáng chú ý ở đây là hộp thoại không bao phủ toàn màn hình và do đó để lại một phần của hoạt động chính. Đó là một chi tiết nhưng nó quan trọng!


7

onStart()

  1. Được gọi sau onCreate (Gói) hoặc sau onRestart () theo sau là onResume () .
  2. bạn có thể đăng ký BroadcastReceiver onStart()để theo dõi các thay đổi ảnh hưởng đến giao diện người dùng của bạn, Bạn phải hủy đăng ký nó trong onStop ()
  3. Các lớp dẫn xuất phải gọi thông qua việc thực hiện phương thức này của siêu lớp. Nếu họ không, một ngoại lệ sẽ được ném.

onResume()

  1. Được gọi sau onRestoreInstanceState (Gói), onRestart () hoặc onPause ()
  2. Bắt đầu hoạt hình, mở các thiết bị truy cập độc quyền (như máy ảnh)

onStart() thông thường gửi công việc đến một luồng nền, có giá trị trả về là:

  • START_STICKY để tự động khởi động lại nếu bị giết, để giữ cho nó hoạt động.

  • START_REDELIVER_INTENT để tự động khởi động lại và thử lại nếu dịch vụ bị tắt trước stopSelf ().

onResume()được HĐH gọi sau khi thiết bị chuyển sang chế độ ngủ hoặc sau khi Cảnh báo hoặc hoạt động con màn hình một phần khác để lại một phần của cửa sổ trước đó, do đó, một phương thức cần phải khởi tạo lại các trường (trong cấu trúc thử với một ngoại lệ ). Một tình huống như vậy không gây ra onStop()được viện dẫn khi đứa trẻ đóng cửa.

onResume()được gọi mà không có onStart()khi hoạt động tiếp tục từ nền

Để biết thêm chi tiết, bạn có thể truy cập Android_activity_lifecycle_gotchaVòng đời hoạt động


thực sự tôi đã dừng lại khi ứng dụng của tôi chạy nền
cá chết

5

Hy vọng một lời giải thích đơn giản: -

onStart () -> được gọi khi hoạt động hiển thị, nhưng có thể không ở phía trước (ví dụ: AlertFragment nằm trên cùng hoặc bất kỳ trường hợp sử dụng nào khác có thể).

onResume () -> được gọi khi hoạt động ở phía trước hoặc người dùng có thể tương tác với Hoạt động.


4

onStart()có nghĩa là được Activitynhập vào trạng thái hiển thị và bố cục được tạo nhưng không thể tương tác với bố cục hoạt động này.

Resume() có nghĩa là bây giờ bạn có thể tương tác với bố trí hoạt động.


1

Lưu ý rằng có những điều xảy ra giữa các lệnh gọi onStart () và onResume (). Cụ thể, onNewIntent (), mà tôi đau đớn phát hiện ra.

Nếu bạn đang sử dụng cờ SINGLE_TOP và bạn gửi một số dữ liệu cho hoạt động của mình, sử dụng các mục đích bổ sung, bạn sẽ chỉ có thể truy cập nó trong onNewIntent (), được gọi sau onStart () và trước onResume (). Vì vậy, thông thường, bạn sẽ lấy dữ liệu mới (có thể chỉ được sửa đổi) từ các tính năng bổ sung và đặt nó cho một số thành viên lớp hoặc sử dụng setIntent () để đặt mục đích mới làm mục đích hoạt động ban đầu và xử lý dữ liệu trong onResume ().


0

Tham khảo tại http://developer.android.com/training/basics/activity-lifecycle/starting.html

onResume()Được gọi ngay trước khi hoạt động bắt đầu tương tác với người dùng. Tại thời điểm này, hoạt động nằm ở đầu ngăn xếp hoạt động, với đầu vào của người dùng sẽ đến đó. Luôn luôn theo sau onPause().

onPause()Được gọi khi hệ thống sắp bắt đầu hoạt động trở lại. Phương pháp này thường được sử dụng để cam kết các thay đổi chưa được lưu đối với dữ liệu liên tục, dừng hoạt ảnh và những thứ khác có thể đang tiêu thụ CPU, v.v. Nó nên làm bất cứ điều gì nó làm rất nhanh, bởi vì hoạt động tiếp theo sẽ không được tiếp tục cho đến khi nó trở lại. Tiếp theo là onResume()nếu hoạt động quay trở lại phía trước hoặc onStop()nếu nó trở nên vô hình với người dùng.


0

Không chắc chắn nếu điều này được tính là một câu trả lời - nhưng đây là Video YouTube từ Khóa học của Google (Phát triển ứng dụng Android với Kotlin) giải thích sự khác biệt.

  • Bắt đầu được gọi khi hoạt động trở nên hiển thị
  • Tạm dừng được gọi khi hoạt động mất tiêu điểm (như hộp thoại bật lên)
  • Trên Resume được gọi khi hoạt động đạt được tiêu điểm (như khi hộp thoại biến mất)
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.