Android : 通知在 2.3.6 (Samsung Galaxy y) 上不起作用

Posted

技术标签:

【中文标题】Android : 通知在 2.3.6 (Samsung Galaxy y) 上不起作用【英文标题】:Android : Notification not working on 2.3.6 (Samsung galaxy y) 【发布时间】:2013-02-07 07:56:02 【问题描述】:

已确认以下代码可在运行 HONEYCOMB+ 的设备上正常工作。但是在三星 Galaxy Y 上,它不会产生任何通知。

        String tickerText = userString + " Download Queued";
        Notification notification =  new NotificationCompat.Builder(this).setAutoCancel(true)
                                                .setContentTitle(userString)
                                                .setContentText("Queued")
                                                .setSmallIcon(R.drawable.stat_sys_download_done)
                                                .setWhen(System.currentTimeMillis())
                                                .setTicker(tickerText)
                                                .build();
        if(DBG_ENABLE) 
            LogUtils.logD(TAG_LOG, "Posting queue notification : " + 0);
        
        NotificationManager notificationManager =
                (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE);
        notificationManager.notify(0, notification);

注意:

我在日志中看到“发布队列通知”。 我已将可绘制的 stat_sys_download_doneandroid sdk 复制到我的项目中。

我想不出调试此问题的方法。我不确定我是否缺少任何东西。任何解决此问题的建议表示赞赏。

【问题讨论】:

看起来不错。在 2.3 模拟器上试一试。 【参考方案1】:

按照 CommonsWare 的建议,我在 2.3 模拟器上运行了该应用程序,但它崩溃了。未设置 ContentIntent 的原因。 GingerBread 需要一个 ContentIntent。所以我添加了一个虚拟的待处理意图,例如:

            PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT);
            Notification notification =  new NotificationCompat.Builder(this).setAutoCancel(true)
                                            .setContentTitle(userString)
                                            .setContentText("Queued")
                                            .setContentIntent(pi)
                                            .setSmallIcon(R.drawable.stat_sys_download_done)
                                            .setWhen(System.currentTimeMillis())
                                            .setTicker(tickerText)
                                            .build();

【讨论】:

谢谢。我不知道 Gingerbread 和 ContentIntent【参考方案2】:

你也可以这样做。它适用于 2.3 和 2.3+

 Notification notification = new NotificationCompat.Builder(this)
        .setTicker("new notification")
        .setContentTitle("title")
        .setContentText("hello").setSmallIcon(R.drawable.ic_launcher)
        .setContentIntent(pendingIntent)
    .addAction(android.R.drawable.ic_media_play, "play",pendingIntent).build();

【讨论】:

【参考方案3】:

当我尝试上述解决方案时,它使应用程序崩溃,只是声明了空的 PendingIntent,如图所示。确定我遇到了范围问题,因为我在 BroadcastListener 中编写此通知,我将挂起的意图移动到侦听器的 onReceive 方法中,并使用传入的上下文和意图而不是虚拟对象。这在我的 2.3.6 Galaxy 手机中完美运行。这是我的代码:

BroadcastReceiver sitInReceiver = new BroadcastReceiver() 
        @Override
            public void onReceive(Context context, Intent intent) 
                String target = intent.getStringExtra("target");
                ....
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            notifB.setContentIntent(pi);

            NotificationManager mNotificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            int nmId=1;
                // mId allows you to rewrite the same the notification or make a different one.
            mNotificationManager.notify(nmId, notifB.build());
        

请注意,我在声明所有非动态数据的侦听器之外声明了构建器 notifB:

NotificationCompat.Builder notifB = new NotificationCompat.Builder(this)
    .setSmallIcon(R.drawable.ic_launcher) 
    .setAutoCancel(true);

【讨论】:

以上是关于Android : 通知在 2.3.6 (Samsung Galaxy y) 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Unity 2018 Game Development in 24 Hours Sams Teach Yourself 3rd Edition

Android Touch事件相关源码Android SourceCode 2.3.6

如何解析 Firebase 对象(JSON 对象)

如何通过 android 2.3.6 中的联系人提供者获取联系人照片?

Android常见界面布局

android前台服务以及通知