2012-12-10 1 views
8

In meinem Android-Manifest, sagt es so:Warum heißt es "veraltet" für eine Methode, wenn es die einzige ist, die ich für die ausgewählte API-Ebene verwenden kann?

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

aber wenn ich diesen Code zu schreiben, wird die getNotification am Ende Warnung mir sagen, dass die Methode wird als "veraltet":

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

Jetzt Das Problem ist, dass für API-Level 10, welches das Minimum ist, für das ich mich entwickle, getNotification die einzige ist, die es zu verwenden gilt. Die neuere Methode namens "build()" ist für API-Ebene 16.

Also warum bekomme ich die veraltete Warnung obwohl es die einzige ist, die ich verwenden kann und sollte? Man könnte denken, dass sich die Warnung/Dokumente an den minSdkLevel anpassen sollten, nicht an die hohen Werte ...

Antwort

4

Warum bekomme ich die veraltete Warnung, obwohl es die einzige ist, die ich verwenden kann und sollte?

Da Ihr Build-Ziel API-Level 16 oder höher ist, ist diese Methode veraltet.

Man könnte meinen, dass die Warnung/docs auf die minSdkLevel anpassen sollte, nicht die highets ein

In diesem Fall würde man falsch. Mit minSdkVersion hat Deprecation nichts mehr zu tun, als es in Standard-Java außerhalb von Android der Fall wäre (wo eine Abwertung existiert und minSdkVersion nicht).

Darüber hinaus sollten Sie das Android-Support-Paket Version von Notification.Builder (genannt NotificationCompat.Builder verwenden, da die native eines in API-Ebene existiert nicht 10, das Manifest zeigt an, dass Sie zu unterstützen versuchen. build() sollte auf NotificationCompat.Builder existieren und arbeiten auf alle gewünschten API-Ebenen

+0

Nein, wurde in api Level 16 Build hinzugefügt: http://developer.android. com/reference/android/app/Notification.Builder.html # build() Danke für die Antwort though =) – Ted

+0

@Ted: Bitte lesen Sie den letzten Absatz meiner Antwort. Ihr Link in Ihrem Kommentar bezieht sich auf den systemeigenen 'Notification.Builder', den Sie in diesem Fall nicht verwenden möchten. – CommonsWare

1

Ich glaube, die Warnung bezieht sich auf die Tatsache, dass Sie mit einem neueren SDK bauen (weil Ihre targetSDKVersion höher ist) . Sie können also die neuere Methode verwenden, müssen jedoch vorsichtig sein, da Geräte, die unter der Ziel-API-Ebene, aber über der Mindest-API-Ebene liegen, nicht mit der neueren API funktionieren. Sie können die API-Ebene überprüfen, bevor Sie die neueren Aufrufe verwenden, um sie sicher zu verwenden.

Zum Beispiel, wenn Sie eine Android-4.1-Methode, während der minSDK 2.3 verwenden wollen, könnten Sie tun:

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

In diesem Fall wird die Warnung keine Rolle spielt. Sie können der Klasse oder Methode ein @SuppressWarnings ("Deprecation") hinzufügen.

3

Wenn Sie die „technisch korrekt“ Art und Weise tun wollen, dann würden Sie so etwas wie

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(); 
} 

tun und dann wird das Verfahren mit TargetApi(16) mit Anmerkungen versehen. So nähern Sie sich im Allgemeinen diesen Arten von Problemen. In Ihrem Fall sollten Sie stattdessen NotificationCompat.Builder im Kompatibilitätspaket verwenden.

+0

Ich werde mit diesem Ansatz gehen =) – Ted

3

Dies ist ein Beispiel, wie eine Benachrichtigung mit NotificationCompat Klasse zu erstellen, in allen API? S unterstützt

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()); 
    } 
}