การส่งการแจ้งเตือนจากบริการใน Android


105

ฉันมีบริการทำงานอยู่และต้องการส่งการแจ้งเตือน น่าเสียดายที่วัตถุการแจ้งเตือนต้องมีContextเช่นActivityและไม่ใช่ไฟล์Service.

คุณรู้วิธีการผ่านหรือไม่? ผมพยายามที่จะสร้างActivityสำหรับแต่ละการแจ้งเตือน แต่ดูเหมือนว่าน่าเกลียดและผมก็ไม่สามารถหาวิธีที่จะเปิดตัวอีกด้วยโดยไม่ต้องมีActivityView


14
อืม ... บริการคือบริบท!
Isaac Waller

19
พระเจ้าฉันเป็นคนโง่ โอเคขอโทษที่ทำให้ทุกคนเสียเวลา
e-satis

28
ไม่เป็นไร - เป็นคำถามของ Google ที่ดี
Isaac Waller

ชอบความคิดเห็นที่ 2 ของคุณ: D: D
Faizan Mubasher

โพสต์นี้เพิ่งบันทึกวันของฉัน ...
Muhammad Faizan

คำตอบ:


109

ทั้งสองActivityและServiceจริงextend Contextเพื่อให้คุณสามารถใช้thisเป็นของคุณภายในของคุณContextService

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
โปรดทราบว่าคุณจะมีปัญหามากมายในการแจ้งเตือนจากบริการ หากคุณมีปัญหาลองดูgroups.google.com/group/android-developers/browse_thread/thread/…
Karussell

1
คุณจะทำได้อย่างไรโดยใช้ Notification.Builder? เนื่องจาก setLatestEventInfo เลิกใช้แล้ว
Kairi San

77

การแจ้งเตือนประเภทนี้เลิกใช้งานตามที่เห็นในเอกสาร:

@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 " + "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); 

วิธีที่ดีที่สุด
Code ด้านบนต้องการ 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());

4
นี่น่าจะเป็นคำตอบที่ดีที่สุดเนื่องจากคำตอบที่ได้รับการยอมรับนั้นเลิกใช้แล้ว
Marcel Krivek

4
@MarcelKrivek ดูเหมือนว่าเขาหรือเธอ "ลืม" ที่จะอ้างแหล่งที่มาของพวกเขา vogella.com/tutorials/AndroidNotifications/article.html
StarWind0

"NotificationReceiver" คืออะไร?
user3690202

"NotificationReceiver" คือกิจกรรมที่จะเปิดขึ้นโดยการแจ้งเตือน ตรวจสอบลิงค์ที่ให้มาโดย @ StarWind0
George Theodorakis

NotificationCompat.Builder เลิกใช้งานแล้ว ตอนนี้มันไม่ใช่คำตอบที่ดีที่สุดอีกต่อไป
Devil's Dream

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

คำถามหัวข้อมาจากกิจกรรม SERVICE not
Duna

1

ฉันไม่แน่ใจว่าวิธีแก้ไขของฉันเป็นแนวทางปฏิบัติที่ดีที่สุดหรือไม่ การใช้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());
    }

ประจักษ์:

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

และนี่คือบริการ:

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

ผมไม่ทราบว่าถ้ามีจริงๆเป็นsingleTaskที่Serviceแต่ตอนนี้ทำงานอย่างถูกต้องในใบสมัครของฉัน ...


ตัวสร้างในนี้คืออะไร?
Viswanath Lekshmanan

-2

หากไม่มีการทำงานเหล่านี้พยายามที่getBaseContext()แทนหรือcontextthis


2
คุณไม่ควรใช้getBaseContext()คือสถานการณ์เหล่านี้
Rahat Zaman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.