2013-08-15 24 views
41

Tôi đang thêm thanh Thông báo vào Hệ thống bằng cách sử dụng thư viện NotificationCompat. Thông báo này có hai nút tác vụ. Ngoài ra, AutoCancel() thuộc tính trên Thông báo được đặt thành true.Nhấp vào Tác vụ thông báo của Android không đóng Ngăn thông báo

Khi nhấp vào nút tác vụ, Hệ thống được định cấu hình để khởi chạy IntentService gọi NotificationManager.cancel(NOTIFICATION_ID) và sau đó khởi chạy Hoạt động trong Tác vụ mới.
Vấn đề là mặc dù cuộc gọi này xóa thông báo khỏi khay, nó sẽ không thu gọn ngăn kéo. Hoạt động được gọi được vẽ phía sau ngăn kéo.

Ai đó có thể làm sáng tỏ một số mã đặc biệt cần phải đóng rút ra khỏi việc hủy thông báo?

Cảm ơn bạn.

+1

Bạn đã bao giờ tìm thấy giải pháp cho điều này chưa? –

+6

Không. Chỉ cần một số hacks để sử dụng phản ánh và mở rộng, thu gọn thanh trạng thái. Rõ ràng, nếu Mục đích đang chờ của bạn chứa Intent phân giải hoạt động, ngăn kéo sẽ tự động bị thu gọn. Tuy nhiên, nếu Mục đích đang chờ xử lý của bạn kết thúc một BroadcastReceiver hoặc Dịch vụ, khay Thông báo sẽ giữ trạng thái (mở rộng) của nó. – Aster

Trả lời

0

Hệ thống Android thu gọn ngăn thông báo cho bạn bất cứ khi nào bạn nhấp vào thông báo và khởi chạy hoạt động hoặc chương trình phát sóng. Tôi không nghĩ rằng có bất kỳ cách nào có lập trình để đóng ngăn thông báo bằng mã của bạn. Tôi khuyên bạn nên kiểm tra các ý định mà bạn chuyển đến trình tạo thông báo và đảm bảo rằng chúng được đưa ra các tham chiếu chính xác. Tôi nghĩ rằng một cái gì đó bên trong trình quản lý thông báo android đang bị chặn do ý định bạn cung cấp. Cho đến nay tôi chưa thấy ngăn thông báo ở trạng thái mở khi hành động được kích hoạt từ thông báo. Chỉ cần tò mò để biết liệu hoạt động mục tiêu của bạn có một khu vực bán trong suốt nơi hoạt động trước đó có thể nhìn thấy không, nếu có thì tôi đề nghị bạn làm nền hoàn toàn mờ đục (không có vùng trong suốt/bán trong suốt). Có thể đó là ngăn chặn các nhà launcher Android để hoàn thành trình tự dừng và do đó không cho phép phóng để đóng ngăn thông báo cho bạn. Hy vọng tôi đã có thể giúp bạn. Tất cả là tốt nhất.

1

Trong khi tôi hoàn toàn hiểu rằng câu trả lời của Soumyajyoti nên đúng ... nó là trong thực tế không ...

tôi đang sử dụng

Intent CR = new Intent(CRCODE); 
PendingIntent.getBroadcast(getApplicationContext(), MY_ID, CR, 0); 

trong một bố cục remoteview cho một thông báo liên tục ...

tôi có thể đảm bảo với bạn rằng nó không đóng ngăn kéo nhưng không gây ra ý định và vẽ hoạt động phía sau ngăn kéo đã mở, cũng như thực hiện các tác vụ khác mà tôi đã gán cho người nhận của mình ...

tôi đã thử nghiệm cả getActivity, và getService (không phải trong số đó sẽ làm việc trong hoàn cảnh của tôi, tôi cần phải ... Điện thoại

Tôi biết rằng đây không phải là một câu trả lời, nhưng khi nào và nếu tôi tìm thấy nó, tôi sẽ báo cáo lại để chỉnh sửa ...

suy nghĩ điên rồ ... có lẽ một hoạt động không xem nội dung có thể được gọi là bộ thu phát. các lớp hoặc ứng dụng khác theo yêu cầu ...

suy nghĩ điên rồ được liệt kê ở trên hoạt động ... bắt đầu một hoạt động với PendingIntent. getActivity và sử dụng nó để chuyển tiếp chương trình phát sóng hoặc các ý định khác sau đó tự kết thúc ... hiệu ứng không trực tiếp nhưng không thể nhận được đối với người dùng cuối

9

Tôi thấy rằng khi bạn sử dụng các nút tác vụ trong thông báo mở rộng, bạn phải viết thêm và bạn bị hạn chế hơn.

Trước khi sử dụng thông báo mở rộng, hành động mặc định trong thông báo tải xuống tệp của tôi là bắt đầu hoạt động XEM trên tệp. Ý định VIEW được bao bọc bởi ý định của Người chọn. Tôi không thể sử dụng mục đích đang chờ xử lý cho ý định Trình chọn trực tiếp từ thông báo vì Trình chọn sẽ bị lỗi nếu không có hoạt động nào để xem loại tệp. Vì vậy, tôi đã có một BroadcastReceiver mà sẽ bắt đầu ý định Chooser.

Với thông báo mở rộng, tôi quyết định thay đổi thông báo tải xuống tệp để hành động mặc định là hiển thị hoạt động chi tiết tệp, với các nút tác vụ cho Xem và gửi. Như đã lưu ý bởi user2536953, bắt đầu một bộ thu phát sóng từ thông báo không đóng ngăn thông báo. Dựa trên thông tin của anh ấy rằng một hoạt động sẽ đóng ngăn kéo, tôi đã thay đổi bộ thu phát sóng của tôi thành NotificationActivity mà không có bất kỳ giao diện người dùng nào.

Như được nêu trong bài đăng này How to dismiss Android notification after action has been clicked, một vấn đề khác là bạn phải hủy thủ công thông báo của mình khi người dùng nhấp vào nút tác vụ. Thông báo chỉ bị hủy tự động cho hành động mặc định. Tôi cũng đã thêm mã trong NotificationActivity để xử lý việc này.

Xây dựng thông báo mở rộng với xem và gửi cho nút:

NotificationCompat.Builder builder = new NotificationCompat.Builder(m_context).setAutoCancel(true); 

    final PendingIntent contentIntent = DownloadedFileIntentUtils.buildPendingItemDetailIntent(m_context, item); 
     builder.setContentIntent(contentIntent); 

    PendingIntent viewIntent = DownloadedFileIntentUtils.buildNotificationActionIntent(m_context, Intent.ACTION_VIEW, 
       m_context.getString(R.string.action_open), uri, MimeTypeUtil.getMimeType(item), id); 
    builder.addAction(R.drawable.actionbar_open_with, m_context.getString(R.string.action_open), viewIntent); 

    PendingIntent sendIntent = DownloadedFileIntentUtils.buildNotificationActionIntent(m_context, Intent.ACTION_SEND, 
       m_context.getString(R.string.action_send), uri, MimeTypeUtil.getMimeType(item), id); 
    builder.addAction(R.drawable.actionbar_share, m_context.getString(R.string.action_send), sendIntent); 

    builder.setTicker(title) 
    .setContentTitle(title) 
    .setContentText(text) 
    .setSmallIcon(R.drawable.notification_download); 
    .setStyle(new NotificationCompat.BigTextStyle().bigText(text)); 

    getNotificationManager().notify(id, builder.build()); 

Xây dựng mục đích để bắt đầu một hoạt động từ các nút hành động thông báo:

public static PendingIntent buildNotificationActionIntent(Context context, String action, String actionTitle, Uri uri, 
     String mimeType, int notificationId) { 
    // Build the file action intent (e.g. VIEW or SEND) that we eventually want to start. 
    final Intent fileIntent = buildFileActionIntent(action, actionTitle, uri, mimeType); 

    // Build the intent to start the NotificationActivity. 
    final Intent notificationIntent = new Intent(context, NotificationActivity.class); 
    // This flag must be set on activities started from a notification. 
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    // Pass the file action and notification id to the NotificationActivity. 
    notificationIntent.putExtra(Intent.EXTRA_INTENT, fileIntent); 
    notificationIntent.putExtra(IIntentCode.INTENT_EXTRA_NOTIFICATION_ID, notificationId); 

    // Return a pending intent to pass to the notification manager. 
    return PendingIntent.getActivity(context, s_intentCode.getAndIncrement(), notificationIntent, PendingIntent.FLAG_ONE_SHOT); 
} 

public static Intent buildFileActionIntent(String action, String actionTitle, 
     Uri uri, String mimeType) { 
    Intent intent = new Intent(action); 
    intent.addCategory(Intent.CATEGORY_DEFAULT); 

    if (action.equals(Intent.ACTION_SEND)) { 
     intent.putExtra(Intent.EXTRA_STREAM, uri); 
     intent.setType(mimeType); 
    } else { 
     intent.setDataAndType(uri, mimeType); 
    } 

    intent.putExtra(Intent.EXTRA_TITLE, actionTitle); 

    // Grant read permission on the file to other apps without declared permission. 
    int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION; 
    intent.setFlags(flags); 

    return intent; 
} 

hoạt động thông báo mà không cần bất kỳ Giao diện người dùng:

public class NotificationActivity extends Activity { 
private final static Logger s_logger = LogUtil.getLogger(NotificationActivity.class); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent intent = getIntent(); 

    // Cancel the notification that initiated this activity. 
    // This is required when using the action buttons in expanded notifications. 
    // While the default action automatically closes the notification, the 
    // actions initiated by buttons do not. 
    int notificationId = intent.getIntExtra(IIntentCode.INTENT_EXTRA_NOTIFICATION_ID, -1); 
    if (notificationId != -1) { 
     NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     manager.cancel(notificationId); 
    } 

    // If there is an activity to handle the action, start the file action. 
    if (DownloadedFileIntentUtils.verifyActivityIsAvailable(this, fileActionIntent, false)) { 
      fileActionIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      DownloadedFileIntentUtils.startFileActionActivity(this, fileActionIntent); 
    } 

    // Finish activity. 
    finish(); 
} 

public static void startFileActionActivity(Context context, Intent fileActionIntent) { 
    // Start chooser intent. 
    Intent chooser = Intent.createChooser(fileActionIntent, fileActionIntent.getStringExtra(Intent.EXTRA_TITLE)); 

    // Copy the flags from fileActionIntent to chooser intent. 
    // FileActionExecutor must set FLAG_ACTIVITY_NEW_TASK on the intent passed to startActivity 
    // because the flag is required when starting an activity from a context that is not an activity. 
    chooser.addFlags(fileActionIntent.getFlags()); 

    context.startActivity(chooser); 
} 

Đừng quên thêm NotificationActivity vào AndroidManifest.xml.

+0

Cảm ơn bạn rất nhiều! –

+1

Tôi đã được yêu cầu đặt android: taskAffinity = "" trong NotificationActivity nếu không nó cũng đã bắt đầu MainActivity nếu nó tồn tại trong backstack –

+0

http://stackoverflow.com/questions/42527534/pending-action-expand-notification-on- bấm vào Xin vui lòng tôi có câu hỏi –

36

Nếu hành động của bạn là ở dạng của một phát sóng hoặc một dịch vụ nhưng bạn có ý định cho ngăn kéo thông báo sụp đổ, bạn nên phát sóng android.intent.action.CLOSE_SYSTEM_DIALOGS từ onReceive của bạn. Thao tác này sẽ đóng ngăn ngăn thủ công.

+26

sendBroadcast (new Intent (Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); – goodhyun

+2

phương thức sendBroadcast có thể được tìm thấy bên trong đối tượng ngữ cảnh. –

+0

Tôi đã thêm dòng này vào BroadcastReceiver trước khi gọi context.startActivity (myIntent) Ý định nó = new Intent (Intent.ACTION_CLOSE_SYSTEM_DIALOGS); context.sendBroadcast (it); –