Push-уведомления - получение информации о намерениях при нажатии на уведомление, приложение работает - PullRequest
0 голосов
/ 02 мая 2018

Я реализовал push-уведомления Firebase, и когда приложение находится на переднем плане, я создаю пользовательское уведомление с помощью Pending Intent. При нажатии на уведомление открывается новая деятельность. Если приложение открыто и активность запущена, я не хочу его воссоздавать, а просто открываю. Я установил для launchMode значение 'singleTask', что и помогает.

Проблема в том, что я передаю статистику с помощью Intent, и onCreate не вызывается и напрямую запускает onResume.

как мне получить дополнительные услуги?

Я что-то здесь не так делаю? Ваша помощь и предложения будут очень полезны

вот код для создания настраиваемого уведомления в ожидании намерения.

private void sendNotification(PushNotification pushNotification) {
        try{
            Intent intent = new Intent(this, BottomNavigationActivity.class);
            intent.putExtra("pushNotification", (Serializable) pushNotification);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = PendingIntent.getActivity(this,(int) System.currentTimeMillis() /* request code */, intent,PendingIntent.FLAG_UPDATE_CURRENT);

            long[] pattern = {500,500,500,500,500};

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

            NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle(pushNotification.getTitle())
                    .setContentText(pushNotification.getMessage())
                    .setAutoCancel(true)
                    .setVibrate(pattern)
                    .setLights(Color.BLUE,1,1)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent);

            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify( (int) System.currentTimeMillis() /* ID of notification */, notificationBuilder.build());
        }catch (Exception e){
            Log.d(TAG,e.getMessage());
        }
    }

Manifest

<activity
            android:name=".activity.BottomNavigationActivity"
            android:screenOrientation="portrait"
            android:launchMode="singleTask">
        </activity>

BottomNavigationActivity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            Intent intent = getIntent();
            PushNotification pushNotification = (PushNotification) intent.getSerializableExtra("pushNotification");
            if(null != intent.getExtras()){
                //here i get the pushnotification data and do something with it.
            }
        }catch (Exception e){
            Log.d(TAG, e.getMessage());
        }
    }

@Override
protected void onResume() {
    super.onResume();
    }

Спасибо R

1 Ответ

0 голосов
/ 02 мая 2018

Для этого вы должны использовать приемник Broadcast.

Когда вы получаете push-запрос от firebase в сервисе firebase, отправьте локальную трансляцию на требуемую активность. Для этой проверки первое приложение запущено или нет.

Пример:

В вашем FCM MessagingService поместите этот метод, чтобы проверить, работает приложение или нет

 private boolean isAppIsInBackground(Context context) {
    boolean isInBackground = true;
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

    if (am != null && am.getRunningAppProcesses() !=null) {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
            List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
            for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
                if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    for (String activeProcess : processInfo.pkgList) {
                        if (activeProcess.equals(context.getPackageName())) {
                            isInBackground = false;
                        }
                    }
                }
            }
        } else {
            List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
            ComponentName componentInfo = taskInfo.get(0).topActivity;
            if (componentInfo.getPackageName().equals(context.getPackageName())) {
                isInBackground = false;
            }
        }
    }

    return isInBackground;
}

в методе onReceive в FirebaseMessagingService

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub


       if (isAppIsInBackground(getApplicationContext())) {

           // send broadcast

            Bundle extras = intent.getExtras();
            Intent i = new Intent("broadCastName");
            // Data you need to pass to activity
            i.putExtra("message","messageData"); 
            context.sendBroadcast(i);

       } else  {
         // send extra with intent and start activity
           Intent intent=new Intent(getApplicationContext(),YourActivity.class);
           intent.putExtra("message","messageData");
           startActivity(intent)

          /* or here you can also broadcast with data and one flag bit 
            then into your activity when you received this flag bit start that activity again from itself.
          */ 
       }


}

Добавьте это в свой класс деятельности

  BroadcastReceiver broadcastReceiver =  new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        Bundle b = intent.getExtras();

        String message = b.getString("message");

        Log.e("newmesage", "" + message);
       // here you will get your extra data. Use that as required and handle.
    }
};
...