点击通知时Activity中的触发方法

Posted

技术标签:

【中文标题】点击通知时Activity中的触发方法【英文标题】:Trigger Method in Activity when Notification is tapped 【发布时间】:2019-11-16 05:09:13 【问题描述】:

我的应用反复从服务器加载数据。这些数据中有消息。 每当加载新消息时,都会在接口的回调方法 onMessagesReceived(int numOfMessages) 上调用 MainActivity。 该应用程序只有一个 Activity,每个屏幕都实现为 Fragment。片段的切换由专用的 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();
            
        
    

此时,MainActivity 显示,当应用程序处于后台时,但在 onResume 中,Bundle 返回为 null。 当应用程序在前台时,什么都不会发生。

我想实现点击Notification: - 当用户在应用程序内时,应该打开 MessageList Fragment - 当用户不在应用内时,应在打开MessageList Fragment之前启动

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

【问题讨论】:

【参考方案1】:

您可以使用意图,只需在意图中添加一些布尔附加值,然后检查主要活动中的值,如果该附加值为真,然后调用您的方法。

【讨论】:

你是对的,但最后没关系,如果我添加一个布尔值或一个字符串作为额外的。只要在 Activity 已经显示的情况下我无法获得额外的东西,我就无法对任何额外的东西做出反应。【参考方案2】:

在对 Intents 和 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 是否在前台,这都会触发。我还用 setIntent 将这个新 Intent 设置为活动 Intent,否则最初启动我的 Activity 的 Intent 将由 getIntent() 调用。

【讨论】:

以上是关于点击通知时Activity中的触发方法的主要内容,如果未能解决你的问题,请参考以下文章

在Android中打开Activity而不点击通知

如果列表中没有项目(通知),则切换div

当用户点击通知时,Activity 没有打开

Android - 点击时 Firebase 通知会打开一个 Activity

Android 通知:使用多个 PendingIntents 点击按钮时打开 Activity 并运行 BroadcastReceiver

单击服务生成的通知时,即使已经打开,主 Activity 也会再次打开