2013-08-13 44 views
5

Androidで簡単なタスクアプリを開発していますが、AlarmManagerで通知を作成する必要があります。私の問題は、削除すべき特定のアラームがあることとその通知であることですが、そうではありませんので、Delete alarm from AlarmManager using cancel() - Androidなどの投稿をフォローして、AlarmManagerを静的変数にして、同じインスタンスに全体的に到達できるようにしましたアプリ。Androidの静的AlarmManager

public static AlarmManager getAlarmManagerInstance() { 
     if (sAlarmManager == null && sContext != null) 
      sAlarmManager = (AlarmManager) sContext 
        .getSystemService(Context.ALARM_SERVICE); 
     return sAlarmManager; 
    } 

sContext変数がこのようにインスタンス化される中:

@Override 
    protected void onCreate(Bundle bundle) { 
     super.onCreate(bundle); 
     setContentView(R.layout.activity_main); 
     sContext = this; 
     initActionBar(); 
    } 

は、それがすることをお勧めします私はこれをやっている の方法は、私のメインのクラスで、次のメソッドを持っていますこの変数からシングルトンパターンを作成しますか?より良いアプローチはありますか?

ありがとうございます。

+0

は保留中の意図を作成するために、同じIDを使用..それは同じ仕事をします –

+0

しかし私は 'PendingIntent pendingFirstAlarmIntent = PendingIntent.getBroadcast( \t \t)のような方法で、保留中のインテントを作成するために作成/修正したいタスクのIDを使用しています。 \t \tこの、mGoal.getId()intValue()、意図、 \t \t \t \t \t PendingIntent.FLAG_ONE_SHOT); '..それはまだ同じですか? – noloman

+0

はいこれは同じです...これがアラームをキャンセルしていない場合は、別のフラグを使用してみてください... –

答えて

1

Androidのドキュメントは言う:

あなたが直接このクラスをインスタンス化しません。代わりに、Context.getSystemService(Context.ALARM_SERVICE)を使用して取得します。

AlarmManagerは、システムアラームサービスへのアクセスを提供するクラスです。

このサービスはシステム内で実行されているため、アラームマネージャをインタフェイスとして使用するだけで気にする必要はありません。

ですから、ドキュメントが言うようにそれを取得し、このサービスにアクセスする必要があるたび:

Context.getSystemService(Context.ALARM_SERVICE)

1

私は静的なアラームを作成することをお勧めします。

あなたのPendingIntentsに与えられたIDを使用するには、コメント内のアドバイスに従う必要があります。この方法で、アプリケーション内のどこからでもアラームをキャンセル/更新できます。私は、静的なアラームに対して助言なぜ

理由:

次のシナリオが発生する可能性があります、あなたはアラームをスケジュールし、それを静的な参照を作るには、ユーザーは携帯電話を再起動します。あなたのアラームはなくなり、静的な参照も消えています。

このような状況でアラームを動作させる必要がある場合は、それらのIDと必要な情報を共有プリファレンス/データベース/ファイルに書き込み、ブート時に、またはアプリケーションに適した他のイベントでスケジュールを変更する必要があります。

+0

しかし、私は既に 'ACTION_BOOT_COMPLETED'パーミッションを持つ' BroadcastReceiver'を持っていますので、電話機をリブートするときにDBからアラームを作り直すことができます。 'PendingIntent'に渡すパラメータは、アラームではなくタスクのIDであると考えていたので、私は' PendingIntent'でIDを使うことを理解していません。 – noloman

+0

IDを入力しないと、インテントが同じアクティビティ/サービス(異なる追加の値はカウントされません)を開始するPendingIntentを作成すると、アンドロイドはそれらの間で差をつけることができません。最終的には、新しいアラームを作成するたびに、あなたが知らないうちに古いアラームが自動的にキャンセルされることになります。あなたのAlarmManagersはあなたの通知に接続していると言われてから別のIDを使用する必要があります。一意のIDを与えた場合は、通知と同じIDを使用してください – JanBo

+0

http://stackoverflow.com/questions/7496603/how-to- create-different-pendingintent-so-filterequals-return-false ...あなたの意図のためのアクションを設定することも考えてください。あなたがPendingIntentのidを設定するのをやめてしまえば、そのようにフィルターをかけることができます。 – JanBo

関連する問題