2011-09-20 6 views
3

私は、任意の時点でトリガされるいくつかの異なるアラームタイプを持つ「アラーム」アプリを持っています。アラームが解除されると、ステータスバー通知が追加されます。ユーザーがステータスバーの "Clear All"ボタンを使用するとき、Delete Intentが画面からAlarm Activityウィンドウを削除して閉じるようにします。どうすればこれを達成できますか?私のアラームアクティビティはシングルタスクアクティビティではないので、複数のアクティビティウィンドウを一度に作成することができるので、onNewIntent()関数が実行するいくつかのデータでインテントを使用するだけでアクティビティ自体を閉じることはできません。アクティビティの外からアラームウィンドウを消す方法を見つける必要があります。ステータスバー通知インテントから独自のアクティビティウィンドウを削除または閉じる

ありがとうございました。

答えて

9

ハックが、100%ワーキング溶液:あなたはすべての活動を待っているBroadcastを送信することができ、それは彼らにfinish()を呼び出します。各アクティビティの

private String action = "clear"; 
private String type = "content://whatever_you_like"; //You should read stuff about this because it's a hack.. 

のonCreate:

clearStackManager = new ClearStackManager(); 
      registerReceiver(clearStackManager, 
        IntentFilter.create(action, type)); 

それを定義:

private final class ClearStackManager extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     finish(); 
    } 
} 

onDestroy:

unregisterReceiver(clearStackManager); 

がそれを呼び出す:

ボックス・ソリューションのうち
public void clearStack() { 
    Intent intent = new Intent(action); 
    intent.setType(type); 
    sendBroadcast(intent); 
} 

:(その1以外のすべてのアクティビティを削除する)FLAG CLEAR_TOPとの意思によってコールスタックの最初の活動(それはいつも同じだ場合)、その後onNewIntentに最後の仕上げ1。


それが解決策を動作するかどうか私は知らない:は、私はまた、この発見:https://stackoverflow.com/a/6403577/327011をしかし、私はアクションで働いたことがないので、私は複数のアクティビティが同じアクションを持っている場合、何が起こるかわかりません。


UPDATE

あなたはグローバルブロードキャストを送信することを避けるために、代わりに "グローバル" 放送のLocalBroadcastManagerを使用する必要があります。

http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

+0

はこれをテストする機会があったが、すぐに私がそうであるように、それは私が答えとして、それを選択します動作します。 –

+0

インテント経由で通知からブロードキャストを送信することは、方法です。アクティビティは、このブロードキャストをリッスンし、それに従って動作することができます。また、特定の動作をトリガするために、アクティビティのインテントでデータを送信することもできます。 –

0

これは、アラームウィンドウで、それぞれが、複数のアクティビティを備えた単一のアプリケーションですか?

もしそうなら、アプリケーションのすべてのアクティビティで共有されるシングルトンオブジェクトに各アクティビティのIDを登録するのはどうですか?ステータスインジケータから削除インテントを受け取る(最初の)アクティビティは、シングルトンオブジェクトをロックし、アクティビティのコレクションを反復し、各アクティビティ(自身(activityId == this)を除く)に削除インテントを送信してから終了します。他のアクティビティは、共有オブジェクトがすでにロックされており、単に終了することを決定します。

共有オブジェクトの同期メソッドを使用して、ロック()関数を呼び出した結果、共有オブジェクトがロックされた場合はtrueを返し、共有オブジェクトがすでに別のアクティビティによってロックされている場合はfalseを返します。呼び出し側のアクティビティは、単純に死ぬべきか(結果は偽であるか、すでにロックされているか)、他のアクティビティを死ぬように指示する責任を負う必要があるかどうかを判断することができます。

この方法では、アプリケーションがプログラムで無実の傍観者を取るかもしれない、あるいはいくつかの活動を欠場する可能性のあるブロードキャストメカニズムに頼らずにその活動へのインテントを削除指示することができます。元の削除意図を受け取ったアクティビティは、他のアクティビティが終了する前に壊れていることを確認して、堅牢性を向上させることができます。私がやりなさい

+0

なぜこれが-1だったのですか?ディスカッションを始めたくはありませんが、理由を理解して学びたいと思っています。 – Colin

+0

私はそれを落としていないので、私は確かにわからないが、提案された解決策は少し複雑に見える。それは、おそらくアクティビティの内部に生きてはならない(すなわち、他のアクティビティを反復および殺す)いくつかの動作を提案する。とにかく、私の考え。あなたが勉強しようとしているのを見てうれしい! – dstricks

+0

+1ソリッドメソッドベースのソリューションです。 –

関連する問題