8

在我的 Android 清单中,它说:

<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="16" />

但是当我编写这段代码时,最后的 getNotification 让我警告说该方法已“弃用”:

Notification myNotification = new Notification.Builder(appContext)
.setContentTitle("SIC")
.setContentText(tickerText)
.setWhen(when)
.setDefaults(Notification.DEFAULT_SOUND)
.setAutoCancel(true)
.setContentIntent(contentIntent)
.getNotification(); // <-- warning here

现在,问题是对于 API 级别 10,这是我正在开发的最低要求,getNotification 是唯一可以使用的。名为“build()”的较新方法适用于 API 级别 16。

那么为什么我会收到已弃用的警告,即使它是我唯一可以并且应该使用的警告呢?有人可能认为警告/文档应该适应 minSdkLevel,而不是 highets...

4

5 回答 5

4

那么为什么我会收到已弃用的警告,即使它是我唯一可以并且应该使用的警告呢?

因为您的构建目标是 API 级别 16 或更高,所以不推荐使用此方法。

有人可能认为警告/文档应该适应 minSdkLevel,而不是 highets

在那种情况下,一个是不正确的。弃用与 无关,与minSdkVersionAndroid 之外的标准 Java 无关(弃用存在和minSdkVersion不存在)。

此外,您应该使用 Android 支持包的版本Notification.Builder(称为NotificationCompat.Builder,因为 API 级别 10 中不存在本机版本,您的清单表明您正在尝试支持它。build()应该存在NotificationCompat.Builder并适用于您所需的所有 API 级别。

于 2012-12-10T19:39:48.837 回答
3

如果你想以“技术上正确”的方式来做,你会做类似的事情

Notification bldr = new Notification.Builder(appContext)
    .setContentTitle("SIC")
    .setContentText(tickerText)
    .setWhen(when)
    .setDefaults(Notification.DEFAULT_SOUND)
    .setAutoCancel(true)
    .setContentIntent(contentIntent);

Notification notif;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
    notif = bldr.getNotification() 
} else {
    notif = bldr.build();
}

然后用 注释该方法TargetApi(16)。这就是您通常处理这些类型问题的方式。

在您的情况下,您应该只NotificationCompat.Builder在兼容性包中使用。

于 2012-12-10T19:44:35.880 回答
3

这是一个如何使用NotificationCompat类创建通知的示例,所有 API 都支持

public static void createNotificacion(Context ctx) {
    try {
        int smallIcon = R.drawable.ic_launcher;
        Bitmap largeIcon = BitmapFactory.decodeResource(ctx.getResources(),R.drawable.ic_launcher);
        long when = System.currentTimeMillis();
        CharSequence contentTitle = "Jorgesys";
        CharSequence contentText = "Hello Stackoverflow!!!";
        Intent notificationIntent = new Intent();
        /*create new task for each notification with pending intent so we set Intent.FLAG_ACTIVITY_NEW_TASK */
        PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 0, notificationIntent, Intent.FLAG_ACTIVITY_NEW_TASK);
        /*get the system service that manage notification NotificationManager*/
        NotificationManager notificationManager =(NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); 
        /*build the notification*/
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(ctx)
        .setWhen(when)
        .setContentText(contentText)
        .setContentTitle(contentTitle)
        .setSmallIcon(smallIcon)
        .setAutoCancel(true)
        .setTicker(contentTitle)
        .setLargeIcon(largeIcon)
        .setContentIntent(pendingIntent);
        /*sending notification to system. Here we use unique id (when)for making different each notification
         * if we use same id, then first notification replace by the last notification*/
        notificationManager.notify((int) when, notificationBuilder.build()); 
    } catch (Exception e) {
                Log.e("Notification Exception", e.getMessage());
    }
}
于 2013-09-10T22:16:46.437 回答
1

我相信该警告与您使用较新的 SDK 构建的事实有关(由于您的 targetSDKVersion 更高)。因此,您实际上可以使用较新的方法,但在使用时需要小心,因为低于目标 API 级别但高于最低 API 级别的设备将无法使用较新的 API。您可以在使用较新的调用之前检查 API 级别,但可以安全地使用它们。

例如,如果您想在 minSDK 为 2.3 时使用 Android 4.1 方法,您可以执行以下操作:

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
    // API Specific code here
}

在这种情况下,警告无关紧要。您可以将 @SuppressWarnings("deprecation") 添加到类或方法中。

于 2012-12-10T19:34:43.910 回答
1

最好的办法是使用兼容性库并忘记这个问题:

http://developer.android.com/guide/topics/ui/notifiers/notifications.html

这样,您就可以享受通知的所有最新功能...

于 2012-12-10T19:41:04.720 回答