it-swarm.com.ru

Отправка уведомления от службы в Android

У меня запущена служба, и я хочу отправить уведомление. Жаль, объект уведомления требует Context, как Activity, а не Service.

Вы знаете какой-нибудь способ обойти это? Я попытался создать Activity для каждого уведомления, но это выглядит ужасно, и я не могу найти способ запустить Activity без View.

98
e-satis

И Activity, и Service на самом деле extendContext , так что вы можете просто использовать this в качестве вашего Context в вашем Service.

NotificationManager notificationManager =
    (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE);
Notification notification = new Notification(/* your notification */);
PendingIntent pendingIntent = /* your intent */;
notification.setLatestEventInfo(this, /* your content */, pendingIntent);
notificationManager.notify(/* id */, notification);
105
Josef Pfleger

Этот тип уведомлений устарел, как видно из документов:

@Java.lang.Deprecated
public Notification(int icon, Java.lang.CharSequence tickerText, long when) { /* compiled code */ }

public Notification(Android.os.Parcel parcel) { /* compiled code */ }

@Java.lang.Deprecated
public void setLatestEventInfo(Android.content.Context context, Java.lang.CharSequence contentTitle, Java.lang.CharSequence contentText, Android.app.PendingIntent contentIntent) { /* compiled code */ }

лучше
Вы можете отправить уведомление следующим образом:

// prepare intent which is triggered if the
// notification is selected

Intent intent = new Intent(this, NotificationReceiver.class);
PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);

// build notification
// the addAction re-use the same intent to keep the example short
Notification n  = new Notification.Builder(this)
        .setContentTitle("New mail from " + "[email protected]")
        .setContentText("Subject")
        .setSmallIcon(R.drawable.icon)
        .setContentIntent(pIntent)
        .setAutoCancel(true)
        .addAction(R.drawable.icon, "Call", pIntent)
        .addAction(R.drawable.icon, "More", pIntent)
        .addAction(R.drawable.icon, "And more", pIntent).build();


NotificationManager notificationManager = 
  (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

notificationManager.notify(0, n); 

Лучший способ
Код выше требует минимального уровня API 11 (Android 3.0).
Если ваш минимальный уровень API ниже 11, вы должны использовать поддержка библиотеки класс NotificationCompat, подобный этому.

Поэтому, если ваш минимальный целевой уровень API составляет 4+ (Android 1.6+), используйте это:

    import Android.support.v4.app.NotificationCompat;
    -------------
    NotificationCompat.Builder builder =
            new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.mylogo)
                    .setContentTitle("My Notification Title")
                    .setContentText("Something interesting happened");
    int NOTIFICATION_ID = 12345;

    Intent targetIntent = new Intent(this, MyFavoriteActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, targetIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(contentIntent);
    NotificationManager nManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    nManager.notify(NOTIFICATION_ID, builder.build());
74
trante
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void PushNotification()
{
    NotificationManager nm = (NotificationManager)context.getSystemService(NOTIFICATION_SERVICE);
    Notification.Builder builder = new Notification.Builder(context);
    Intent notificationIntent = new Intent(context, MainActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(context,0,notificationIntent,0);

    //set
    builder.setContentIntent(contentIntent);
    builder.setSmallIcon(R.drawable.cal_icon);
    builder.setContentText("Contents");
    builder.setContentTitle("title");
    builder.setAutoCancel(true);
    builder.setDefaults(Notification.DEFAULT_ALL);

    Notification notification = builder.build();
    nm.notify((int)System.currentTimeMillis(),notification);
}
7
王怡飞

Ну, я не уверен, что мое решение - лучшая практика. Используя NotificationBuilder мой код выглядит так:

private void showNotification() {
    Intent notificationIntent = new Intent(this, MainActivity.class);

    PendingIntent contentIntent = PendingIntent.getActivity(
                this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(contentIntent);
    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(NOTIFICATION_ID, builder.build());
    }

Manifest:

    <activity
        Android:name=".MainActivity"
        Android:launchMode="singleInstance"
    </activity>

а вот Сервис:

    <service
        Android:name=".services.ProtectionService"
        Android:launchMode="singleTask">
    </service>

Я не знаю, действительно ли существует singleTask в Service, но это правильно работает в моем приложении ...

1
Martin Pfeffer