通过服务的Android通知

时间:2016-04-12 18:36:15

标签: android push-notification android-notifications

我有一个通知系统工作,然后服务就是草拟,通知工作正常。

我有一些需要用户输入/操作的通知。

以下是构建通知的代码:

public int onStartCommand(Intent intent, int flag, int startId)
{
    super.onStartCommand(intent , flag, startId);

    Uri uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    Context context = this.getApplicationContext();
    notificationManager = (NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE);
    Intent mIntent = new Intent(this, MainActivity.class);
    pendingIntent = PendingIntent.getActivity(context, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    Notification builder = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN ) {           
        builder = new Notification.Builder(this)
                .setContentTitle(Utils.Title)
                .setContentText(Utils.Body)
                .setSmallIcon(R.drawable.ic_launcher)
                .addAction(0, Utils.button1Value, pendingIntent)
                .addAction(0, Utils.button2Value, pendingIntent)
                .setSound(uri)
                .setContentIntent(pendingIntent)
                .build();

    }

    notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    notificationManager.notify(Utils.NotificationID, builder);     

    return START_STICKY;

我的问题是:如何点击通知用户中的哪个按钮?换句话说,如何为通知中的这2个操作创建某种按钮侦听器?

另外,如何堆叠我的通知,使它们看起来不是全部分开?我已经阅读了Google API,我需要使用.setGroup,但这不起作用。 任何人都可以分享一些通知堆叠的例子吗?

**********已添加*************

final static String GROUP_KEY = "myGroup"; // added String to identify the group

public int onStartCommand(Intent intent, int flag, int startId)
{
super.onStartCommand(intent , flag, startId);

Uri uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

Context context = this.getApplicationContext();
notificationManager = (NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE);
Intent mIntent = new Intent(this, MainActivity.class);
pendingIntent = PendingIntent.getActivity(context, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Notification builder = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN ) {           
    builder = new Notification.Builder(this)
            .setContentTitle(Utils.Title)
            .setContentText(Utils.Body)
            .setSmallIcon(R.drawable.ic_launcher)
            .setGroup(GROUP_KEY)  // added group for Stacking
            .addAction(0, Utils.button1Value, pendingIntent)
            .addAction(0, Utils.button2Value, pendingIntent)
            .setSound(uri)
            .setContentIntent(pendingIntent)
            .build();

}

notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(0, builder);    // ID is always the same because the notifications are all stacking into one, tried with unique ID not working either

return START_STICKY;

1 个答案:

答案 0 :(得分:2)

  1. 对于按钮侦听器问题:
  2. 通知操作将触发pendingIntent,因此只需将自定义意图放入其中即可。每个文本都应该有一个不同的pendingIntent,以便您可以区分它。

    public int onStartCommand(Intent intent, int flag, int startId) {
        //...... 
        Intent mIntent1 = new Intent(this, MainActivity.class);
        mIntent1.setAction("clickAc1");
        PendingIntent pendingIntent1 = PendingIntent.getActivity(context, 0, mIntent1, PendingIntent.FLAG_UPDATE_CURRENT);
    
        Intent mIntent2 = new Intent(this, MainActivity.class);
        mIntent2.setAction("clickAc2");
        PendingIntent pendingIntent2 = PendingIntent.getActivity(context, 0, mIntent2, PendingIntent.FLAG_UPDATE_CURRENT);
    
        Intent it = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, it, PendingIntent.FLAG_UPDATE_CURRENT);
    
        Notification builder = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
            builder = new Notification.Builder(this)
                    .setContentTitle("Title")
                    .setContentText("Text")
                    .setSmallIcon(R.drawable.your_logo)
                    .addAction(0, "ac1", pendingIntent1)
                    .addAction(0, "ac2", pendingIntent2)
                    .setSound(uri)
                    .setContentIntent(pendingIntent)
                    .build();
    
        }
    

    当用户点击文字ac1时,您可以在MainActivity(或其他您想要的背景下)处理它。

    //MainActivity
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.d("probe","onNewIntent:"+intent.getAction());
        //response your click event by case intent.getAction(), 
        //it will be `clickAc1` or `clickAc2`, the string you write down in intent.setAction
    }
    

    如果您使用自定义RemoteView,可以按照以下步骤操作:

        Intent intent = new Intent("Your Custom intent string, like com.yourpackage.ClickButtonXXX");
        pendingIntent = PendingIntent.getService(getApplicationContext(),
            yourRequestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    
        mRemoteViews.setOnClickPendingIntent(R.id.yourViewId, pendingIntent);
    

    然后您可以使用覆盖Service.onStartCommand(Intent intent, int flags, int startId),案例intent.getAction();来回复它,以区分不同的按钮。

    1. 堆叠讯息:
    2. 我在notification history article中找到了这个:

      .setGroup(GROUP_KEY_MESSAGES)  // added group for Stacking
      .setGroupSummary(true)
      .setContentTitle(count+" new notes")
      .setStyle(new NotificationCompat.BigTextStyle().setSummaryText(count+" more"))
      .build();
      
      count++;
      

      如果您使用Notification,请将NotificationCompat.BigTextStyle()更改为Notification.BigTextStyle()

      我认为这可能就是你想要的。

      汇总通知作弊