当前位置: 首页 > 知识库问答 >
问题:

Android通知:点击按钮开始活动

裴俊能
2023-03-14

我想在记录器服务运行时显示通知。用户应该能够在通知中直接暂停或停止记录器。所以我在通知中添加了两个按钮,并实现了一个BroadcastReceiver来处理按钮点击。

它几乎像我想要的那样工作,但有一个问题我无法解决。当用户单击按钮时,我想显示活动。这是我的代码:

private void showNotification() {
    int requestID = (int) System.currentTimeMillis();

    IntentFilter filter = new IntentFilter();
    filter.addAction("STOP_RECORDING");
    filter.addAction("PAUSE_RECORDING");
    filter.addAction("SHOW_ACTIVITY");

    this.broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (intent.getAction()) {
                case "STOP_RECORDING": onStopClick(); break;
                case "PAUSE_RECORDING": onPauseClick(); break;
                case "SHOW_ACTITIVY": break;
                default: Log.i(T, "UNKNOWN ACTION IN NOTIFICATION INTENT");
            }
        }
    };

    Intent stdIntent = new Intent(getApplicationContext(), MyActivityClass.class);
    stdIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), requestID, stdIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent intent1 = new Intent();
    intent1.setAction("STOP_RECORDING");
    PendingIntent stopIntent = PendingIntent.getBroadcast(getApplicationContext(), requestID, intent1, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent intent2 = new Intent();
    intent2.setAction("PAUSE_RECORDING");
    PendingIntent pauseIntent = PendingIntent.getBroadcast(getApplicationContext(), requestID, intent2, PendingIntent.FLAG_UPDATE_CURRENT);



    NotificationCompat.Builder notificationBuilder;

    notificationBuilder = new NotificationCompat.Builder(this);
    // ... configure notification (title, text, icon)
    notificationBuilder.addAction(R.drawable.ic_pause_white_48dp, "Pause", pauseIntent);
    notificationBuilder.addAction(R.drawable.ic_stop_white_48dp, "Stop", stopIntent);

    registerReceiver(this.broadcastReceiver, filter);
    ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).notify(this.notificationID, notificationBuilder.build());
}

目前执行每个按钮的正确操作,但如果用户单击时应用程序不可见,则不显示该应用程序。如何实现这一点?

有必要在这里实现BroadcastRecencer吗?是否有可能使用getActivity而不是getBroadcast并确定以另一种方式单击了哪个按钮?

共有1个答案

戚学文
2023-03-14

好的,我找到了一个更简单、更有效的解决方案。不需要BroadcastRecencer,我只是在我的意图中添加额外的信息并在NewIntent中阅读它们。

我的代码如下所示:

public void onNewIntent(Intent intent) {
    String action = intent.getStringExtra("_ACTION_");

    if(action != null) {
        switch (action) {
            case "STOP_RECORDING": onStopClick(); break;
            case "PAUSE_RECORDING": onPauseClick(); break;
            default: Log.i(T, "UNKNOWN ACTION IN NOTIFICATION INTENT");
        }
    }
}

private void showNotification() {
    int requestID = (int) System.currentTimeMillis();

    Intent stdIntent = new Intent(getApplicationContext(), MyActivity.class);
    stdIntent.putExtra("_ACTION_", "test_dummy_value");
    stdIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), requestID, stdIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent intent1 = new Intent(getApplicationContext(), MyActivity.class);
    intent1.setAction("STOP_RECORDING");
    intent1.putExtra("_ACTION_", "STOP_RECORDING");
    intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    PendingIntent stopIntent = PendingIntent.getActivity(getApplicationContext(), requestID, intent1, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent intent2 = new Intent(getApplicationContext(), MyActivity.class);
    intent2.putExtra("_ACTION_", "PAUSE_RECORDING");
    intent2.setAction("PAUSE_RECORDING");
    intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    PendingIntent pauseIntent = PendingIntent.getActivity(getApplicationContext(), requestID, intent2, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder notificationBuilder;

    notificationBuilder = new NotificationCompat.Builder(this);
    // ... irrelevant code
    notificationBuilder.addAction(R.drawable.ic_pause_white_48dp, "Pause", pauseIntent);
    notificationBuilder.addAction(R.drawable.ic_stop_white_48dp, "Stop", stopIntent);

    ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).notify(this.notificationID, notificationBuilder.build());
}

有人能告诉我这是实现我目标的最好方式吗?我是Android编程新手,希望正确地学习它:-)

 类似资料:
  • 我已经用远程视图定制了一个通知,视图包含布局和两个按钮,我想要的是当用户点击一个名为“contentLayout”的布局时,活动“Test”将被打开,当用户点击按钮,“remindTenMinButton”或“remindLaterButton”时,操作“Test2”将启动。现在的问题是活动“Test”启动正确,但对于活动“Test2”,当我单击通知栏中的按钮时,似乎什么都没有发生,但当我单击“b

  • 当用户在我的通知中单击一个按钮时,我正试图打开,而该应用程序仅在后台运行并提供服务。单击按钮时,这些行在类中被触发: 我已经检查过了,这些行被触发了,所以对按钮的点击做出反应没有问题,但是不会打开。 有什么建议吗?为什么这对我不起作用,我怎么能让它起作用? 我被要求提供更多的代码,因此在我的

  • 我有一个带有通知的应用程序,如果我单击它们,就会打开某个活动。我想要的是,如果我点击通知,活动已经打开,它不是重新开始,但只是出现在前面。 我可以用标志来管理它吗?还是我应该在SharedPreferences中存储一个变量来检查它是否已打开? 谢谢!

  • 在我的应用程序中,我有一个通知要显示。 比方说,当显示通知时,我想按“是”进入活动并隐藏通知,按“否”什么都不做只是隐藏通知。 我尝试了这段代码,但是onclick不是onclckpendingent,我不能做任何我想做的事情。 我怎么能这样做?

  • 如果这个解决方案是错误的,如何处理这些点击和设置监听器? PS:请不要告诉我。

  • 下面是我的代码,它设置了一个通知,即用户是通过zoom服务被bieng调用的。但是,如果用户不点击通知,而是直接点击应用程序图标,则无法正确捕获额外内容。我对如何从简历中的这个悬而未决的意图中提取额外的内容有点迷茫。 notificationcompat.builder mBuilder=new notificationcompat.builder(this);//构建新的通知mbuilder.s