16

Tôi đang cố gắng thêm mục Hành động thông báo trong ứng dụng của tôi là trình phát nhạc. Khi một luồng được bắt đầu, một thông báo sẽ được kích hoạt và nút dừng cho luồng sẽ được hiển thị trong thông báo không chính xác. Thông báo hoạt động tốt cho đến nay, tôi gặp sự cố với mục tác vụ dừng. Sau đây là cách nó được khai báo trong các dịch vụ bắt đầu dòng:.Tác vụ thông báo của Android không được kích hoạt (PendingIntent)

Intent stopIntent = new Intent(this, MusicPlayerNew.class); 
stopIntent.putExtra("STOP", "STOP"); 
PendingIntent stopPendingIntent = PendingIntent.getActivity(this, 0, 
       stopIntent, PendingIntent.FLAG_UPDATE_CURRENT, null); 
mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent); 

Bây giờ trong onResume() - Phương pháp hoạt động của tôi, tôi kiểm tra với getIntent() getStringExtra() cho "STOP" thêm, nhưng ý tôi lấy thông qua getIntent() không có tính năng bổ sung thiết :(

tôi cũng đã cố gắng để kiểm tra để gửi quảng bá (tôi có một máy thu phát sóng làm việc để giao tiếp từ các dịch vụ cho hoạt động này)

Intent stopIntent2 = new Intent(MusicPlayerNew.STOP_MEDIAPLAYER); 
PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0, 
       stopIntent2, PendingIntent.FLAG_UPDATE_CURRENT); 
mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent2); 

Bây giờ điều này hoạt động nếu hoạt động hiện đang ở nền trước. n nền nút dừng không làm gì :(

EDIT: Tôi có BroadcastReceiver trong Hoạt động của tôi như là một lớp riêng

private class DataUpdateReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
.. 
}} 

Trong onResume() đăng ký ứng dụng của tôi cho thu này:

intentFilter = new IntentFilter(STOP_MEDIAPLAYER); 
registerReceiver(dataUpdateReceiver, intentFilter); 

onPause()

unregisterReceiver(dataUpdateReceiver); 

Bây giờ, nếu tôi loại bỏ việc hủy đăng ký khỏi phương thức onPause() - phát sóng được nhận ngay cả khi ứng dụng/hoạt động không ở nền trước nữa. Nhưng đây có phải là cách đúng để làm điều đó không? Tôi đã đăng ký/hủy đăng ký nội dung này từ một hướng dẫn trên web mà tôi nghĩ ..

+0

Tôi gặp vấn đề tương tự trên KitKat. Tôi có hai hành động, đầu tiên được gọi là tốt, thứ hai không được gọi là cả. Bạn đã tìm cách giải quyết vấn đề này chưa? – Nik

+0

Ok, tôi đã tìm thấy giải pháp. Nhìn phần dưới cùng của tôi. – Nik

Trả lời

9

tôi tìm giải pháp trong chủ đề này trên google đang https://code.google.com/p/android/issues/detail?id=61850

Để khắc phục nó, bạn phải thêm PendingIntent.FLAG_CANCEL_CURRENT cờ để PendingIntent của bạn.

PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0, 
      stopIntent2, PendingIntent.FLAG_CANCEL_CURRENT); 
+0

Cảm ơn. Điều này thực sự khiến tôi phát điên khi tôi gặp vấn đề tương tự. Điều này đã làm các trick. Có thể là một khởi động lại của thiết bị cũng đã giúp quá, nhưng điều này là sạch sẽ. – sivag1

0

Bạn không nhận được chương trình phát khi đang ở chế độ nền vì bạn chưa đăng ký ở chế độ onPause. Di chuyển mã unregisterReceiver sang hàm onDestroy. Điều này sẽ chỉ được gọi khi hoạt động bị hủy. Hoặc bạn có thể hủy đăng ký khi sự kiện được mong đợi đã xảy ra.

2

Hơn sử dụng máy thu phát sóng, bạn nên sử dụng một dịch vụ và khai báo một hành động mới trong dịch vụ của bạn theo cách này:

public final String ACTION_STOP = "yourpackagename.ACTION_STOP"; 

Và sau đó tạo ra ý đồ của bạn như thế này:

Intent stopIntent = new Intent(this, YourService.class).setAction(YourService.ACTION_STOP); 
PendingIntent stopPendingIntent = PendingIntent.getService(this, 0, stopIntent, 0); 

Dĩ nhiên , ngừng phát lại trong chức năng của dịch vụ startCommand, nếu hành động của mục đích bằng ACTION_STOP.

này nên làm các trick;)

0

Có nhiều câu hỏi ở đây:

Phần 1: Tại sao ý định của bạn không nhận được "STOP" thêm? Mặc dù mã không được nhìn thấy trong mã bạn đã cung cấp, tôi muốn xác nhận xem bạn có đang sử dụng cờ FLAG_ACTIVITY_SINGLE_TOP cho mục đích thông báo không? Nếu vậy, ý định bạn nhận được trong hoạt động của bạn sẽ là ý định bắt đầu hoạt động và do đó phụ "STOP" sẽ không có sẵn. Bạn sẽ cần phải mở rộng onNewIntent() là trường hợp này (nơi mà mục đích mới được gửi). More info here.
Nếu bạn chưa sử dụng FLAG_ACTIVITY_SINGLE_TOP, thì điều đó có nghĩa là một hoạt động mới được tạo khi thông báo được khai thác, trong trường hợp đó Intent phải có tham số "STOP". Nếu bạn có thể cung cấp cho tôi tất cả các mã có liên quan, tôi có thể giúp bạn tốt hơn.

Phần 2: Sử dụng bộ thu phát sóng Điều này không thẳng về phía trước, như bạn đã khám phá. Bạn sẽ cần phải hủy đăng ký trong onDestroy và nếu hoạt động của bạn bị người dùng đóng, onDestroy có thể được gọi và người nhận phát của bạn có thể không hoạt động tại thời điểm thông báo được người dùng nhấn vào. Nếu bạn không unregister ở tất cả, nó có vẻ có vẻ là làm việc, nhưng đây là một rò rỉ bộ nhớ, GC có thể làm sạch bất cứ lúc nào có thể dẫn đến một vụ tai nạn trong chương trình của bạn, tức là, bạn PHẢI bỏ đăng ký. Nếu bạn cần phải đi với phương pháp tiếp nhận phát sóng, bạn cần phải có một dịch vụ để làm điều này và dịch vụ đi kèm với những cạm bẫy của riêng mình -> khởi động lại bằng hệ thống, pin cống vv Tôi rất khuyên bạn nên đi với cách tiếp cận đầu tiên của bạn.

5

Tôi chạy vào vấn đề này ngày hôm nay và nó được gây ra bởi các hoạt động không được đăng ký hoặc bổ sung vào AndroidManifest.xml. Tôi nghĩ rằng tôi đã có nó ở đó nhưng nó đã không được. Ngoài ra, không có lỗi nào được ghi lại bằng cách cố gắng gọi hành động với mục đích của nó.

Tôi đã tìm ra điều này bằng cách tạo ý định và sau đó gọi startAcitivty (intent) mà không cần sử dụng thông báo. Sau đó nó đã cho tôi một lỗi nói rõ hoạt động có thể bị thiếu trong tệp kê khai.

Nếu không có câu trả lời nào khác giải quyết được vấn đề của bạn thì hy vọng điều này sẽ xảy ra. Thông thường vấn đề khó khăn là kết quả của một cái gì đó đơn giản và ngớ ngẩn.

6

Tôi đã gặp sự cố này ngay hôm nay. Trong trường hợp của tôi, nó đã sử dụng các tính năng bổ sung có mục đích được lưu trong bộ nhớ cache từ một cá thể trước đó của mục đích vì tất cả các tham số cho các nhà xây dựng pendingIntent đều giống nhau. Tôi đã tìm thấy hai giải pháp cho việc này ...

  1. Sử dụng FLAG_CANCEL_CURRENT như được đề cập bởi Nik.
  2. Đi qua một độc đáo requestCode đến pendingIntent như sau

    PendingIntent pi = PendingIntent.getService(this, UNIQUE_ID, pi, 0); 
    

Trong trường hợp của tôi, phương pháp thứ hai giải quyết vấn đề như tôi cần phải giữ cho các thông báo trước đó còn sống. Có thể điều này sẽ giúp một người có vấn đề tương tự.

+0

Tôi không nghĩ UNIQUE_ID là cần thiết, trừ khi có xung đột với một dịch vụ khác. –

0

Tôi gặp sự cố rất giống nhưng là một giải pháp rất khác. Mục đích đang chờ xử lý cũng không được kích hoạt nếu bạn đã khai báo <service android:enabled="false"></service> trong tệp manifest.xml của mình.

Thay android:enabled="false"-android:enabled="true"

này có thể không là một vấn đề trực tiếp của vấn đề. Nhưng nếu bạn tạo dịch vụ trong studio android bằng mẫu mặc định, nó sẽ tự động thêm các thuộc tính này vào dịch vụ.

0

Đối với tôi, giải pháp là để thiết lập các lá cờ của mục đích:

resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
       Intent.FLAG_ACTIVITY_CLEAR_TASK); 
6

Đây là rất muộn câu trả lời nhưng nó có thể giúp ai đó:

Bạn nên chọn đúng loại Trong khi chờ ý định dựa về ý định bạn muốn chạy. Dưới đây là một số ví dụ:

Đối Hoạt động sử dụng dưới đây:

Intent i = new Intent(this, YourActivity.class); 
PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0); 

Đối Dịch vụ sử dụng dưới đây:

Intent i = new Intent(this, YourService.class); 
PendingIntent pi = PendingIntent.getService(this, 0, i, 0); 

Đối Broadcast Receiver sử dụng dưới đây:

Intent i = new Intent(this, YourReciver.class); 
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0); 

Bạn có thể cần thay đổi mã yêu cầu và Flags nếu được yêu cầu

Các vấn đề liên quan