10

我實施了Firebase並測試了Firebase通知。 當應用程序在前臺,我沒有問題,我實現了一個擴展服務FirebaseMessagingService處理消息和數據onMessageReceivedFirebase控制檯:如何爲通知指定click_action

我有問題,當應用程序在後臺,我會喜歡發送一個通知,打開一個特定的活動,並做我計劃要做的事情,而不只是打開應用程序。

我按照Firebase指南中的描述完成了操作,但無法啓動特定活動。

這裏的清單:

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

而且這裏的火力地堡控制檯。我必須在這些字段中寫下什麼來打開我的「BasicNotificationActivity」?

Firebase console

+2

您所描述的行爲是奇數。根據文檔(https://firebase.google.com/docs/notifications/android/console-device#receive_and_handle_messages),onMessageReceived應該*只在*應用程序在前臺*時被調用(因爲您有通知和數據有效載荷)。你所描述的是它是相反的。那是對的嗎? –

+0

對不起,我交換了前景和背景。我編輯了這個問題。 – Alex

+0

[Firebase FCM通知單擊\ _action有效內容]的可能重複(http://stackoverflow.com/questions/37407366/firebase-fcm-notifications-click-action-payload) –

回答

18

這是這個問題的一個副本:Firebase FCM notifications click_action payload

但是,這是由這個問題的作者接受了答案只是說,它是不可能的火力地堡控制檯,但它是 - 與一個簡單的解決方法。 This answer by diidu到相同的問題解釋我將使用的解決方法。

UPDATE:
爲了詳細說明他的答案:

添加的輔助類(或以某種方式實現startActivity()法):

public class ClickActionHelper { 
    public static void startActivity(String className, Bundle extras, Context context){ 
     Class cls; 
     try { 
      cls = Class.forName(className); 
     }catch(ClassNotFoundException e){ 
      //means you made a wrong input in firebase console 
     } 
     Intent i = new Intent(context, cls); 
     i.putExtras(extras); 
     context.startActivity(i); 
    } 
} 

在您的應用程序的啓動活動,請致電請檢查onCreate()onNewIntent()(如果活動是以單頂標誌啓動的,則只調用onNewIntent()而不是onCreate())中的任何新意圖:

@Override 
protected void onCreate(Bundle bundle) { 
    [...] 
    checkIntent(getIntent()); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    [...] 
    checkIntent(intent); 
} 

public void checkIntent(Intent intent) { 
     if (intent.hasExtra("click_action")) { 
     ClickActionHelper.startActivity(intent.getStringExtra("click_action"), intent.getExtras(), this); 
     } 
} 

而且在onMessageReceived()

public void onMessageReceived(RemoteMessage remoteMessage) { 
    Map<String, String> data = remoteMessage.getData();   
    if (data.containsKey("click_action")) { 
     ClickActionHelper.startActivity(data.get("click_action"), null, this); 
    } 
} 

發送通知與火力控制檯中,將鍵值對,如自定義的數據是這樣的:

Key: click_action 
Value: <fully qualified classname of your activity> 

現在,當通知被接收並點擊,它會打開你的活動。如果您的應用程序處於前景中,它也會立即轉換爲活動 - 向用戶詢問他是否想要參加此活動可能會很好(通過在onMessageReceived()中顯示對話框)。

+0

在那個答案中,我不明白在哪裏放置應該處理「自定義數據」的代碼。 – Alex

+0

我更新了我的答案。這將是如何處理自定義數據。在後臺時,自定義數據是在啓動啓動器活動的意圖的附加內容中。 –

+0

onMessageReceived()你提到過,哪個類應該被放置?在我爲Firebase實施的服務中?或者我想在通知中打開新課程? – Alex

0

我也有像你的麻煩,但我沒有得到任何正確的答案 這就是我知道的事實,

  1. onNewIntent

這種覆蓋方法不工作時,應用程序是後臺因爲工作默認行動是android.intent.action.MAIN

  • 火力地堡控制檯
  • 火力控制檯是不夠的能力來處理click_action這意味着點擊動作不能達不到應用程序時應用程序在背景。

  • CURL
  • 捲曲是工作在應用背景,但不前景可以是我無法找到。

    curl --header "Authorization: key=<Colud_Messaging_Server_Key_here>" --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send -d "{\"to\":\"dwdfosu6SDs:APA91bFWxZZB2f8AOgP9MG504cy5AhFECHGbYFfIzVixoAfy-ErT0NYQrREg150CbKYBtk3Ywpu7WQuWsQhk-VmoOe-0iDK3ZgaFZNvYxDuixZB8zQp0zydoXhyrMosi5C4eyBb7Ai1z\",\"notification\": {\"title\": \"Click Action Message\",\"text\": \"Sample message\",\"click_action\":\"noti\",\"ticket_download\":\"noti\"}}" 
    

    添加Minifest

    <activity 
        android:name=".activity.TicketDownload" 
        android:exported="true"> 
        <intent-filter> 
         <action android:name="noti" /> 
         <category android:name="android.intent.category.DEFAULT" /> 
        </intent-filter> 
    </activity> 
    

    注:cloud_messaging_server_key是定位設置> cloudmessaging

    如果有什麼新的事實,請讓我知道。

    0

    我已經使用handleIntent(Intent intent)方法來處理並移動到該特定屏幕。 下面是我的代碼是可以正常使用,即使應用在後臺:

    FCMMessagingService.java這extends FCMMessagingService

    @Override 
        public void handleIntent(Intent intent) { 
         super.handleIntent(intent); 
    
        Intent i = null; 
        String value_action = ""; 
    
         if (intent.getExtras() != null) { 
          if (key.equals("click_action")) { 
           value_action = intent.getExtras().getString(key); 
          } 
    
          i = new Intent(FCMMessagingService.this, MainActivity.class); 
          i.putExtra("notificationFlag", value_action); 
          i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    
         } 
        PendingIntent pendingIntent = PendingIntent.getActivity(this, notifCount, i, PendingIntent.FLAG_ONE_SHOT); 
         final int icon = R.mipmap.logo; 
        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this); 
    
        Notification notification; 
        notification = notificationBuilder.setSmallIcon(icon).setTicker(title) 
          .setAutoCancel(true) 
          .setContentTitle(title) 
          .setContentText(body) 
          .setSound(defaultSoundUri) 
          .setContentIntent(pendingIntent) 
          .setSmallIcon(R.mipmap.notification_icon) 
          .setLargeIcon(BitmapFactory.decodeResource(getResources(), icon)) 
          .build(); 
    
    
        notificationBuilder.setContentTitle(title); 
        notificationBuilder.setContentText(body); 
        notificationBuilder.setAutoCancel(true); 
        notificationBuilder.setSound(defaultSoundUri); 
        notificationBuilder.setContentIntent(pendingIntent); 
        notificationBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(), icon)); 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
         notificationBuilder.setSmallIcon(R.mipmap.logo); 
        } else { 
         notificationBuilder.setSmallIcon(R.mipmap.logo); 
        } 
    
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
        notificationManager.notify(notifCount, notification); 
    
    } 
    
    相關問題