2012-12-10 5 views
8

W moim Android manifestu, to mówi tak:Dlaczego jest napisane "przestarzałe" dla metody, która jest jedyną, której mogę użyć dla wybranego poziomu interfejsu API?

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

ale kiedy piszę ten kodu spowoduje getNotification na koniec dostaje mi ostrzeżenie mówiąc, że metoda jest „przestarzała”:

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

teraz problem polega na tym, że dla poziomu API 10, dla którego rozwijam minimum, getNotification jest jedynym, którego można użyć. Nowsza metoda o nazwie "build()" dotyczy poziomu interfejsu API 16.

Dlaczego więc otrzymuję przestarzałe ostrzeżenie, mimo że jest to jedyne, czego mogę i powinniśmy użyć? Ktoś mógłby pomyśleć, że ostrzeżenie/docs powinny dostosować się do minSdkLevel, a nie do highhets one ...

Odpowiedz

4

Dlaczego więc otrzymuję przestarzałe ostrzeżenie, mimo że jest to jedyne, czego mogę i powinniśmy użyć?

Ponieważ celem kompilacji jest poziom interfejsu API 16 lub wyższy, w przypadku gdy ta metoda jest nieaktualna.

Można by pomyśleć, że ostrzeżenie/docs powinien dostosować się do minSdkLevel, a nie highets jeden

W takim przypadku, można by być nieprawidłowe. Wycofanie nie ma nic wspólnego z minSdkVersion, tak samo jak w standardowej Javie poza systemem Android (tam, gdzie istnieje wycofanie, a minSdkVersion nie).

Ponadto, należy używać wersji systemu Android Support Package dotyczącą Notification.Builder (tzw NotificationCompat.Builder, ponieważ rodzimy jeden nie istnieje w API Level 10, która swoją oczywisty wskazuje, że staramy się wspierać. build() powinny istnieć na NotificationCompat.Builder i działać na wszystkich żądanych poziomów API

+0

Nie, build został dodany w poziomie api 16: http://developer.android. com/reference/android/app/Notification.Builder.html # build() Dzięki za odpowiedź: =) – Ted

+0

@Ted: Proszę ponownie przeczytać ostatni akapit mojej odpowiedzi. Twój link w twoim komentarzu jest natywnym 'Notification.Builder', którego nie chcesz używać w tym przypadku. – CommonsWare

1

Uważam, że ostrzeżenie dotyczy faktu, że budujesz z nowszym SDK (ze względu na wyższą wartość targetSDKVersion) . Więc faktycznie możesz użyć nowszej metody, ale musisz zachować ostrożność podczas jej używania, ponieważ urządzenia znajdujące się poniżej docelowego poziomu interfejsu API, ale powyżej minimalnego poziomu API, nie będą działać z nowszym interfejsem API. Możesz sprawdzić poziom API przed korzystaniem z nowszych połączeń, aby bezpiecznie z nich korzystać.

Na przykład, jeśli chcesz korzystać z Android 4.1 metodę w czasie, gdy minSDK 2.3, można zrobić:

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

w tym przypadku ostrzeżenie nie ma znaczenia. Możesz dodać @SuppressWarnings ("wycofanie") do klasy lub metody.

3

Jeśli chciał zrobić to „technicznie poprawny” sposób, można zrobić coś takiego

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

A potem opisywanie metodę z TargetApi(16). Oto, jak ogólnie podejść do tego typu problemów.

W twoim przypadku powinieneś po prostu użyć NotificationCompat.Builder zamiast w pakiecie zgodności.

+0

Pójdę z tym podejściem =) – Ted

3

To jest przykład jak stworzyć zgłoszenie korzystając NotificationCompat klasy, dostępna we wszystkich API's

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()); 
    } 
} 
Powiązane problemy