2012-07-17 12 views
7

私はデータ用にウェブサイトをスクラップし、必要に応じて通知するサービスを持っています。サービスが終了するとすぐに通知が消えます

私が抱えている問題は、サービスが終了するとすぐに通知が消えることです(瞬時に可能性があります)。以下のコードは、アプリが持つすべての通知コードです。通知を取り消すコードは一切入れていません。

public static void CreateNotificationCompat(int notificationID, String link, String title, String text, Context ctx) 
{ 
    Intent notificationIntent = new Intent("android.intent.action.VIEW", Uri.parse(link)); 
    PendingIntent contentIntent = PendingIntent.getActivity(ctx.getApplicationContext(), 0, notificationIntent, 0); 

    NotificationManager nm = (NotificationManager) ctx 
      .getSystemService(Context.NOTIFICATION_SERVICE); 

    NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx); 
    Resources res = ctx.getResources(); 

    builder.setContentIntent(contentIntent) 
       .setSmallIcon(R.drawable.notify_icon) 
       .setWhen(System.currentTimeMillis()) 
       .setContentTitle(title) 
       .setContentText(text) 
       .setAutoCancel(false); 

    Notification n = builder.getNotification(); 

    nm.notify(notificationID, n); 
} 

私がここでアプリケーションのコンテキストを使用している場合は、(それがないと確信して)何か違いがあれば

私のサービスは定期的に開始され、ウェブサイトを処理し、必要に応じて通知して終了します。

stopSelf()を呼び出すのではなく、サービスの終了時に30秒間スリープしてからstopSelf()を呼び出します。その後、通知は30秒間続き、消えます。通知が消えた時点で、関連するものはlogcatに表示されません。

私はこれまでICSを使用してテストできました。

+0

これは問題ないはずです。通常、アプリケーションが強制終了された場合にのみ通知が消えます。私は何かがクラッシュしていることを期待する。実際にどのスレッドがスリープ状態になっているのか、どのスレッドが実行されているのかを知ることは面白いでしょう。実験のために30代の睡眠を取り除き、同じ行動が起こるかどうかを調べることも興味深いでしょう。 – kabuko

+0

通知があれば、その通知をキャンセルするコードはどこですか?また、FYIでは、android.intent.actionのような直接の文字列を使うべきではありません。*これは、Intentクラスで利用可能な定数です。 @ user1531605 – JoxTraex

+0

通知が「直前」に、つまり同じコード実行チェーンで通知を停止するように要求された場合、通知はクリアされます。 –

答えて

2

最初に開発者のマニュアルを確認するのを忘れたようです。ここではhttp://developer.android.com/guide/topics/ui/notifiers/notifications.htmlを参照し、FLAG_ONGOING_EVENTとFLAG_NO_CLEARフラグを探します。

これまでのところICSを使用してテストすることしかできませんでした。

だからこそ、シミュレータは非常に便利です。それを試してみてください。これはSDKの一部です。

+0

私はそれを読んだ、それらは私が望むものではありません。 「通知をクリアする」ボタンで通知をクリアできるはずなので、FLAG_NO_CLEARは役に立ちません。そして、これは進行中の出来事ではありません。ドキュメントから "この通知が特定の時点で起こった何かを参照している場合、通話が逃したように設定するべきではありません。"それはまさにこのことであり、特定の時点で起こったことに対する審判です。 脇の下として、私は念のためにそれらのフラグでテストを行い、同じ結果を得ました。サービスが閉鎖されても、通知はまだ消えていました。 – user1531605

+0

pre 4.x android?であなたのコードをチェックしましたか?エミュレータで十分です。 –

+0

あなたのサービスのソースコードは、作成や破棄のような関連するものだけを投稿してください。 – JoxTraex

4

投稿したコードは機能します。 jbのアクティビティとサービスの両方からテストしましたが、コンポーネントが停止しても通知は保持されます。私はプロセスを抹消でき、通知も残っていることを確認しました。アプリを削除し、問題が解決されないかどうかを確認してください。誤って通知のキャンセルをしないことを特に確認してください。

1

同じデバイス上の古いやり方を試してみて、それは同じように動作している場合を教えてください:

private static void CreateNotificationCompat(int notificationID, String link, String title, String text, Context ctx) { 
    String ns = Context.NOTIFICATION_SERVICE; 
    NotificationManager mNotificationManager = (NotificationManager) ctx.getSystemService(ns); 
    Notification notification = new Notification(R.drawable.notify_icon, title, System.currentTimeMillis()); 
    notification.flags = Notification.FLAG_AUTO_CANCEL; 
    PendingIntent contentIntent; 
    Bundle bundle = new Bundle(); 
    Intent notificationIntent = new Intent("android.intent.action.VIEW", Uri.parse(link)); 
    contentIntent = PendingIntent.getActivity(ctx, notificationID, 
       notificationIntent, 0); 
    notification.setLatestEventInfo(ctx, title, text, 
      contentIntent); 
    mNotificationManager.notify(notificationID, notification); 
}