2011-07-21 34 views
10

Tôi đã viết một vài ứng dụng Android, và đã luôn luôn tuyên bố bắt đầu Activity như:Ứng dụng Android vs Hoạt động

<intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 

Nó sẽ là tuyệt vời cho Phạm vi một số phương pháp, tĩnh học, prefs chia sẻ toàn cầu, vv nếu tôi có thể khởi chạy ứng dụng của tôi bằng cách sử dụng Application mà sau đó gọi Activity đầu tiên từ số onCreate() sau khi thiết lập prefs, v.v ... nhưng tôi không thể tìm thấy bất kỳ ví dụ nào về mẫu thiết kế này ... khi tôi thử mã này, tôi nhận được a ClassCastException:

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

     // do stuff (prefs, etc) 

     // start the initial Activity 
     Intent i = new Intent(this, InitialActivity.class); 
    startActivity(i); 
    } 
} 

InitialActivity.class thực sự là một Activity hoạt động tốt nếu tôi đặt thành MAIN nhưng cố gắng khởi động từ MyApplication được khai báo là MAIN sẽ phát sinh lỗi. Có lẽ là một câu hỏi rất ngớ ngẩn, nhưng tôi có giải quyết tất cả điều này không?

Cảm ơn,

Paul

+3

Bạn có nghĩa là bạn đang định nghĩa MyApplication là một hoạt động? Điều đó thực sự sẽ gây ra một ClassCastException. Vui lòng Android đã làm cho bạn những gì bạn muốn làm, nếu tôi hiểu chính xác những gì bạn muốn làm. Bạn chỉ cần đặt tên ứng dụng của bạn cho đường dẫn đó và tên của MyApplication. Nó sẽ được tạo trước khi Hoạt động của bạn, và sẽ có sẵn cho tất cả chúng. Như thế này:

+0

Thú vị - làm cách nào để tôi truy cập các phương thức tùy chỉnh của ứng dụng từ một trong các Hoạt động? –

+1

Từ bên trong Activity của bạn, bạn có thể xử lý ứng dụng như sau: getApplicationContext(), kết quả của nó, nếu nó được cấu hình như trên trong tệp kê khai của bạn, sẽ truyền tới MyApplication. –

Trả lời

19

Bạn có thể khắc phục điều này bằng cách sử dụng FLAG_ACTIVITY_NEW_TASK cờ:

Intent intent = new Intent(this, ApplicationActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 

Đó là bởi vì bạn cần phải bắt đầu nhiệm vụ mới khi Hoạt động được bắt đầu bên ngoài bối cảnh hoạt động. Nhưng tôi khuyên bạn không nên bắt đầu Hoạt động từ ứng dụng của bạn onCreate().


Android có 4 thành phần: Hoạt động, Dịch vụ, ContentProvider và Broadcast.

Khi Android cần kích hoạt một trong các thành phần này từ ứng dụng của bạn, có vẻ như đã có quá trình chạy hiện tại với ứng dụng của bạn. Nếu không, sau đó Android bắt đầu quá trình mới, khởi tạo nó, sau đó nó khởi tạo thể hiện ứng dụng tùy chỉnh của bạn. Và sau đó nó kích hoạt một trong những thành phần cần thiết.

Bây giờ, hãy xem xét kịch bản tiếp theo: ứng dụng của bạn đã khai báo nhà cung cấp nội dung theo số AndroidManifest.xml và Android sắp bắt đầu ứng dụng của bạn để bạn có thể cung cấp một số dữ liệu cho ứng dụng nền trước khác.

  1. Nội dung yêu cầu cung cấp được gửi
  2. ứng dụng của bạn đã không hoạt động, và Android bắt đầu tiến trình mới cho nó.
  3. Ví dụ ứng dụng tùy chỉnh của bạn được tạo ra
  4. Application.onCreate() được gọi.
  5. Bạn bắt đầu một hoạt động
  6. Provider nội dung của bạn nhận được yêu cầu

Có người chỉ muốn kết nối với nhà cung cấp nội dung của bạn, nhưng ứng dụng của bạn bắt đầu một Hoạt động để thay thế. Cùng một sự thật cho bắt đầu dịch vụ nền và đôi khi phát sóng nhận.

Và cũng cân nhắc xem một số hoạt động của ứng dụng khác có muốn bắt đầu hoạt động X từ ứng dụng của bạn hay không. Nhưng trong onCreate() bạn bắt đầu hoạt động Y, và sau đó X cũng được bắt đầu bởi Android. Sau đó, người dùng nhấn lại. Chuyện gì sẽ xảy ra? Của nó khó khăn ...

Bắt đầu hoạt động từ Application 's onCreate có thể dẫn đến trải nghiệm người dùng khá lạ. Vì vậy, không làm điều đó.


UPDATE: Bởi vì Android đảm bảo rằng ứng dụng sẽ được tạo ra một lần duy nhất và trước khi bất kỳ thành phần khác, bạn có thể sử dụng mã tiếp theo để truy cập trường hợp duy nhất của ứng dụng của bạn:

public class MyApplication extends Application 
{ 
    private static MyApplication s_instance; 

    public MyApplication() 
    { 
     s_instance = this; 
    } 

    public static MyApplication getApplication() 
    { 
     return s_instance; 
    } 
} 
+0

Tuyệt vời, cảm ơn bạn. Vì vậy, trong việc khai báo các phương thức tùy chỉnh trong MyApplication mà tôi có thể phơi bày với phần còn lại của 'Activity', điều này có khả thi không? Làm thế nào tôi có thể truy cập chúng ('getApplication()' dường như không làm được điều này) –

+0

Tôi đã cập nhật câu trả lời. – inazaruk

+0

Vì vậy, mọi phương thức mà tôi có trong MyApplication mà tôi muốn truy cập sẽ được truy cập thông qua MyApplication.getApplication(). MyMethod()? –

0

Bạn có đặt nó trong bạn gắn thẻ hoạt động biểu hiện cho mục đích này bạn đang bắt đầu (một khác ngoài chính bạn)?

</activity> 
      <activity android:name=".InitialActivity"       
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="com.package.INITACT" /> <--- this is only name by which you activity can be called. 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
Các vấn đề liên quan