【问题标题】:PendingIntent to update sqlitePendingIntent 更新 sqlite
【发布时间】:2014-08-27 10:47:16
【问题描述】:

我对 Android GCM 和通知还很陌生。现在,我被困在如何当用户在通知中点击按钮时更新 sqlite

场景是

  1. 我的服务器会将 gcm 发送到 GCM 服务器
  2. GCM 服务器向设备发送消息
  3. IntentService 收到消息后,在本地 sqlite 中创建新的消息记录。
  4. 在通知栏中使用 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


    【解决方案1】:

    我让它如下工作

    A.创建广播接收器

    public class NotificationReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
          Log.i("Dev", "Received");
        }
    }
    

    B.注册接收到应用程序对象**

    <application
        android:name="com.example.app"
        android:icon="@drawable/ic_launcher"
        android:label="@string/application_name"
        android:theme="@android:style/Theme.Holo.NoActionBar"
        android:hardwareAccelerated="true" >
    
        <activity
            android:name="com.example.app.MainActivity" />
    
        <receiver android:name="com.example.NotificationReceiver" /> 
    </application>
    

    C.如下创建待处理意图并将其添加到通知中

    Intent i = new Intent(this, NotificationReceiver.class);
    PendingIntent pi = PendingIntent.getActivity(this, UNIQUE_ID, i, PendingIntent.FLAG_ONE_SHOT);
    
    notification.addAction(R.drawable.button_icon, "Do something", pi);
    

    现在,当用户点击按钮时,NotifiationReceiver 的 onReceive 将被调用,然后我可以更新数据库、启动活动或基于意图包的参数。

    希望有帮助

    【讨论】:

    • 如果你想向广播接收者发送意图,你应该使用 PendingIntent.getBroadcast 方法而不是 PendingIntent.getActivity
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多