代码之家  ›  专栏  ›  技术社区  ›  Nidhoegger

单击通知中的按钮时启动活动

  •  0
  • Nidhoegger  · 技术社区  · 6 年前

    目前我正在为我的应用程序生成一些通知。一个用例是,你收到一个朋友请求,我在通知中添加了两个按钮,如果需要,可以接受或拒绝来自通知的请求。这是我的代码:

        Context ctx = TheGameApplication.getAppContext();
    
        Intent intent = new Intent(ctx, LoginActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 0, intent, 0);
    
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(ctx, ctx.getString(R.string.default_channel_id))
                .setSmallIcon(R.drawable.thegame)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .setWhen(System.currentTimeMillis())
                .setSound(Uri.parse("android.resource://" + ctx.getPackageName() + "/" + R.raw.annoy1))
                .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE);
        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(ctx);
    
      // HERE is additional code that has nothing to do with the notification and thus is removed
    
                notify = !TheGameApplication.get_game_list_in_foreground();
                if (notify) {
    
                    Intent acceptIntent = new Intent(ctx, GameActivity.class);
                    acceptIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                    acceptIntent.setAction(ctx.getString(R.string.broadcast_accept));
                    acceptIntent.putExtra(ctx.getString(R.string.extra_notification_id), notificationId);
                    acceptIntent.putExtra(ctx.getString(R.string.extra_from_username), fromUsername);
                    PendingIntent acceptPendingIntent = PendingIntent.getBroadcast(ctx, 0, acceptIntent, 0);
                    mBuilder.addAction(R.mipmap.accept, "Accept", acceptPendingIntent);
    
                    Intent rejectIntent = new Intent(ctx, GameActivity.class);
                    rejectIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                    rejectIntent.setAction(ctx.getString(R.string.broadcast_reject));
                    rejectIntent.putExtra(ctx.getString(R.string.extra_notification_id), notificationId);
                    rejectIntent.putExtra(ctx.getString(R.string.extra_from_username), fromUsername);
                    PendingIntent rejectPendingIntent = PendingIntent.getBroadcast(ctx, 0, acceptIntent, 0);
                    mBuilder.addAction(R.mipmap.reject, "Reject", rejectPendingIntent);
    
                    mBuilder.setContentTitle("Friendship request");
                    mBuilder.setContentText(fromUsername + " wants to be your friend. Do you want to ruin your friendship?");
                }
    

    现在,什么事都不会发生 GameActivity 不是 BroadcastReceiver (但它有一个)。如果创建不带参数的AcceptIntent( Intent acceptIntent = new Intent(); )接收器内部 游戏活动 将收到操作,但活动不会激活。我需要做什么来创建一个按钮,像默认的点击通知,将启动该活动?

    1 回复  |  直到 6 年前
        1
  •  1
  •   jmart    6 年前

    似乎您正试图通过从通知操作发送广播来直接启动该活动,但它不是这样工作的。

    首先,您需要将广播发送到广播接收器(直接指向接收器类)。然后,一旦接收器接收到广播,您就在那里创建一个新的意图来开始活动。

    因此,假设你的接收器被称为“游戏接收器”,你可以创建这样的操作:

    Intent acceptIntent = new Intent(ctx, GameReceiver.class);
    acceptIntent.setAction(ctx.getString(R.string.broadcast_accept));
    acceptIntent.putExtra(ctx.getString(R.string.extra_notification_id),
        notificationId);
    acceptIntent.putExtra(ctx.getString(R.string.extra_from_username),
        fromUsername);
    PendingIntent acceptPendingIntent = PendingIntent.getBroadcast(ctx, 0,
        acceptIntent, 0);
    mBuilder.addAction(R.mipmap.accept, "Accept", acceptPendingIntent)
    

    请注意,您不需要在此处设置任务标志。在接收器上启动活动时必须执行此操作。

    然后,在“游戏接收器”中,您可以开始活动:

    Intent intent = new Intent(context, GameActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    context.startActivity(intent);
    

    如果我理解正确,你的接收者在活动中作为一个内部类生存。这通常会导致混淆(如果内部类不是静态的,则会导致其他类型的错误)。我建议把接收器放在自己的文件中。