5

Tôi đã phát triển một ứng dụng nhận được một Broadcast và sau đó khởi chạy một Activity, trong đó Activity truy vấn ContentProvider để lấy thông tin ra khỏi DNS trong thời gian thực.Dataflow giữa Android BroadcastReceiver, ContentProvider và Hoạt động?

Tôi muốn để có thể xáo trộn này để thay vì đi:

BroadcastReceiver.onReceive() { 
    Intent intent = new Intent(...); 
    intent.setData(...); // set a single String data 
    context.startActivity(intent); 
} 

Activity.onCreate() { 
    String value = intent.getData(); // get the String data 
    Cursor = ContentProvider.query(search); 
    ... 
    setContentView(...); 
} 

nó đi:

BroadcastReceiver.onReceive() { 
    Cursor = ContentProvider.query(...); 
    if (cursor != null) { 
    Intent intent = new Intent(...); 
    // how do I pass the cursor? 
    getContext().startActivity(intent); 
    } 
} 

Activity.onCreate() { 
    // how do I retrieve the cursor? 
    setContentView(...); 
} 

tức là nếu query() lợi nhuận không có dữ liệu tôi muốn bỏ lỡ phóng Activity và cho phép tin nhắn phát đi như bình thường.

Nếu query() không trả lại dữ liệu, tôi muốn điều đó Cursor để được cung cấp cho các Activity, vì vậy mà tôi không cần phải đi và truy vấn cho các dữ liệu một lần nữa.

Đổi lại, Activity có giao diện người dùng riêng mà người dùng cần phản hồi.

Điều này có khả thi không?

Trả lời

5

Điều bạn muốn có phần khó khăn và đối với tôi, thay vì không hiệu quả. Tôi sẽ đề xuất rằng bạn sử dụng thay thế đầu tiên, nhưng khi bạn tải Con trỏ trong hoạt động, hãy kiểm tra xem không có dữ liệu nào và sau đó thoát khỏi hoạt động.

BroadcastReceiver.onReceive() { 
    Intent intent = new Intent(...); 
    intent.setData(...); // set a single String data 
    context.startActivity(intent); 
} 

Activity.onCreate() { 
    String value = intent.getData(); // get the String data 
    Cursor = ContentProvider.query(search); 

    if(cursor.isEmpty() ...){ 
    finish(); 
    return; 
    } 
    ... 
    setContentView(...); 
} 

Điều này sẽ có cùng tác dụng chính xác, con trỏ sẽ chỉ được tải một lần và hoạt động sẽ chỉ được hiển thị nếu có gì đó trong con trỏ. Chỉ có thêm chi phí là mục đích được kích hoạt không có vấn đề gì, nhưng đó không phải là chính xác thuế :)

Lưu ý rằng sẽ không có bất kỳ nhấp nháy hoặc bất cứ điều gì, Android xử lý trường hợp gọi kết thúc trong onCreate() (Tôi tin rằng onStart và onResume là tốt) để người dùng không bao giờ biết điều đó xảy ra.

+0

ok, âm thanh tốt - nhưng - khi nào lệnh gọi context.startActivity() trở lại? – Alnitak

+0

và làm cách nào để cho BroadcastReceiver biết liệu Hoạt động có hữu ích không? AFAIK Tôi không thể sử dụng startActivityForResult() trong BroadcastReceiver. – Alnitak

+0

Cuộc gọi đến context.startActivity trả về ngay lập tức, về cơ bản, tất cả những gì nó làm là lên lịch cho hoạt động được bắt đầu sau này ngay sau khi chuỗi sự kiện chính miễn phí. – sooniln

0

Bạn sẽ cần phải tìm hoặc tạo một Con trỏ có thể nối tiếp hoặc Ghim (và sau đó sử dụng intent.setExtra()). Hoặc có thể thay vào đó có thể đọc tất cả dữ liệu dưới dạng một bưu kiện và chuyển nó vào Hoạt động?

+0

đó cũng là loại suy nghĩ của tôi - có lẽ là Khổ, vì Hoạt động thực sự là một ListActivity nên tôi cần truyền dữ liệu qua một ListAdapter. – Alnitak