2010-11-19 30 views
18

Tôi đã nhìn thấy điều này trong một vài hướng dẫn bây giờ ... nhưng làm thế nào trên thế giới có thể mã nguồn Android không có một phương pháp chính và vẫn chạy.Làm cách nào để mã nguồn Android không có phương thức chính và vẫn chạy?

Ví dụ (từ http://developer.android.com/guide/tutorials/hello-world.html):

public class HelloAndroid extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

Đó chạy nhưng không có chính !!!

Tôi cũng nghĩ rằng việc sử dụng những thứ như onCreate (hoặc formLoad, v.v.) là xấu bởi vì một nhà xây dựng nên làm công việc đó và các phương pháp tích hợp như vậy đôi khi có thể có mùi. Nhưng onCreate là một điểm vào? Ngay cả khi không có một chính?

Điều gì sẽ xảy ra nếu có nhiều hoạt động ... có phân cấp cho các trình xử lý sự kiện tích hợp này không? OnCreate trumps mọi thứ khác? Nếu không, làm thế nào ứng dụng sẽ biết những gì để chạy hoặc nơi để vào chương trình?

Cảm ơn!

Trả lời

5

Bạn cho biết thiết bị nào sẽ chạy khi khởi động trong tệp kê khai. Không có một chính() bởi vì không có được, chính có thể là một quy ước được sử dụng cho các ứng dụng java "thường xuyên", nhưng nó không phải là cho những thứ như trình duyệt applet. Hệ thống tạo ra đối tượng hoạt động và gọi các phương thức bên trong nó, có thể hoặc không thể được gọi là chính. Trong trường hợp này, nó không phải.

onCreate khác với chính và từ nhà xây dựng, ở chỗ nó có thể được gọi hai lần trên một hoạt động, chẳng hạn như nếu quá trình bị giết và người dùng điều hướng trở lại hoạt động. Xem http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

8

Điều đó chạy nhưng không có chính !!!

Tất nhiên. Nhiều thứ mà bạn có thể nghĩ đến như là một "ứng dụng" Java không có phương thức main() của riêng chúng. Ví dụ, IIRC, servlet, WAR và các loại tương tự không có phương thức main() - phương thức main(), nếu có, nằm trong vùng chứa.

Nhưng onCreate là điểm vào?

onCreate() là một phương pháp.

Điều gì sẽ xảy ra nếu có nhiều hoạt động ... có phân cấp cho trình xử lý sự kiện tích hợp này không?

Không thực sự.

BậtTạo mọi thứ khác?

Không thực sự.

Nếu không, ứng dụng sẽ biết những gì cần chạy hoặc nơi để tham gia chương trình?

Một ứng dụng không "biết những gì cần chạy hoặc nơi để vào chương trình".

Ứng dụng Android là một rổ các thành phần. Một số thành phần có thể được gắn với các biểu tượng trong trình khởi chạy màn hình chính. Một số thành phần có thể được gắn với các bộ hẹn giờ đã lên lịch, như các công việc cron hoặc các tác vụ theo lịch của Windows. Một số thành phần có thể được gắn với các sự kiện hệ thống, chẳng hạn như khi thiết bị được đặt vào hoặc tháo ra khỏi đế cắm trên xe hơi. Các thành phần đó sẽ tự động được tạo và sử dụng khi thích hợp (ví dụ: khi người dùng nhấn vào biểu tượng trong trình khởi chạy màn hình chính). Tuy nhiên, các thành phần khác chỉ được tạo và sử dụng khi mã của bạn đặc biệt yêu cầu chúng.

Suy nghĩ về một ứng dụng Android như thể đó là một chương trình Java chế độ bàn điều khiển nguyên khối sẽ khiến bạn không gặp khó khăn gì.

1

Có một loại chính, nó chỉ xảy ra được ra khỏi bàn tay của bạn. Xét cho cùng, không có gì đặc biệt về chức năng main bằng bất kỳ ngôn ngữ nào. Nó chỉ là điểm vào nơi mã của bạn bắt đầu thực thi. Hệ điều hành Android mong đợi các ứng dụng có một cấu trúc nhất định và nó gọi mã của bạn dựa trên các quy ước mà bạn tuân theo.

0

Khung Android UI đóng gói một số chi tiết phổ biến Java, bạn có thể nghiên cứu mã nguồn của khung giao diện người dùng Android

1

Applet không cũng có các phương thức main(). Nó chỉ phụ thuộc vào cách mã của bạn được đóng gói.

2

Mặc dù không có điểm vào chính cụ thể, bộ lọc chủ định mô tả hoạt động nào được khởi động khi ứng dụng được khởi chạy. Chúng được kiểm soát trong AndroidManifest.xml như đã mô tả ở đây:

http://developer.android.com/guide/topics/intents/intents-filters.html

nơi một lưu ý ứng dụng pad dụ được mô tả:

Bộ lọc này tuyên bố điểm vào chính vào Note Pad ứng dụng. Hành động MAIN chuẩn là một điểm vào mà không yêu cầu bất kỳ thông tin nào khác trong Intent (ví dụ như không có đặc tả dữ liệu), và danh mục LAUNCHER cho biết rằng điểm vào này sẽ được liệt kê trong trình chạy ứng dụng.

0

Tôi nghĩ rằng câu trả lời của Jonathon đang đi đúng hướng. Ông nói rằng hệ điều hành hy vọng một cấu trúc nhất định. Có một cái tên cho cấu trúc đó là "máy trạng thái". Trong trường hợp này, Android gọi đó là "vòng đời hoạt động". Rob đưa ra một liên kết đến tài liệu có chứa một sơ đồ quan trọng của máy trạng thái đó mặc dù văn bản hơi khô. Tìm kiếm nhanh cũng tìm thấy tôi liên kết sau giải thích rõ ràng: http://www.android-app-market.com/android-activity-lifecycle.html

-2

Trong Java, có một chính ngay cả khi nó không được liệt kê là main(). Trang bạn nhận được sau khi nhấp vào biểu tượng, bất kể tên của trang, là main().

+1

[tag: android] không phải là [tag: java] để bắt đầu, và ngay cả trong Java, những gì bạn nói không phải lúc nào cũng đúng: ví dụ Java ME [tag: midp] không có 'main' và chỉ chạy tốt – gnat

+0

JavaFX cũng không yêu cầu chính. Thôi nào, điều này là sai! – ThePerson

11

Mỗi ứng dụng sẽ có Máy ảo riêng. Để chạy một ứng dụng, trong không gian của nó (VM), phải có một phương thức chính.

Các hoạt động không phải là các lớp thực tế cần được gọi để bắt đầu áp dụng. Có một lớp được gọi là Ứng dụng, đây sẽ là lớp gốc cho một ứng dụng được khởi chạy.

Nếu không có phương pháp chính, cách VM có thể nhận ra cách khởi động ứng dụng?

Framework có các lớp được gọi là Process, VMRuntime chịu trách nhiệm khởi động một ứng dụng. Mà thực sự đối phó với phương pháp chính.

Để hiểu rõ hơn, hãy nghiên cứu dịch vụ Zygote của Android. giao dịch với Applicationmanager Service, ActivityStack Activity Threadds, v.v.

+0

Lưu ý: điều này có thể được xem là * Inversion Of Control *, nơi Android FrameWork gọi các thành phần ứng dụng của bạn. Vì vậy, bạn không cần phương thức 'main()'. – TheLostMind

5

Thực ra, loại mẫu này không phải là đặc thù của Android, nhưng sẽ xảy ra bất cứ khi nào bạn có một số khung ở giữa. Một số ví dụ cơ bản là Java Applet và Servlets. Một số câu trả lời đã cung cấp cho phản hồi chính xác, nhưng tôi sẽ cố gắng xây dựng một chút.

Khi bạn khởi chạy ứng dụng Java, bạn khởi động JVM và sau đó bạn cần tải thứ gì đó vào nó: vì vậy bạn cần một phương thức tĩnh (chính) vì không có đối tượng nào (chưa) sống trong JVM mà bạn có thể tham khảo.

Nếu bạn có một số loại khung ở giữa, đó là khuôn khổ sẽ khởi động JVM và sẽ bắt đầu điền nó với các đối tượng dịch vụ riêng của nó: viết mã của bạn, có nghĩa là viết các đối tượng của riêng bạn (đó sẽ là các lớp con của cho "mẫu"). Các đối tượng của bạn sau đó có thể được tiêm (nạp) bởi khung công tác. Các đối tượng dịch vụ khung quản lý vòng đời của các đối tượng được tiêm bằng cách gọi các phương thức vòng đời được định nghĩa trong siêu lớp "template". Vì vậy, ví dụ khi bạn cung cấp một applet cho một trình duyệt, bạn không khởi chạy một phương thức tĩnh tĩnh: bạn chỉ cần cung cấp một lớp con của java.applet.Applet thực hiện một số phương thức cá thể hoạt động như gọi lại để quản lý vòng đời (init, sơn, dừng lại ...). Nó là trình duyệt sẽ khởi chạy JVM, khởi tạo những gì cần thiết cho việc khởi chạy một applet, tải applet của bạn và gọi nó.

Tương tự, với các servlet bạn phân lớp lớp javax.servlet.http.HttpServlet và thực hiện một số phương thức dụ (không tĩnh) (doGet, doPost ...). Vùng chứa Web (ví dụ: Tomcat) sẽ chịu trách nhiệm khởi chạy JVM, khởi tạo những gì cần thiết để khởi chạy một servlet, nạp servlet của bạn và gọi nó.

Mẫu trong Android khá giống nhau: bạn làm gì để tạo một lớp con của android.app.Activity. Khi bạn khởi chạy một ứng dụng, hệ thống sẽ tìm trong tệp kê khai để tìm ra hoạt động nào sẽ được bắt đầu, sau đó "khung công tác" tải nó và gọi các phương thức cá thể của nó (onCreate, onPause, onResume ...).

3

Trong các chương trình Java, chúng ta cần một phương thức main(), vì khi thực thi mã byte, JVM sẽ tìm kiếm phương thức main() trong lớp và bắt đầu thực hiện ở đó.

Trong Android, Máy ảo Dalvik được thiết kế để tìm lớp là lớp con của Hoạt động và được thiết lập để bắt đầu thực hiện ứng dụng từ phương thức onCreate() của nó, vì vậy không cần có chính () phương pháp.

Thứ tự mà Dalvik Virtual Machine gọi phương pháp này dựa trên thứ tự ưu tiên được gọi là vòng đời android để biết thêm thông tin về vòng đời android kiểm tra các liên kết dưới đây Life Cycle Android: https://developer.android.com/guide/components/activities/activity-lifecycle.html

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