【发布时间】:2014-08-27 10:47:16
【问题描述】:
我对 Android GCM 和通知还很陌生。现在,我被困在如何当用户在通知中点击按钮时更新 sqlite
场景是
- 我的服务器会将 gcm 发送到 GCM 服务器
- GCM 服务器向设备发送消息
- IntentService 收到消息后,在本地 sqlite 中创建新的消息记录。
- 在通知栏中使用 2 个按钮“启动应用”、“标记为已读”和“关闭”创建新的通知视图
“启动应用”按钮很简单,每个教程都会展示如何使用 PendingIntent 启动新活动。但是对于“标记为已读”和“解雇”我不知道如何实现它(而且英语不是我的母语,我无法想出关键字来搜索答案......所以,抱歉,如果之前有人问过这个问题)
- 对于“标记为已读”按钮,我希望它调用服务或应用程序子类来更新 sqlite,然后取消通知而无需启动活动
- 对于“关闭”按钮,我希望它只是取消通知
这是有的代码
@Override
protected void onHandleIntent(Intent intent)
Notification.Builder builder = new Notification.Builder(this);
builder.setContentTitle("Title of the notification");
builder.setSmallIcon(R.drawable.notification_icon);
builder.setStyle(new Notification.BigTextStyle().bigText("The message that I want to show"));
builder.setAutoCancel(true);
Intent i1 = new Intent(this, MainActivity.class);
PendingIntent pi1 = PendingIntent.getActivity(this, UNIQUE_ID, i1, PendingIntent.FLAG_ONE_SHOT);
PendingIntent pi2 = null; // To mark as read, I don't how to write it yet.
PendingIntent pi3 = null; // To dismiss, I don't how to write it yet.
builder.addActon(R.drawable.launch_app_icon, "Launch app", pi1);
builder.addActon(R.drawable.mark_as_read_icon, "Mark as read", pi2);
builder.addActon(R.drawable.dismiss_icon, "Dismiss", pi3);
Notification notification;
if (DeviceHelper.getAndroidSDK() < 16) {
notification = builder.getNotification();
} else {
notification = builder.build();
}
NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(UNIQUE_ID, notification);
}
我也试过把pi2设置成这样
Intent i2 = new Intent(MyApp.USER_DISMISS_NOTIFICATION);
PendingIntent pi2 = PendingIntent.getBroadcast(this, UNIQUE_ID, i2, PendingIntent.FLAG_ON_SHOT);
然后在Application子类中收听本地广播
public final class MyApp extends Application {
public static final USER_DISMISS_NOTIFICATION = "UserDismissNotification";
public void onCreate() {
super.onCreate();
LocalBroadcastManager.getInstance(this).registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Local broadcast received, update database
}
}, new IntentFilter(USER_DISMISS_NOTIFICATION));
}
}
但是 BroadcastReceiver 的 onReceive 永远不会被调用。
欢迎提出建议,谢谢!
【问题讨论】:
标签: android-intent android-service android-notifications google-cloud-messaging android-pendingintent