Mengirim pemberitahuan dari layanan di Android

105

Saya memiliki layanan yang sedang berjalan, dan ingin mengirim pemberitahuan. Sayang sekali, objek notifikasi membutuhkan Context, seperti Activity, dan bukan Service.

Apakah Anda tahu cara untuk melewati itu? Saya mencoba membuat Activityuntuk setiap pemberitahuan tetapi tampaknya jelek, dan saya tidak dapat menemukan cara untuk meluncurkan Activitytanpa pemberitahuan View.

e-satis
sumber
14
Umm ... Layanan adalah konteks!
Isaac Waller
19
Ya Tuhan, aku benar-benar bodoh. Oke, maaf membuang waktu semua orang.
e-satis
28
Tidak apa-apa - ini pertanyaan Google yang bagus.
Isaac Waller
Sukai komentar kedua Anda: D: D
Faizan Mubasher
Posting ini baru saja menyelamatkan hari saya ...
Muhammad Faizan

Jawaban:

109

Keduanya Activitydan Servicebenar - benar extend Contextjadi Anda bisa menggunakannya thissebagai milik ContextAnda 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);
Josef Pfleger
sumber
4
Perlu diingat bahwa Anda akan mengalami banyak masalah saat melakukan pemberitahuan dari suatu layanan. Jika Anda mengalami masalah, lihat groups.google.com/group/android-developers/browse_thread/thread/…
Karussell
1
bagaimana Anda bisa melakukan ini menggunakan Notification.Builder? karena setLatestEventInfo sudah tidak digunakan lagi.
Kairi San
77

Jenis Pemberitahuan ini tidak berlaku lagi seperti yang terlihat dari dokumen:

@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 */ }

Cara yang lebih baik
Anda dapat mengirim pemberitahuan seperti ini:

// 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); 


Kode cara terbaik di atas membutuhkan minimum API level 11 (Android 3.0).
Jika level API minimum Anda lebih rendah dari 11, Anda harus menggunakan kelas NotificationCompat perpustakaan dukungan seperti ini.

Jadi jika level API target minimum Anda adalah 4+ (Android 1.6+) gunakan ini:

    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());
trante
sumber
4
ini seharusnya menjadi jawaban terbaik karena yang diterima sudah tidak digunakan lagi
Marcel Krivek
4
@MarcelKrivek Sepertinya dia "lupa" mengutip sumbernya. vogella.com/tutorials/AndroidNotifications/article.html
StarWind0
Apa itu "NotificationReceiver"?
pengguna3690202
"NotificationReceiver" adalah Aktivitas yang akan dibuka oleh Notification. Periksa tautan yang disediakan oleh @ StarWind0.
George Theodorakis
NotificationCompat.Builder sudah tidak digunakan lagi. Sekarang bukan lagi jawaban terbaik
Mimpi Iblis
7
@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);
}
王怡飞
sumber
Pertanyaan topiknya adalah dari LAYANAN bukan Aktivitas
Duna
1

Yah, saya tidak yakin apakah solusi saya adalah praktik terbaik. Menggunakan NotificationBuilderkode saya terlihat seperti itu:

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

Nyata:

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

dan di sini Layanan:

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

Saya tidak tahu apakah memang ada singleTaskdi Servicetetapi ini berfungsi dengan baik di aplikasi saya ...

Martin Pfeffer
sumber
apa pembangun ini?
Viswanath Lekshmanan
-2

Jika tidak ada yang berhasil, coba getBaseContext(), alih-alih contextatau this.

kurdist android
sumber
2
Anda tidak harus menggunakan getBaseContext()skenario ini.
Rahat Zaman