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.


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

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 " + "test@gmail.com")
        .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());

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

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 ...


apa pembangun ini?
Viswanath Lekshmanan

-2

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


2
Anda tidak harus menggunakan getBaseContext()skenario ini.
Rahat Zaman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.