Gửi thông báo từ một dịch vụ trong Android


105

Tôi có một dịch vụ đang chạy và muốn gửi một thông báo. Thật tệ, đối tượng thông báo yêu cầu một Context, như một Activity, và không phải a Service.

Bạn có biết cách nào để vượt qua nó không? Tôi đã cố gắng tạo một Activitythông báo cho mỗi thông báo nhưng nó có vẻ xấu và tôi không thể tìm ra cách khởi chạy Activitymà không có bất kỳ thông báo nào View.


14
Umm ... một Dịch vụ một bối cảnh!
Isaac Waller 30/07/09

19
Chúa ơi, tôi đúng là đồ ngốc. Ok, xin lỗi vì đã làm mất thời gian của mọi người.
e-thoả mãn

28
Điều đó tốt - đó là một câu hỏi hay của Google.
Isaac Waller, 31-07-09

Thích bình luận thứ hai của bạn: D: D
Faizan Mubasher

Bài viết này chỉ lưu ngày của tôi ...
Muhammad Faizan

Câu trả lời:


109

Cả hai ActivityServicethực sự extend Contextđể bạn có thể đơn giản sử dụng thisnhư của bạn Contexttrong của bạn 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
Hãy nhớ rằng bạn sẽ gặp rất nhiều vấn đề khi thực hiện thông báo từ một dịch vụ. Nếu bạn gặp sự cố, hãy xem nhóm này.google.com/group/android
developers/browse_thread/thread/

1
làm thế nào bạn có thể làm điều này bằng cách sử dụng Notification.Builder? vì setLatestEventInfo đã không còn được dùng nữa.
Kairi San

77

Loại Thông báo này không được dùng nữa như được thấy từ các tài liệu:

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

Cách tốt hơn
Bạn có thể gửi một thông báo như sau:

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

Cách tốt nhất
Mã trên cần API tối thiểu cấp 11 (Android 3.0).
Nếu mức API tối thiểu của bạn thấp hơn 11, bạn nên sử dụng lớp NotificationCompat của thư viện hỗ trợ như thế này.

Vì vậy, nếu cấp API mục tiêu tối thiểu của bạn là 4+ (Android 1.6+), hãy sử dụng cái này:

    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
đây sẽ là câu trả lời tốt nhất vì câu trả lời được chấp nhận không còn được dùng nữa
Marcel Krivek 09/09

4
@MarcelKrivek Có vẻ như anh ấy hoặc cô ấy "quên" trích dẫn nguồn của họ. vogella.com/tutorials/AndroidNotifications/article.html
StarWind

"NotificationReceiver" là gì?
dùng3690202 17/12/17

"NotificationReceiver" là Hoạt động sẽ được mở bởi Thông báo. Kiểm tra liên kết được cung cấp bởi @ StarWind0.
George Theodorakis

NotificationCompat.Builder đã không còn được dùng nữa. Bây giờ nó không còn câu trả lời tốt nhất
Devil Giấc mơ

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

Câu hỏi chủ đề là từ một SERVICE không phải Hoạt động
Duna

1

Tôi không chắc liệu giải pháp của mình có phải là phương pháp hay nhất hay không. Sử dụng NotificationBuildermã của tôi trông giống như sau:

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

Rõ ràng:

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

và đây là Dịch vụ:

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

Tôi không biết nếu có thực sự là một singleTasktrong Servicenhưng công trình này đúng vào ứng dụng của tôi ...


người xây dựng trong này là gì?
Viswanath Lekshmanan

-2

Nếu không có cách nào trong số này hiệu quả, hãy thử getBaseContext(), thay vì contexthoặc this.


2
Bạn không nên sử dụng getBaseContext()những trường hợp này.
Rahat Zaman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.