2016-11-21 27 views
7

Tôi đang sử dụng Nhắn tin qua đám mây của Firebase để gửi tin nhắn dữ liệu đến ứng dụng tôi đang phát triển. Theo Tài liệu FCM, khi ứng dụng ở tiền cảnh:Nhắn tin qua đám mây của Firebase - Android: thông báo nhấp chuột khi ứng dụng bị đóng không hoạt động

Ứng dụng khách nhận được thông báo dữ liệu trong onMessageReceived() và có thể xử lý các cặp khóa-giá trị tương ứng.

và hoạt động tốt. Khi ứng dụng ở chế độ nền, hành vi khác nhau:

tải trọng dữ liệu có thể được truy lục trong Mục đích được sử dụng để khởi chạy hoạt động của bạn.

và dường như không hoạt động tốt. Tôi đang sử dụng thông số "click_action" trong JSON thông báo, nơi tôi chỉ định tên của bộ lọc ý định được sử dụng trong Tệp kê khai Android bên trong thẻ "hoạt động" mà tôi muốn mở. Ví dụ, thông báo của tôi có thể là:

{ 
    "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...", 
    "notification" : { 
     "body" : "This is a test", 
     "title" : "Test", 
     "click_action" : "com.test.click" 
    }, 
    "data" : { 
     "key" : "data" 
    } 
} 

Và biểu hiện của tôi có này ý định lọc, trong "MainActivity":

<intent-filter> 
    <action android:name="com.test.click" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 

Khi ứng dụng của tôi là ở chế độ nền và tôi khởi động thông báo, tất cả mọi thứ dường như hoạt động tốt: tôi nhấp vào thông báo và hoạt động chính xác được hiển thị và các khóa dữ liệu nằm trong "extras" của mục đích nhận được. Sự cố xảy ra khi ứng dụng của tôi bị đóng: khi tôi nhấn vào thông báo, ứng dụng bắt đầu chính xác và mở hoạt động bằng bộ lọc "com.test.click" nhưng nếu tôi cố gắng gửi thông báo khác, khi tôi nhấn trên nó không có gì xảy ra và các thông báo nền không hoạt động nữa cho đến khi tôi khởi động lại ứng dụng.

Để rõ ràng hơn: thông báo hoạt động tốt trong khi ứng dụng của tôi ở chế độ nền trước hoặc trong nền. Nếu ứng dụng của tôi bị đóng, thông báo đầu tiên sẽ được xử lý chính xác nhưng mọi thông báo nền khác sẽ không hoạt động nữa cho đến khi tôi khởi động lại ứng dụng: nếu tôi nhấn vào thông báo, ứng dụng của tôi sẽ hiển thị hoạt động cuối cùng được xem, như thể tôi đã chọn ứng dụng từ menu "Ứng dụng gần đây". Nếu tôi đóng và khởi động lại ứng dụng, các thông báo sẽ hoạt động bình thường.

Đây có phải là lỗi của thông báo dữ liệu trong Android hoặc vấn đề FCM không? Có cách nào để giải quyết vấn đề này không?

Tôi đang sử dụng API 5 của Nexus 5 để thử nghiệm.

+1

Hi do u có giải pháp cho việc này? – Bahu

+0

@Bahu Thật không may, tôi đã tìm thấy một giải pháp chỉ sử dụng tin nhắn dữ liệu, sử dụng thông báo khay hệ thống mà lỗi vẫn tồn tại. Tôi nghĩ đó là lỗi FCM. Bạn đã thử nghiệm cùng một lỗi tôi mô tả trong câu hỏi của tôi? –

+1

Có bro, tôi đang cố gắng giải quyết vấn đề này. Nếu bạn có bất kỳ đề xuất nào khác hơn là "thông báo dữ liệu, sử dụng thông báo khay hệ thống", hãy cho tôi biết – Bahu

Trả lời

8

Tôi sẽ cố gắng để mô tả cách nó làm việc trên trường hợp của tôi

Thông báo tải trọng ví dụ:

{ 
"notification": { 
    "body": "This is a test message", 
    "title": "Message", 
    "click_action" : "OPEN_ACTIVITY_1" 
}, 
"data": { 
    "key": "test key" 

} 

Manifest trong hoạt động

<intent-filter> 
    <action android:name="OPEN_ACTIVITY_1" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 

Khi ứng dụng được ở chế độ nền hoặc đóng cửa FCM sẽ tạo "Thông báo" và onClick, nó sẽ mở hoạt động phù hợp, sau đó xử lý thông báo khi ứng dụng bị đóng, gọi getIntent() trong onCreat phương thức e()

ví dụ:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_hub); 

    handleIntents(getIntent()); //for simplicity I'm passing the value forward 


} 

Khi ứng dụng ở trên nền trước Tôi đang tạo thông báo tùy chỉnh trong phương thức onMessageReceived trên FirebaseMessagingService.

ví dụ:

Intent intent = new Intent(this, HubActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent.putExtra("url", remoteMessage.getData().get("url")); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, 
      PendingIntent.FLAG_ONE_SHOT); 

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.ic_launcher) 
      .setContentTitle("Message") 
      .setContentText("This is a test message") 
      .setAutoCancel(true) 
      .setSound(defaultSoundUri) 
      .setContentIntent(pendingIntent); 

    NotificationManager notificationManager = 
      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 

và để xử lý nó một cách thích hợp trong hoạt động, tôi ghi đè phương thức trênNewIntent (Mục đích).

ví dụ:

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 

    handleIntents(intent); //for simplicity I'm passing the value foward 


} 

vì vậy những gì tôi nghĩ bạn đang bỏ lỡ là onNewIntent (Intent intent) vì điều này xử lý các ý định mới khi hoạt động đã được tạo.

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