2012-07-21 25 views
13

Android newbee tại đây, tôi có một số mã mà tôi muốn chạy khi ứng dụng Android của tôi khởi động lần đầu tiên. Nó kiểm tra phiên bản của cơ sở dữ liệu cục bộ và tải xuống phiên bản mới nếu phiên bản hiện tại đã lỗi thời. Tôi đã gắn bó với nó trong sự khởi đầu của hoạt động đầu tiên của tôi, khá chắc chắn phải có một nơi tốt hơn để đặt này. Bất kỳ khuyến nghị nào của một nơi nào đó tôi có thể đặt nó ở đâu nó sẽ được gọi một lần khi khởi động?Nơi để chèn mã để khởi động ứng dụng?

+0

Tại sao bạn nói phải có nơi tốt hơn để đặt mã khởi động? OnCreate() nên làm chính xác những gì bạn muốn .. – Snailer

+0

Thực hiện một hoạt động màn hình tải và thêm mã kiểm tra phiên bản của bạn trong đó. –

+1

Snailer Nếu tôi để lại mã trong hoạt động và sau đó tôi cần tạm ngưng hoặc tạo lại hoạt động thì mã đó được gọi đi lặp lại. – tobylang

Trả lời

23

Bạn có thể viết một lớp Ứng dụng tùy chỉnh (mở rộng từ android.app.Application).Override onCreate để xác định những gì sẽ xảy ra khi ứng dụng được bắt đầu:

public class MyApplication extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 

     // Do something here. 
    } 
} 

Sau đó bạn sẽ cần phải đăng ký lớp tùy chỉnh của bạn trong file manifest:

<application ... android:name="fully.qualified.MyApplication"> 

Edit:

Trong phản ứng với David Cesarino, tôi không đồng ý với mục đích của lớp học Application. Nếu bạn dựa vào số onCreate của Activity, thì điều gì sẽ ngăn không cho nó trở thành cùng một loại mục đích linh tinh khổng lồ ... nếu bạn cần điều gì đó xảy ra khi ứng dụng bắt đầu, bạn phải viết mã đó ở đâu đó; và Activity có lẽ sẽ trở nên lộn xộn hơn bởi vì bạn cũng phải thực hiện Activity logic cụ thể trong đó. Nếu bạn lo lắng về sự lộn xộn, sau đó tách logic thành các lớp khác và gọi chúng từ Application. Sử dụng SharedPreferences để xác định liệu logic có nên thực thi có vẻ giống như một vấn đề xung quanh một vấn đề đã được giải quyết hay không.

Dianne Hackborn dường như đề cập đến dữ liệu, chứ không phải logic, trong đó tôi hoàn toàn đồng ý. Các biến tĩnh là tốt hơn nhiều so với biến cấp ứng dụng ... tốt hơn phạm vi và loại an toàn làm cho khả năng bảo trì/dễ đọc dễ dàng hơn nhiều.

+0

Rõ ràng, 'SharedPreferences' là một ví dụ cho câu hỏi không liên quan trong các bình luận (nó không phải là một phần của câu trả lời). Tôi không nói rằng bạn cần phải tồn tại phiên bản cơ sở dữ liệu (hoặc bất cứ điều gì) để 'SharedPreferences', vì nó đã" tồn tại "trong chính cơ sở dữ liệu (để sử dụng trong' onUpgrade', * ví dụ *). Về việc sử dụng lớp Ứng dụng để thực hiện kiểm tra cơ sở dữ liệu sớm, hãy đồng ý không đồng ý. Cảm ơn vi đa trả lơi. – davidcesarino

+0

Đã hiểu, tôi không có ý định tập trung vào khía cạnh 'SharedPreferences' của nó, mà đúng hơn là yêu cầu nói: ' if (someCondition) { // Thực hiện điều gì đó. } ' Với tôi, đó là những gì' Ứng dụng' được tạo ra cho ... Tôi đoán nó chỉ là hai cách nhìn vào nó, và như bạn đã nói ... đồng ý không đồng ý. –

+0

Đừng lo, không sao cả! :-) – davidcesarino

3

Trước tiên, hãy xem Activity lifecycle.

Trả lời câu hỏi của bạn, bạn có thể đặt mã vào bất kỳ phương pháp "khởi động" nào, tùy thuộc vào việc bạn muốn làm và chủ yếu là quan trọng, khi bạn muốn kích hoạt. Đối với những gì bạn đã yêu cầu, onCreate là địa điểm hợp lý.

Tôi đã gắn bó nó trong quá trình khởi tạo hoạt động đầu tiên của mình, khá chắc chắn phải có một nơi tốt hơn để đặt điều này.

Và tại sao vậy? Bất kỳ mã nào có một mục nhập , phải không? Trong các hoạt động Android, nó chỉ xảy ra là onCreate (một lần nữa, xem liên kết ở trên để biết chi tiết đầy đủ). Bên cạnh xử lý sự kiện, đó là câu trả lời cho các sự kiện xảy ra ngoài chuỗi cuộc gọi chính, bạn đặt nội dung trong số onCreate.

Nếu bạn lo lắng về phương pháp trở nên lớn, thì đó là một vấn đề khác. Tóm tắt mã của bạn tốt hơn, tôi nói. Để kiểm tra nội dung sơ bộ, mọi người thường cung cấp hoạt động "Đang tải", trước khi bắt đầu hoạt động chính của ứng dụng.

chỉnh sửa:

Đây là một theo dõi những gì drumboog đề xuất, kể từ khi nhận xét của tôi bắt đầu phát triển về độ phức tạp là "chỉ một lời nhận xét".

Cá nhân, tôi muốn tránh việc mở rộng lớp Application vì lý do duy nhất thực thi mã sớm, do đó, mã không phải là hợp lý ở mức độ ưu tiên (cơ sở dữ liệu phiên bản). Lớp Application chủ yếu được sử dụng như một cách dễ dàng để trạng thái tạm dừng giữa các số Activity ', không phải là cách để "làm mọi thứ". Tóm lại, tôi cảm thấy lớp học Application thường bị lạm dụng.

Đối với những gì bạn muốn, bạn hoàn toàn có thể đạt được mã gọi đó trong ActivityonCreate. Điều đó làm giảm độ phức tạp, bởi vì tôi đã nhìn thấy mọi người nhồi nhét Application cho đến khi nó trở thành một lớp lớn các mục đích mã linh tinh. Và đó là một không-không để bảo trì, với các vấn đề logic của riêng nó. Ngoài ra, nếu bạn thực sự muốn một giải pháp khác, hoàn toàn bị ngắt kết nối với giao diện người dùng, bạn nên suy nghĩ về việc triển khai một Service thay vào đó (nhưng tôi không nghĩ rằng nó chỉ cần thiết cho điều đó).

Cả hai those concerns were previously addressed by Dianne Hackborn (hoặc thông tin tôi nhận được từ thư của cô ấy).

+0

Và thậm chí như vậy, luôn có những cách tốt hơn để duy trì trạng thái (thống kê, vv). Tôi đã đếm trong các ngón tay của một bàn tay bao nhiêu lần tôi mở rộng lớp 'Application'. – davidcesarino

+0

Cảm ơn bạn sẽ thử :) – tobylang

+0

Bạn được chào đón. Vui lòng hỏi bất kỳ chi tiết nào khác. – davidcesarino

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