سؤال

لدي خدمة تشغيل و ترغب في إرسال إشعار.سيئة للغاية ، الإخطار كائن يتطلب Context, مثل Activity, و لا Service.

هل تعرف أي طريقة عن طريق تمرير ذلك ؟ حاولت لإنشاء Activity لكل الإخطار ولكن يبدو قبيح وأنا لا يمكن العثور على طريقة لإطلاق Activity دون أي View.

هل كانت مفيدة؟

المحلول

وكلا Activity وService الواقع extend Context بحيث يمكنك استخدام ببساطة 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);

نصائح أخرى

هذا النوع من الإعلام هو مستنكر كما يتضح من الوثائق:

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

أفضل طريقة
رمز أعلاه يحتاج إلى أدنى مستوى API 11 (أندرويد 3.0).
إذا كان لديك الحد الأدنى API مستوى أقل من 11 ، يجب عليك استخدام دعم المكتبة's NotificationCompat فئة من هذا القبيل.

حتى إذا كان لديك الحد الأدنى المستهدف مستوى API 4+ (الروبوت 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());
@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);
}

حسنا، أنا لست متأكدا إذا كان لي الحل هو أفضل الممارسات. باستخدام 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 ولكن هذا يعمل بشكل صحيح في طلبي ...

وإذا كان أي من هذه الأعمال، في محاولة getBaseContext()، بدلا من context أو this.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top