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

在应用程序关闭时单击通知按钮打开活动

闻人献
2023-03-14

当用户在我的通知中单击一个按钮时,我正试图打开main活动,而该应用程序仅在后台运行并提供服务。单击按钮时,这些行在服务类中被触发:

Intent openApp = new Intent(this, MainActivity.class);
openApp.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(openApp);

我已经检查过了,这些行被触发了,所以对按钮的点击做出反应没有问题,但是Activity不会打开。

有什么建议吗?为什么这对我不起作用,我怎么能让它起作用?

我被要求提供更多的代码,因此在我的服务中的onStartCommand()中,如果它在其意图内以停止操作开始,我调用killService()方法,该方法会终止服务,启动main活动,并执行其他一些操作:

if (action != null && action.equals(ACTION_STOP_SERVICE)) {
    killService();
}

要设置通知s按钮,我使用以下代码:

Intent stopActionIntent = new Intent(this, TimerService.class);
        stopActionIntent.setAction(ACTION_STOP_SERVICE);
        PendingIntent stopActionPendingIntent = PendingIntent.getService(this, 1, stopActionIntent, PendingIntent.FLAG_IMMUTABLE);

timerNotificationBuilder.addAction(R.drawable.stop, "Stop", stopActionPendingIntent);

正如我所说,这个按钮已经对用户点击它做出了反应,所以这不是问题所在。


共有2个答案

壤驷向明
2023-03-14

我找到了!看看这个答案
这个答案建议启用ScreeanOverlay设置,因为从Android10及更高版本开始,你再也不能仅仅通过调用我使用的线路从后台打开活动
要使其工作,您必须通过清单添加此权限。xml

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

然后用户必须在其他应用程序上启用显示设置
我搜索了一个选项,让用户更容易地使用这个设置,并找到了这个答案
这个答案给出了一个代码,可以将用户重定向到其他应用程序上的显示设置

if (!Settings.canDrawOverlays(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 0);
}

然后我用通知的内容(文本)指导用户如何启用设置。
启用设置后,我在工作前使用的行。\

问题解决了吗?

上面描述的整个配置都可以工作,但前提是应用程序没有被杀死。
如果应用程序被杀死并且我尝试上面列出的方法,该应用程序将加入最近的应用程序列表,但不会打开并显示。
解决此问题的解决方案也将被接受为答案而不是此答案。

商和颂
2023-03-14

您可以尝试在广播接收器中接收单击,然后从那里打开活动。

  1. 尝试此操作可在通知中添加操作按钮:
timerNotificationBuilder.addAction(createNotificationActionButton("STOP");

其中,createNotificationActionButton方法如下:

public NotificationCompat.Action createNotificationActionButton(String text){
        Intent intent = new Intent(this, StopwatchNotificationActionReceiver.class);

        @SuppressLint("InlinedApi") PendingIntent pendingIntent = PendingIntent.getBroadcast(this, new Random().nextInt(100), intent, PendingIntent.FLAG_IMMUTABLE);

        return new NotificationCompat.Action(0, text, pendingIntent);
    }
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class StopwatchNotificationActionReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        PrefUtil.setIsRunningInBackground(context, false);
        PrefUtil.setTimerSecondsPassed(context, 0);
        PrefUtil.setWasTimerRunning(context, false);
        context.stopService(MainActivity.serviceIntent);
        Intent activityIntent = new Intent(context, MainActivity.class);
        activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActvity(activityIntent);
    }
}

您还需要在清单中注册该接收器,如下所示:

<receiver android:name="StopwatchNotificationActionReceiver"/>
public static Intent serviceIntent;

并且此意图仅用于像这样启动服务:

//In onCreate
serviceIntent = new Intent(this, TimerService.class);

//In onPause
PrefUtil.setTimerSecondsPassed(this,seconds);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                startForegroundService(serviceIntent);
            }

或者你可以尝试一下简单的方法:

if (action != null && action.equals(ACTION_STOP_SERVICE)) {
    Context context = this;
    Intent activityIntent = new Intent(context, MainActivity.class);
        activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActvity(activityIntent);
    killService();
}

另一个解决方案是。再一次你需要参考我的回购协议,因为我已经对文件进行了更改,以便完成你的任务。在服务类中,参考此方法。在那里,如果动作被重置(r),我就开始活动。否则,它会打开广播接收器。然后,在活动中,我在onResume()方法中收到了额外的信息。如果未单击重置按钮,则会打开Receiver类。

和往常一样,你可以在这里查看应用程序的结果。

我希望代码能帮你完成工作。

 类似资料:
  • 点击通知按钮后如何关闭状态栏? 我试过了,但有个例外: 我的代码: 在NotificationIntent类

  • 点击按钮时,Firebase Auth不会在上启动。 它仅在重新打开应用程序时有效。 出了什么问题?

  • 我正在我的应用程序中实施谷歌云消息服务(GCM)。我使用gcmIntent服务创建了一个挂起的意图并打开了一个不是启动活动的活动。当应用程序打开时,它工作正常。但当应用程序关闭时,它会打开启动活动而不是所需的活动。我尝试了我能找到的所有解决方案,但都不起作用。我挣扎了一个多星期。任何帮助都将不胜感激。 我的代码 我得到下面的堆栈跟踪

  • 我知道这个问题似乎重复,但为了我的要求,我已经在网上搜索了很多帖子,但没有一个对我有效。 我的要求 为此,我尝试了以下场景 情景1 使用将通知数据从传输到Launcher/Main活动,并根据bundle数据重定向到特定活动/片段 情景3 通过使用 按照上面的场景,当应用程序打开时,一切工作都很好,但如果我的应用程序关闭了,则意味着它总是重定向到main/launcher活动

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

  • 我实际上正在处理需要推送通知的Xamarin Forms应用程序。我使用 Plugin.PushNotification 插件。 当应用程序在前台运行或处于睡眠状态(OnSap)时,当我单击收到的通知时,打开特定页面没有问题。但我想知道当应用程序关闭时如何做到这一点。谢谢!