2011-11-27 33 views
8

Trong ứng dụng của tôi, tôi đặt dịch vụ của tôi ở mặt trước để ngăn ngừa nó khỏi bị giết bằng cách sử dụng:Việc cập nhật Thông báo có xóa trạng thái tiền cảnh của Dịch vụ không?

startForeground(NOTIFY_ID, notification); 

này cũng hiển thị thông báo cho người sử dụng (đó là rất tốt). Vấn đề là sau này tôi cần cập nhật thông báo. Vì vậy, tôi sử dụng mã:

notification.setLatestEventInfo(getApplicationContext(), someString, someOtherString, contentIntent); 
mNotificationManager.notify(NOTIFY_ID, notification); 

Câu hỏi sau là: sẽ thực hiện thao tác này từ trạng thái tiền cảnh đặc biệt?

Trong this answer, CommonsWare cho biết rằng hành vi này là có thể, nhưng anh ấy không chắc chắn. Vì vậy, không ai biết câu trả lời thực tế?


Lưu ý: Tôi biết rằng một cách đơn giản để thoát khỏi câu hỏi này là để liên tục gọi startForeground() mỗi khi tôi muốn cập nhật các thông báo. Tôi đang tìm hiểu xem liệu giải pháp thay thế này cũng sẽ hoạt động hay không.

+1

BTW, mặc dù bạn có thể cập nhật nội dung của một thông báo hiện tại, bạn có thể không làm cho văn bản ticker xuất hiện trong thanh trạng thái nhiều hơn một lần trong một thông báo được đưa ra, ngay cả khi bạn thay đổi nó - ít nhất là không sử dụng Notification.FLAG_ONGOING_EVENT. Để hiển thị văn bản mã mới cho thông báo hiện có, bạn cần hủy thông báo và sau đó khởi động lại. –

Trả lời

9

Ứng dụng RandomMusicPlayer tại trang web dành cho nhà phát triển Android sử dụng NotificationManager để cập nhật thông báo của dịch vụ nền trước, vì vậy rất có thể là khá tốt để giữ trạng thái tiền cảnh.

(Xem setUpAsForeground()updateNotification() trong lớp MusicService.java.)

Từ những gì tôi hiểu, nếu bạn hủy bỏ việc thông báo dịch vụ này sẽ chấm dứt là một dịch vụ foreground, vì vậy giữ cho rằng trong tâm trí; nếu bạn hủy thông báo, bạn sẽ cần gọi lại startForeground() một lần nữa để khôi phục trạng thái tiền cảnh của dịch vụ.

8

Để làm rõ những gì đã được nói ở đây:

Từ những gì tôi hiểu, nếu bạn hủy bỏ việc thông báo các dịch vụ sẽ chấm dứt là một dịch vụ foreground, vì vậy giữ cho rằng trong tâm trí; nếu bạn hủy thông báo, bạn sẽ cần gọi lại startForeground() một lần nữa để khôi phục trạng thái tiền cảnh của dịch vụ.

này là một phần của câu trả lời gợi ý đó là có thể xóa một liên tục Notification thiết lập bởi một Service bằng cách sử dụng NotificationManager.cancel() trên dai dẳng Notification. Điều này không đúng. Không thể xóa thông báo đang diễn ra theo số startForeground() bằng cách sử dụng NotificationManager.cancel().

Cách duy nhất để loại bỏ nó, là gọi stopForeground(true), do đó, thông báo đang diễn ra bị xóa, trong đó ofcourse cũng làm cho các Service dừng lại ở phía trước. Vì vậy, nó thực sự là cách khác xung quanh; Service không dừng ở mặt trước vì Notification bị hủy, Notification chỉ có thể bị hủy bằng cách dừng Service ở mặt trước.

Một cách tự nhiên, bạn có thể gọi startForeground() sau này ngay lập tức, để khôi phục trạng thái bằng Notification mới. Một lý do bạn sẽ muốn làm điều này nếu một văn bản ticker phải được hiển thị một lần nữa, bởi vì nó sẽ chỉ chạy lần đầu tiên Notification được hiển thị.

Hành vi này không được ghi lại và tôi đã lãng phí 4 giờ để tìm hiểu lý do tại sao tôi không thể xóa Notification. Thông tin thêm về sự cố tại đây: NotificationManager.cancel() doesn't work for me

2

Khi bạn muốn cập nhật Thông báo được đặt bởi startForeground(), chỉ cần tạo một chú thích mới và sau đó sử dụng NotificationManager để thông báo.

Điểm mấu chốt là sử dụng cùng một id thông báo.

Việc cập nhật Thông báo sẽ KHÔNG xóa Dịch vụ khỏi trạng thái tiền cảnh (điều này có thể được thực hiện chỉ bằng cách gọi stopForground);

Ví dụ:

private static final int notif_id=1; 

@Override 
public void onCreate(){ 
    this.startForeground(); 
} 

private void startForeground() { 
     startForeground(notif_id, getMyActivityNotification("")); 
} 

private Notification getMyActivityNotification(String text){ 
     // The PendingIntent to launch our activity if the user selects 
     // this notification 
     CharSequence title = getText(R.string.title_activity); 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 
       0, new Intent(this, MyActivity.class), 0); 

     return new Notification.Builder(this) 
       .setContentTitle(title) 
       .setContentText(text) 
       .setSmallIcon(R.drawable.ic_launcher_b3) 
       .setContentIntent(contentIntent).getNotification();  
} 
/** 
this is the method that can be called to update the Notification 
*/ 
private void updateNotification() { 

       String text = "Some text that will update the notification"; 

       Notification notification = getMyActivityNotification(text); 

       NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
       mNotificationManager.notify(notif_id, notification); 
} 
Các vấn đề liên quan