为什么它对于一个方法说“弃用”是唯一可以用于所选API级别的方法?

时间:2012-12-10 19:31:39

标签: android sdk

在我的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,而不是高等级的......

5 个答案:

答案 0 :(得分:4)

  

那么,为什么我得到了被弃用的警告,即使它是唯一可以和应该使用的警告?

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

  

有人可能会认为警告/文档应该适应minSdkLevel,而不是高等级的

在这种情况下,一个是不正确的。弃用与minSdkVersion无关,比在Android之外的标准Java中有所不同(存在弃用且minSdkVersion不存在)。

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

答案 1 :(得分: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

答案 2 :(得分: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());
    }
}

答案 3 :(得分: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(“弃用”)。

答案 4 :(得分:1)

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

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

通过这种方式,您可以享受通知的所有最新功能......