2017-06-20 43 views
5

Próbuję uruchomić usługę pierwszego planu. Otrzymuję powiadomienie, że usługa się uruchamia, ale powiadomienie jest zawsze blokowane. Sprawdziłem dwukrotnie, czy aplikacja może wyświetlać powiadomienia w informacjach o aplikacji na moim urządzeniu. Tu jest mój kodu:Powiadomienie o usłudze pierwszego planu systemu Android nie wyświetlające się

private void showNotification() { 
    Intent notificationIntent = new Intent(this, MainActivity.class); 
    notificationIntent.setAction(Constants.ACTION.MAIN_ACTION); 
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
      | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, 
      notificationIntent, 0); 

    Bitmap icon = BitmapFactory.decodeResource(getResources(), 
      R.mipmap.ic_launcher); 

    Notification notification = new NotificationCompat.Builder(getApplicationContext()) 
      .setContentTitle("Revel Is Running") 
      .setTicker("Revel Is Running") 
      .setContentText("Click to stop") 
      .setSmallIcon(R.mipmap.ic_launcher) 
      //.setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false)) 
      .setContentIntent(pendingIntent) 
      .setOngoing(true).build(); 
    startForeground(Constants.FOREGROUND_SERVICE, 
      notification); 
    Log.e(TAG,"notification shown"); 

} 

tutaj jest tylko błąd widzę w relacji: 06-20 12:26:43.635 895-930/? E/NotificationService: Suppressing notification from the package by user request.

Odpowiedz

10

Problemem było Używam Android O i wymaga więcej informacji. Oto kod udany dla android O.

mNotifyManager = (NotificationManager) mActivity.getSystemService(Context.NOTIFICATION_SERVICE); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) createChannel(mNotifyManager); 
    mBuilder = new NotificationCompat.Builder(mActivity, "YOUR_TEXT_HERE").setSmallIcon(android.R.drawable.stat_sys_download).setColor 
      (ContextCompat.getColor(mActivity, R.color.colorNotification)).setContentTitle(YOUR_TITLE_HERE).setContentText(YOUR_DESCRIPTION_HERE); 
    mNotifyManager.notify(mFile.getId().hashCode(), mBuilder.build()); 

@TargetApi(26) 
private void createChannel(NotificationManager notificationManager) { 
    String name = "FileDownload"; 
    String description = "Notifications for download status"; 
    int importance = NotificationManager.IMPORTANCE_DEFAULT; 

    NotificationChannel mChannel = new NotificationChannel(name, name, importance); 
    mChannel.setDescription(description); 
    mChannel.enableLights(true); 
    mChannel.setLightColor(Color.BLUE); 
    notificationManager.createNotificationChannel(mChannel); 
} 
+0

Czy istnieje wygodniejszy sposób poradzenia sobie z tym? to jest support/compat-style? Ten sam kod, który działa na obu platformach sprzed 26 lat i 26+, bez użycia "jeśli" i duplikowania kodu. –

+0

if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.O) {createNotificationChannel (context);} // REST OF CODE HERE –

+0

Ale w tym nowym fragmencie kodu zauważam, że wywołujesz 'mNotifyManager.notify () 'zamiast' startForeground() '. W takim przypadku czy to naprawdę czyni pierwszą usługę? –

0

w moim przypadku było to spowodowane przez mnie za pomocą IntentService.

Krótko mówiąc, jeśli chcesz usługę pierwszego planu, to podklasa Service.