2010-01-14 37 views
9

Tôi có một ứng dụng đặt báo thức bằng AlarmManager, khởi động một Hoạt động khác khi nó tắt. AlarmManager lấy một PendingIntent và sinh ra một lớp BroadcastReceiver khi thời gian được chỉ định xuất hiện. Tôi tự hỏi liệu có bất kỳ cách nào mà tôi có thể vượt qua đối số cho BroadcastReceiver này thông qua các đối tượng Intent mà đi vào PendingIntent?Truyền đối số cho BroadcastReceiver thông qua Intent trong Android

Về cơ bản những gì tôi muốn làm là một cái gì đó như thế này:

Intent my_intent = new Intent(this, BroadcastService.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, my_intent, 0); 
my_intent.putExtra("arg1", arg1); 
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (1000), pendingIntent); 

và tôi muốn để có thể lấy arg1 trong (Context, Ý định) phương pháp onReceive của BroadcastReceiver. Tôi đã thấy rằng biến cục bộ my_intent sẽ là tham số thứ hai được truyền vào onReceive bởi PendingIntent, nhưng dường như điều đó không đúng. Có thể truyền các tham số giữa một Activity và BroadcastReceiver trong thời trang này (sử dụng Intent.putExtra()) hay tôi nên sử dụng một ContentProvider thay thế?

Cảm ơn!

Iva

Trả lời

1

Tôi có một ứng dụng đặt báo động bằng AlarmManager, bắt đầu hoạt động hoạt động khác khi nó tắt.

Đó là hình thức xấu. Không bật lên các hoạt động không báo trước như thế này mà không cần rất lý do chính đáng (ví dụ: cuộc gọi điện thoại đến). Điều gì sẽ xảy ra nếu người dùng đang làm việc gì đó, như TXTing hoặc chơi trò chơi hoặc cố gắng nhấn số cho menu điện thoại?

Có thể vượt qua các thông số giữa một hoạt động và một BroadcastReceiver theo cách này (sử dụng Intent.putExtra())

Yes. Tuy nhiên, lưu ý rằng bạn sẽ muốn sử dụng PendingIntent.FLAG_UPDATE_CURRENT khi tạo PendingIntent, để đảm bảo rằng mọi tính năng bổ sung mới mà bạn cung cấp trên Intent thực sự được sử dụng.

+0

À vâng, tôi bỏ lỡ; Tôi đang sử dụng Báo thức làm đại lộ để gọi một hoạt động cụ thể tại một thời điểm cụ thể và khi báo thức tắt, tôi tạo thông báo mà người dùng có thể thả xuống bất cứ khi nào thuận tiện và chỉ sau đó gọi hoạt động, để tôi không 't làm phiền bất cứ điều gì họ xảy ra để được làm. Cảm ơn câu trả lời của bạn! – ivcheto

+0

Hmm, thêm PendingIntent.FLAG_UPDATE_CURRENT làm cờ khi nhận được PendingIntent dường như không thay đổi bất cứ điều gì; Tôi vẫn không nhận được các tính năng bổ sung từ mục đích trong Hoạt động ban đầu của tôi với mục đích được chuyển đến onReceive – ivcheto

+1

Bạn có đang gọi putExtra() trước khi tạo PendingIntent không? Tôi không biết khi nào PendingIntent tuần tự hóa Intent, nhưng nếu nó thực hiện nó ngay lập tức, các cuộc gọi putExtra() sau khi tạo PendingIntent sẽ không có hiệu lực. – CommonsWare

1

Vâng, tôi nghĩ rằng nó có thể vượt qua bất kỳ dữ liệu của loại Java cơ bản và/loại Parceable Serializable trong extras của Intent quấn quanh một PendingIntent và sau đó lấy chúng bằng cách sử dụng Ví dụ Ý định truyền cho onReceive của Broadcastreceiver. Cách tiếp cận của bạn có vẻ ổn với tôi.

Sự cố/lỗi mà bạn đang gặp phải là gì? Là "arg1" dụ Serializable?

+0

Tôi không gặp lỗi; Tôi chỉ đơn giản là không nhận được một gói với ý định được truyền cho phương thức onReceive (Context, Intent) của BroadcastReceiver; Tôi giả định rằng ý định được truyền cho BroadcastReceiver của tôi là cùng một ý định tôi tạo ra (và cư trú) trong Hoạt động của tôi. Trong trường hợp này, bất kỳ đối số nào tôi muốn truyền thực sự là Serializable. – ivcheto

+0

Bạn có thể cho chúng tôi thấy mã của bạn có/không putExtra (..) và getXXXExtra (..) không? – Samuh

+1

Hóa ra tôi chỉ cần đặt putExtra (...) gọi trước khi tạo PendingIntent. Cảm ơn bạn đã giúp đỡ! – ivcheto

9

Tôi đã gặp phải sự cố tương tự, nhưng trước tiên tôi đã điền Intent trước khi gói nó trong PendingIntent. Nhưng câu trả lời cho vấn đề của tôi là, như đã chỉ ra ở trên, rằng tôi cần sử dụng cờ PendingIntent.FLAG_UPDATE_CURRENT. Khi tôi đặt cờ, nó đã hoạt động! Tôi hy vọng điều này sẽ giúp những người khác. -Jeff

+0

Tôi đã gặp vấn đề tương tự và lá cờ hoàn toàn đã làm nó. Cảm ơn! – DanO

+0

Bạn là người tiết kiệm cuộc sống! –

5
int code=1; 
Intent i2 = new Intent(StartAlarm); 
i2.putExtra("_id",code); 

class test extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent arg1) { 
     int i=arg1.getIntExtra("_id",-1); 
    } 
} 
Các vấn đề liên quan