Android OnNewIntent не вызывается

Я видел несколько подходов и попробовал все, но не смог заставить его работать. Я не знаю, почему это так сложно, в документах это выглядит так просто! Я хочу запустить OnNewIntent с уведомлением (пользователь нажимает на него в панели уведомлений).

В настоящее время я установил свою активность как синглтоп

<activity
    android:name="-.-.-.MainMenuActivity"
    android:launchMode="singleTop"
    android:screenOrientation="portrait" >
</activity>

Это код, где я создаю Уведомление:

public void showNotification(String text, String componentId){
    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.logo)
            .setContentTitle("Title")   
            .setAutoCancel(true)
            .setContentText(text);

    // Creates an explicit intent for an Activity in your app
    Intent resultIntent = new Intent(this, MainMenuActivity.class);
    if(!componentId.equalsIgnoreCase("")){                         
        resultIntent.putExtra("componentId", componentId);
    }   
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, 0);
    mBuilder.setFullScreenIntent(resultPendingIntent, false);
    mBuilder.setContentIntent(resultPendingIntent);
    NotificationManager mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // mId allows you to update the notification later on.
    mNotificationManager.notify(0, mBuilder.build());
}

Это метод OnNewIntent в моей функции MainMenuActivity:

@Override
protected void onNewIntent(Intent intent) {
    // TODO Auto-generated method stub
    super.onNewIntent(intent);
    setIntent(intent);

    ...
}

Я никогда не получаю вызов OnNewIntent. Я не знаю, что я делаю неправильно. Я использую только 2 актива во всем приложении, и MainMenuActivity идет после LoginActivity, поэтому MainMenuActivity всегда должна быть на вершине стека (у меня есть больше фрагментов, где я заменяю их внутри MainMenuActivity).

Любая помощь будет оценена! Спасибо вам, ребята.

3 ответа

Решение

Хорошо, все заработало вскоре после публикации моего вопроса. Я думаю, что ключевым отличием в нашем коде является то, что я передаю флаг "PendingIntent.FLAG_UPDATE_CURRENT" созданию / извлечению объекта PendingIntent. Этот пост помог мне понять это.

Notification.Builder mBuilder =
                new Notification.Builder(context)
                .setSmallIcon(R.drawable.notifyicon)
                .setContentTitle(title)
                .setContentText(extras.getString("message"))
                .setAutoCancel(true)
                .setOnlyAlertOnce(false)
                .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                .setVibrate(new long[] {0,500,250,500});

        if(badgeCount > 1)
            mBuilder.setNumber(badgeCount);
        // Creates an explicit intent for an Activity in your app
        Intent resultIntent = new Intent(context, SiteViewActivity.class);
        resultIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        resultIntent.putExtra(NOTIFY_INTENT_TYPE_KEY, alertType);

        PendingIntent resultPendingIntent = PendingIntent.getActivity(context, alertType, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(resultPendingIntent);
        NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notifyMgr.notify(alertType, mBuilder.build());

Во-первых, вы должны добавить android:launchMode="singleTop" к определению вашей активности в файле манифеста, как показано ниже

<activity
    android:name="MainActivity"
    android:launchMode="singleTop"
</activity>

Затем, как сказал Хасан Масуд, вы должны добавить Intent.ACTION_MAIN а также Intent.CATEGORY_LAUNCHER на ваши действия, как показано ниже

Intent intent = new Intent(this, MainActivity.class);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);

Это все. Таким образом, если приложение открыто и когда вы щелкаете по уведомлению, метод onNewIntent(..) сработает, но что бы ни случилось, если приложение закрыто, когда вы щелкаете по уведомлению, намерение уведомления переходит к onCreate(..) метод текущей деятельности.

После долгого осмотра я заметил, что Android 4.4 (Kitkat и, возможно, ниже) не будет вызывать onNewIntent и onResume, если вы используете FLAG_UPDATE_CURRENT для pendingIntent. Как только вы измените его на FLAG_ONE_SHOT, он начнет работать. на Android 6 (и, вероятно, также 5), однако onNewIntent работает даже с флагом FLAG_UPDATE_CURRENT.

Однако, кажется, что если вы создаете несколько ожидающих намерений (например, после получения двух уведомлений), данные не будут обновлены с флагом FLAG_ONE_SHOT, поэтому флаг FLAG_CANCEL_CURRENT может быть лучшим выбором (у него нет проблем с не обновленными данными)

Другие вопросы по тегам