0

我有一个使用 Web 服务连接到服务器的 android 服务,该服务返回许多 json 对象,我想为每个对象运行通知,我做了所有这些但我有一个问题,即我只看到一个通知,甚至认为服务器正在发送两个对象。请看for循环,很明显我正在调用很多通知,为什么我只看到一个显示?

public class GetOffersService extends Service {

    @Override
    public void onCreate() {
        super.onCreate();
        Client client = new Client("http://" + Configuration.hostIP
                + ":8080/test2/ssssss/");
        String str = client.getBaseURI("offers");
        try {
            JSONArray json = new JSONArray(str);
            for (int i = 0; i < json.length(); i++) {
                JSONObject oneOffer = json.getJSONObject(i);
                int offerID = oneOffer.getInt("ID");
                String offerDescriptoin = oneOffer.getString("Description");
                String endDate = oneOffer.getString("EndDate");
                String startDate = oneOffer.getString("StartDate");
                JSONObject restaurant = oneOffer.getJSONObject("Restaurant");
                int restaruantID = restaurant.getInt("ID");
                String restaurantName = restaurant.getString("Name");
                Intent intent = new Intent(this, OfferNotification.class);
                PendingIntent pIntent = PendingIntent.getActivity(this, 0,
                        intent, 0);
                Uri soundUri = RingtoneManager
                        .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                        this).setSmallIcon(R.drawable.ic_launcher)
                        .addAction(R.drawable.ic_launcher, "call", pIntent)
                        .addAction(R.drawable.ic_launcher, "more", pIntent)
                        .addAction(R.drawable.ic_launcher, "add more", pIntent)
                        .setContentTitle("The Eattel")
                        .setContentText("New Offer!").setSound(soundUri);
                // Creates an explicit intent for an Activity in your app
                Intent resultIntent = new Intent(this, OfferNotification.class);

                TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);

                stackBuilder.addParentStack(OfferNotification.class);

                stackBuilder.addNextIntent(resultIntent);
                PendingIntent resultPendingIntent = stackBuilder
                        .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
                mBuilder.setContentIntent(resultPendingIntent);
                NotificationManager mNotificationManager = (NotificationManager) getSystemService(Signin.NOTIFICATION_SERVICE);

                mNotificationManager.notify(100, mBuilder.build());
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

}
4

3 回答 3

3

这是来自文档

public void notify (String tag, int id, Notification notification) 发布要在状态栏中显示的通知。如果您的应用程序已经发布了具有相同 id 的通知并且尚未取消,它将被更新的信息替换。

粗体部分解释了为什么在您的案例中只看到一个通知

所以,听起来很可能:

 mNotificationManager.notify(100, mBuilder.build());

是您代码中的缺陷。

用每个项目的一些不同的 id 替换 100。

 mNotificationManager.notify(someUniqueId, mBuilder.build());
于 2013-06-02T09:13:35.743 回答
3

请在此处阅读“堆栈通知”一章:http: //developer.android.com/design/patterns/notifications.html

如果您的应用在另一个相同类型的通知仍处于挂起状态时创建了通知,请避免创建全新的通知对象。相反,堆叠通知。

堆叠的通知构建了一个摘要描述,并允许用户了解有多少特定类型的通知处于待处理状态。

不:

在此处输入图像描述

做:

在此处输入图像描述

您可以使用扩展的摘要布局提供有关构成堆栈的各个通知的更多详细信息。这使用户可以更好地了解哪些通知正在等待处理,以及它们是否足够有趣,可以在相关应用程序中详细阅读。

在此处输入图像描述

于 2013-06-02T08:28:59.600 回答
0

如果您不想遵循指导方针,那取决于您,但那是非常可悲的。请三思而后行,并考虑我之前的回答。

请至少阅读文档

发布要在状态栏中显示的通知。如果您的应用程序已经发布了具有相同 id 的通知并且尚未取消,它将被更新的信息替换。

所以,听起来很可能:

 mNotificationManager.notify(100, mBuilder.build());

是您代码中的缺陷。

用每个项目的一些不同的 id 替换 100。

于 2013-06-02T08:42:52.340 回答