android7:通知直接回复

第一步, 我们需要创建一个RemoteInput

第二步, 创建一个PendingIntent, 这个PendingIntent指当我们点击”发送”的时候调用什么

第三步, 创建一个直接回复的Action

第四步, 创建notification

第五步, 发送通知

一共5个步骤我们就可以创建一个带有”直接回复”功能的通知了, 而且这5步里2,4,5应该是我们熟悉的代码, 下面我们就来一步步的完成代码.

首先, 创建RemoteInput

RemoteInput remoteInput =newRemoteInput.Builder(RESULT_KEY)        .setLabel("回复这条消息")        .build();

1

2

3

1

2

3

很简单的一个builder, 首先Builder的构造我们需要一个String类型的key, 这个key是干嘛用的? 其实就是我们方便在处理回复的时候拿内容的. 其次一个setLabel方法, 可以对照着上面的图来看看这是哪一部分的内容, 说白了, 这其实就是一个EditTextHint值.

接下来继续第二步, 创建一个PendingIntent, 这个PendingIntent在这里的作用是启动一个service,所以代码是这样的:

Intent intent =newIntent(this, SendMsgService.class);PendingIntent pi = PendingIntent.getService(this,1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

1

2

1

2

都是大家熟悉的代码, 我们接着来看第三步, 创建一个直接回复的Action

NotificationCompat.Action act =newNotificationCompat.Action.Builder(R.mipmap.ic_launcher,"回复", pi)        .addRemoteInput(remoteInput).build();

1

2

1

2

又是一个Builder, 这个Builder的构造中有三个参数, 第一个参数是一个logo, 搞过通知的朋友肯定对通知的logo都很熟悉了, 第二个参数是这个Action的标签, 对应上面demo中我们要点击的那个按钮, 第三个参数是当我们点击”回复”的时候要干嘛. 接下来一个addRemoteInput方法将上面我们创建的RemoteInput传递进来.

第四步, 创建一个notification, 这个过程中大家都知道也是一个builder, 不过这个builder中肯定有我们不熟悉的方法, 要们上面的Action怎么设置呢?

NotificationCompat.Builder builder =newNotificationCompat.Builder(this)        .setSmallIcon(R.mipmap.ic_launcher)        .setContentTitle("请问是否需要信用卡?")        .setContentText("您好,我是XX银行的XX经理, 请问你需要办理信用卡吗?")        .setColor(Color.CYAN)        .addAction(act)        .setCategory(Notification.CATEGORY_MESSAGE);

1

2

3

4

5

6

7

1

2

3

4

5

6

7

从上往下一个个的来, 略…略…略…,setColor方法的作用是设置一个accent颜色, 对应上面的demo就是那个”回复”和点击”回复”后输入框的背景颜色.addAction方法就是将我们上面创建的Action设置进来,setCategory是指定通知的类型, 这里我们指定为消息类型.

最后一步, 发送通知

NotificationManager nm = getSystemService(NotificationManager.class);

nm.notify(NOTIFICATION_ID, builder.build());

1

2

1

2

没撒好说的, 就这样简单的几步, 一个具有”直接回复”功能的通知就发出来了, 不过还没完, 虽然通知出来了, 但是用户回复的内容我们还没处理. 这些逻辑的处理我们放到上面提到的那个service里执行.

那这个处理流程是怎样的呢? 还是先来罗列下流程.

拿到用户输入的内容

模拟发送的延迟

模拟发送成功, 取消通知

再次一步步的跟代码, 首先我们要拿到用户输入的内容, 我们可以通过RemoteInput的一个静态方法getResultsFromIntent直接拿到一个Bundle, 然后我们就可以根据上面构建RemoteInput的时候使用的key来拿到内容了.

Bundle replyBundle = RemoteInput.getResultsFromIntent(intent);if(replyBundle !=null) {// 根据key拿到回复的内容String reply = replyBundle.getString(MainActivity.RESULT_KEY);    reply(reply);}

1

2

3

4

5

6

1

2

3

4

5

6

拿到内容后, 我们就来模拟回复了, 这个操作是在reply方法中完成的.

privatevoidreply(finalString reply) {    mHandler.postDelayed(newRunnable() {@Overridepublicvoidrun() {            Log.d("reply","reply: "+ reply);            onReply();        }    },1000);}}

1

2

3

4

5

6

7

8

9

10

1

2

3

4

5

6

7

8

9

10

这里我们延迟1000ms后表示回复成功, 然后调用onReply方法.

privatevoidonReply() {finalNotificationManager nm = getSystemService(NotificationManager.class);    mHandler.post(newRunnable() {@Overridepublicvoidrun() {// 更新通知为“回复成功”Notification notification =newNotificationCompat.Builder(SendMsgService.this)                    .setSmallIcon(R.mipmap.ic_launcher)                    .setContentText("回复成功")                    .build();            nm.notify(MainActivity.NOTIFICATION_ID, notification);        }    });// 最后将通知取消mHandler.postDelayed(newRunnable() {@Overridepublicvoidrun() {            nm.cancel(MainActivity.NOTIFICATION_ID);        }    },2000);}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

在onReply里我们就来干剩下的事了, 包括发送一个”发送成功”的消息,然后延迟取消通知.

代码很简单, 主要的是创建直接回复的通知如何拿到用户输入的内容, 如果大家的APP中有这样的需求, 可以考虑在适配Android7的时候加入直接回复的功能.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容