2

firebaseが正常に動作していて、ステータスバーに通知が表示されますが、通知がクリックされたとき、デフォルトのランチャーではなくカスタムアクティビティ、それについてどうすればいいですか?通知がクリックされてアクティビティが開かれたとき

public class CustomActivity extends AppCompatActivity { 

private static final String TAG = "CustomActivity"; 


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


    TextView mymessage = (TextView) findViewById(R.id.mymessage); 

    // If a notification message is tapped, any data accompanying the notification 
    // message is available in the intent extras. In this sample the launcher 
    // intent is fired when the notification is tapped, so any accompanying data would 
    // be handled here. If you want a different intent fired, set the click_action 
    // field of the notification message to the desired intent. The launcher intent 
    // is used when no click_action is specified. 
    // 
    // Handle possible data accompanying notification message. 
    // [START handle_data_extras] 
    if (getIntent().getExtras() != null) { 
     for (String key : getIntent().getExtras().keySet()) { 
      String value = String.valueOf(getIntent().getExtras().get(key)); 
      Log.d(TAG, "Key: " + key + " Value: " + value); 
      // 
      Toast.makeText(getApplicationContext() , value , Toast.LENGTH_SHORT).show(); 


     } 

     //Toast.makeText(getApplicationContext() , String.valueOf(getIntent().getExtras().get("message")) , Toast.LENGTH_SHORT).show(); 


    } 
    // [END handle_data_extras] 

    Button subscribeButton = (Button) findViewById(R.id.subscribeButton); 
    subscribeButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // [START subscribe_topics] 
      FirebaseMessaging.getInstance().subscribeToTopic("news"); 
      // [END subscribe_topics] 

      // Log and toast 
      String msg = getString(R.string.msg_subscribed); 
      Log.d(TAG, msg); 
      Toast.makeText(CustomActivity.this, msg, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    Button logTokenButton = (Button) findViewById(R.id.logTokenButton); 
    logTokenButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Get token 
      String token = FirebaseInstanceId.getInstance().getToken(); 

      // Log and toast 
      String msg = getString(R.string.msg_token_fmt, token); 
      Log.d(TAG, msg); 
      Toast.makeText(CustomActivity.this, msg, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

これは、通知が送信されたときに開くカスタムアクティビティです。通知はFirebaseクラウドメッセージングからのものです。

public class MyFirebaseMessagingService extends FirebaseMessagingService { 

private static final String TAG = "MyFirebaseMsgService"; 

/** 
* Called when message is received. 
* 
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging. 
*/ 
// [START receive_message] 
@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    // [START_EXCLUDE] 
    // There are two types of messages data messages and notification messages. Data messages are handled 
    // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type 
    // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app 
    // is in the foreground. When the app is in the background an automatically generated notification is displayed. 
    // When the user taps on the notification they are returned to the app. Messages containing both notification 
    // and data payloads are treated as notification messages. The Firebase console always sends notification 

    // [END_EXCLUDE] 

    // TODO(developer): Handle FCM messages here. 
    Log.d(TAG, "From: " + remoteMessage.getFrom()); 

    // Check if message contains a data payload. 
    if (remoteMessage.getData().size() > 0) { 
     Log.d(TAG, "Message data payload: " + remoteMessage.getData()); 
     System.out.print("Message data payload :" + remoteMessage.getData()); 

    } 

    // Check if message contains a notification payload. 
    if (remoteMessage.getNotification() != null) { 
     Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); 
     System.out.print("Message Notification Body :" + remoteMessage.getNotification().getBody()); 
    } 



    // Also if you intend on generating your own notifications as a result of a received FCM 
    // message, here is where that should be initiated. See sendNotification method below. 


} 
// [END receive_message] 



/** 
* Create and show a simple notification containing the received FCM message. 
* 
* @param messageBody FCM message body received. 
*/ 
private void sendNotification(String messageBody) { 
    Intent intent = new Intent(this, CustomActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    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_stat_ic_notification) 
      .setContentTitle("FCM Message") 
      .setContentText(messageBody) 
      .setAutoCancel(true) 
      .setSound(defaultSoundUri) 
      .setContentIntent(pendingIntent); 

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

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

}

これはfirebaseからの通知を聴いサービスです。

+2

私があなたを理解している場合[通知がクリックされたときにアクティビティを起動する](http://stackoverflow.com/a/13716784/1889768)を参照してください。 – Abbas

+0

yesを入力してCustomActivityを起動します。上記はソースです。私の主な活動はSplashActivityで、通知がクリックされると、CustomActivityの代わりにそれがランチされます。完全なプロジェクトはこちらhttps://github.com/firebase/quickstart-android/tree/master/messaging –

+1

別のアクティビティを開くには、 'Intent'の' Activity'をカスタム 'Activity'に置き換えてください。 – Abbas

答えて

0

を試してみてください。ランチャー画面にこのコードを追加するだけで、ランチャー画面を閉じてデータを保存するだけで簡単に目的のアクティビティに移動できます。

あなたMainActivityのonCreate(中
//When Notification is tapped 
    if (getIntent().getExtras() != null) { 
     //init message 
     String message = String.valueOf(getIntent().getExtras().get("message")); 
     String title = String.valueOf(getIntent().getExtras().get("title")); 
     //save the message 
     MySharedPreference.save(getApplicationContext() , "message" , message); 
     MySharedPreference.save(getApplicationContext() , "title" , title); 
     startActivity(new Intent(getApplicationContext() , MainActivity.class)); 
     finish(); 
    } 
1
private void showNotification(String msg) { 
    //Creating a notification 
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 
    builder.setSmallIcon(R.drawable.ic_launcher); 
    Intent intent = new Intent().setClassName("packagename", "packagename.YourActivityname"); // give any activity name which you want to open 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); 
    builder.setContentIntent(pendingIntent); 
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); 
    builder.setContentTitle("FireBase"); 
    builder.setContentText(msg); 
    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
    notificationManager.notify(1, builder.build()); 
} 

私はあなたを助けてくれることを願っています!

+0

アプリがバックグラウンドの場合、これは動作しません!!任意の解決策@kinjal –

0

は、私は答えを見つけたこの

Intent notificationIntent =new Intent(context,ActionActivity.class); 
    // set intent so it does not start a new activity 
     notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
     PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 
     this.notification.setLatestEventInfo(context, title, message, intent); 
     this.notification.flags |= Notification.FLAG_AUTO_CANCEL; 
     // you can also add other property like vibrate or sound 
     notificationManager.notify(0, notification); 
+0

サービスが実行されているのでアプリがバックグラウンドで動作する必要があるのは、通知を取得するバックグラウンドです。ありがとう –

0

あなたFirebaseMessagingServiceインサイド...

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    Log.d(TAG, "From: " + remoteMessage.getFrom()); 
    NotificationPublisher.getInstance().showNotification(this, remoteMessage); 

} 

その後、あなたのNotificationPublisher中...

public static final String EXTRA_CHAT_NOTIFICATION = "com.myProject.chat_notification"; 
public void showNotification(Context context, RemoteMessage remoteMessage) { 
    Intent intent = new Intent(); 

    if (remoteMessage.getData().get("notification_type") != null) { 
     Intent i = new Intent("broadCastName"); 
     i.putExtra("type", remoteMessage.getData().get("notification_type")); 
     i.putExtra("trip_id", remoteMessage.getData().get("trip_id")); 
     i.putExtra("status", remoteMessage.getData().get("status")); 
     context.sendBroadcast(i); 
     return; 
    } 

    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent = new Intent(context, MainActivity.class); 
    HashMap<String, String> dataHash = new HashMap<>(remoteMessage.getData()); 
    intent.putExtra(EXTRA_CHAT_NOTIFICATION, dataHash); 

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context) 
      .setSmallIcon(R.drawable.ic_noti) 
      .setLargeIcon(R.drawable.ic_noti) 
      .setColor(ContextCompat.getColor(context, R.color.white)) 
      .setContentTitle(remoteMessage.getData().get("title")) 
      .setContentText(remoteMessage.getData().get("content")) 
      .setAutoCancel(true) 
      .setSound(defaultSoundUri) 
      .setDefaults(Notification.DEFAULT_VIBRATE) 
      .setPriority(NotificationCompat.PRIORITY_MAX) 
      .setContentIntent(pendingIntent); 

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

    notificationManager.notify(0, notificationBuilder.build()); 
} 
} 

そして最後に)入ってくるデータを扱うには...

// Handle possible data accompanying notification message. 
    // [START handle_data_extras] 
    if (getIntent().getExtras() != null) { 
     for (String key : getIntent().getExtras().keySet()) { 
      Object value = getIntent().getExtras().get(key); 
      Log.d(TAG, "Key: " + key + " Value: " + value); 
      if(key.equals(NotificationPublisher.EXTRA_CHAT_NOTIFICATION)) { 
       // TODO: Start myCustomActivity 
      } 
     } 
    } 
関連する問題