2011-01-31 47 views
43

Có cách nào để tự động thay đổi hoạt động bắt đầu trong Android dựa trên điều kiện không? Những gì tôi đã cố gắng để làm gì (mà không làm việc) là như sau:Hoạt động khởi động động trong Android?

  1. xóa danh mục Launcher theo quy định tại AndroidManifest.xml của tôi
  2. tạo ra một lớp ứng dụng tùy chỉnh mà ứng dụng sử dụng
  3. ghi đè các phương thức onCreate của lớp Ứng dụng của tôi để xác định một số mã như sau:

.

if (condition) { 
    startActivity(new Intent(this, MenuActivity.class)); 
} else { 
    startActivity(new Intent(this, LoginActivity.class)); 
} 
+3

chính xác những gì tôi đã tìm kiếm, cảm ơn bạn đã yêu cầu điều này. – mad

Trả lời

56

Tại sao không có một ban đầu Activity không có giao diện người dùng để kiểm tra điều kiện trong onCreate của nó, sau đó khởi động tiếp theo Activity, sau đó gọi finish() về bản thân? Tôi đã không bao giờ được gọi là finish() từ trong vòng onCreate() mặc dù, vì vậy tôi không chắc chắn nếu điều này sẽ làm việc.

EDIT
Dường như hoạt động tốt. Dưới đây là một số mã để làm cho nó rõ ràng hơn.
Initial Activity:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Intent intent; 
    if (condition) { 
     intent = new Intent(this, ClassA.class); 
    } else { 
     intent = new Intent(this, ClassB.class); 
    } 
    startActivity(intent); 
    finish(); 
    // note we never called setContentView() 
} 

khác Activity:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 
+0

Bạn có thể có Hoạt động không có giao diện người dùng không? Tôi nghĩ toàn bộ quan điểm của một hoạt động là để hiển thị một cái gì đó cho người dùng, nhưng có lẽ tôi cần phải làm một số đọc lại trên cơ bản Android ... –

+1

@Matt Huggins Tôi chỉ thử nó trong không gian làm việc của tôi và nó có vẻ hoạt động tốt. –

+1

Đó là toàn bộ quan điểm của một hoạt động, nhưng có rất nhiều cách để giải quyết vấn đề này. Tôi nghĩ những gì dave có nghĩa là chỉ cần không khai báo một giao diện người dùng. Không có gì yêu cầu bạn gọi setContentView hoặc bất cứ thứ gì. Chỉ cần làm kiểm tra của bạn, bắt đầu hoạt động tiếp theo của bạn, và được với nó. – Falmarri

8

Đây là những gì cá nhân tôi đã làm cho một trong những dự án điện thoại di động nhỏ của tôi. Thay vì tạo ra một riêng biệt, màn hình ít Activity nơi tình trạng này là gì và đó ra mắt màn hình tương ứng, tôi đặt điều kiện trong một Activity và đã làm một động setContentView(), như trong:

if (!userIsLoggedIn) { 
    setContentView(R.layout.signup); 
} else { 
    setContentView(R.layout.homescreen); 
} 

Hai lưu ý quan trọng đối với cách tiếp cận này :

1: Thay vì viết rằng trong onCreate(), bạn muốn đặt quyết định bên trong onResume() chính xác vì sau này luôn được gọi bất cứ khi nào màn hình cần được hiển thị ở phía trước. Bạn có thể thấy điều đó từ Android activity life cycle. Vì vậy, nếu, ví dụ: người dùng vừa tải xuống ứng dụng của tôi và khởi chạy ứng dụng lần đầu tiên vì không có người dùng nào đăng nhập, cô ấy sẽ được dẫn đến trang đăng ký. Khi cô ấy hoàn tất việc đăng ký và vì lý do nào đó, hãy nhấn nút HOME (không phải BACK, thoát khỏi ứng dụng hoàn toàn!) Và sau đó tiếp tục ứng dụng, bố cục mà cô ấy sẽ thấy đã là màn hình chính. Nếu tôi đặt điều kiện bên trong onCreate(), những gì sẽ được hiển thị là màn hình đăng ký bởi vì theo chu kỳ cuộc sống, nó không quay trở lại onCreate() khi đưa trở lại một ứng dụng lên phía trước.

2: Giải pháp này chỉ là lý tưởng nếu hợp nhất các chức năng của hai Hoạt động này sẽ không tạo ra một khối mã ma quỷ dài. Như tôi đã nói, dự án của tôi là một dự án nhỏ (tính năng chính của nó xuất hiện ở chế độ nền), do đó, động đơn lẻ Activity không có quá nhiều thứ trong đó. Màn hình ít hơn Activity chắc chắn là con đường để đi nếu bạn cần mã của bạn để được nhiều người đọc.

+3

+1 để chia sẻ một phương pháp thay thế. :) Như bạn đã đề cập, mối quan tâm duy nhất của tôi với phương thức này là mỗi khung nhìn có thể yêu cầu một bộ mã cơ bản khác, điều này sẽ làm cho Hoạt động cồng kềnh và không đồng nhất. –

+1

@MattHuggins giải pháp này có thể hoạt động tốt nhất nếu bạn sử dụng 'Fragment' đóng gói 'contentView' và" tập hợp phần lớn mã cơ bản khác ". – TWiStErRob

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