点击通知时活动中的触发方法

时间:2019-07-05 14:44:35

标签: android android-intent notifications android-pendingintent

我的应用反复从服务器加载数据。这些数据中有消息。
每当加载新消息时,都会在接口的回调方法 onMessagesReceived(int numOfMessages)中调用MainActivity。
该应用程序只有一个活动,每个屏幕都实现为一个片段。片段的切换由专用的 Navigator 类管理。

我的问题是用户点击通知的处理。当用户点击通知时,将显示消息列表。

public class MainActivity extends AppCompatActivity implements MessageListener {
    private static final int MESSAGE_NOTIFICATION_ID = 101010;
    private static final String EXTRA_SHOW_MESSAGES = "SHOW_MESSAGES";

    private Navigator mNavigator;

    @Override
    onMessagesReceived(int numOfMessages) {
        Intent intent = new Intent(this, MainActivity.class);
        testIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        testIntent.putExtra(EXTRA_SHOW_MESSAGES, true);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "testChannel")
                .setSmallIcon(R.drawable.ic_message_notification)
                .setContentTitle("New messages!")
                .setContentText("You got " + numOfMessages + " new messages")
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setContentIntent(pendingIntent);

        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
        notificationManager.notify(MESSAGE_NOTIFICATION_ID, builder.build());
    }

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

        Bundle extras = getIntent().getExtras();
        if (extras != null && extras.containsKey(EXTRA_SHOW_MESSAGES)) {
            if (extras.getBoolean(EXTRA_SHOW_MESSAGES)) {
                mNavigator.openMessageList();
            }
        }
    }
}

此刻,当应用程序在后台运行但在 onResume 中时,MainActivity出现,捆绑软件返回为 null
当应用程序处于前台时,什么也没有发生。

我想通过单击通知来实现:
-当用户位于应用程序内部时,应打开MessageList片段
-如果用户不在应用程序内部,则应在打开MessageList Fragment

之前启动它

有人可以给我一个提示,如何从这里继续?也许在这里使用Intents不是正确的解决方案?

2 个答案:

答案 0 :(得分:0)

您可以使用intent,只要将一些布尔值附加到intent中,然后检查main活动中的值(如果该附加值是true),然后调用您的方法。

答案 1 :(得分:0)

在进一步研究Intent和Notifications之后,我终于提出了一个解决方案。

public class MainActivity extends AppCompatActivity implements MessageListener {
    private static final int MESSAGE_NOTIFICATION_ID = 101010;
    private static final String EXTRA_SHOW_MESSAGES = "SHOW_MESSAGES";

    private Navigator mNavigator;

    @Override
    onMessagesReceived(int numOfMessages) {
        Intent intent = new Intent(this, MainActivity.class);
        testIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        testIntent.putExtra(EXTRA_SHOW_MESSAGES, true);

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

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "testChannel")
                .setSmallIcon(R.drawable.ic_message_notification)
                .setContentTitle("New messages!")
                .setContentText("You got " + numOfMessages + " new messages")
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setContentIntent(pendingIntent);

        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
        notificationManager.notify(MESSAGE_NOTIFICATION_ID, builder.build());
    }

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

        Bundle extras = intent.getExtras();
        if (extras != null && extras.containsKey(EXTRA_SHOW_MESSAGES)) {
            if (extras.getBoolean(EXTRA_SHOW_MESSAGES)) {
                mNavigator.openMessageList();
            }
        }
    }
}

我将代码读取新的Intent移到了 onNewIntent 上。当Activity获得新的Intent时且在 onResume 之前,将调用此方法。无论Activity是否位于前台,这都会触发。我还将这个新的Intent设置为带有 setIntent 的Activity Intent,否则,最初初始化我的Activity的Intent将由 getIntent()调用。