2011-07-26 13 views
4

私は通知を呼び出すプログラムを持っています。通知をプルダウンすると、新しいアクティビティが起動します。Android Refresh通知からのアクティビティ

mNotificationManager = (NotificationManager) getSystemService(ns); 

int icon = R.drawable.stat_sys_secure_green; 
CharSequence tickerText = "Browser Security Enabled"; 
long when = System.currentTimeMillis(); 

notification = new Notification(icon, tickerText, when); 

Context context = getApplicationContext(); 
CharSequence contentTitle = "Browser Security"; 
CharSequence contentText = "Security Vulnerability Detected"; 
Intent notificationIntent = new Intent(this, PrivacyMessage.class); 

//Test Extra 
notificationIntent.putExtra("Primary Key", "Primary Text"); 

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); 

mNotificationManager.notify(HELLO_ID, notification); 

問題は、二次アクティビティをリフレッシュするときにコードの後に​​表示されます。主なアクティビティは、その中のエクストラを動的に変更できる必要があります。私は新しい意図を打ち出してこれをやってみました。私はそのコードを実行するとき

CharSequence contentTitle = "Browser Security"; 
CharSequence contentText = "Test New Notification"; 
Intent intent = new Intent(this, PrivacyMessage.class); 
notification.icon = R.drawable.stat_sys_secure_orange; 

intent.putExtra("Test Thing", "Test Value"); 
//intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
//intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

PendingIntent cI = PendingIntent.getActivity(this, 0, intent, 0); 
notification.setLatestEventInfo(getApplicationContext(), "New Title", "NewText", cI); 
mNotificationManager.notify(HELLO_ID, notification); 

は今、新しい通知のタイトルは、アイコンの色の変化をポップアップ表示し、プルダウンは新しいタイトルや追加情報を反映しています。しかし、それをクリックすると、新しいインテントでアクティビティが起動されません。代わりに、それはちょうど古いエキストラで古い活動を引き出します。私はFLAG_ACTIVITY_CLEAR_TOPとFLAG_ACTIVITY_NEW_TASKの両方を試しましたが、どちらも古いセカンダリアクティビティをクリアして新しいものを作成していないようです。どのように私はそれを行うかもしれないかについての任意のアイデア?

+0

私の誤解は間違いますが、履歴なしで新しいアクティビティを開始したい場合や、古いアクティビティをフォアグラウンドにして状態を更新したい場合は、 – mdelolmo

+0

通知を押すと、古いアクティビティがフォアグラウンドに来るようにしたいが、新しいインテントで更新する。 – Lark

+0

私の問題も手伝ってもらえますか? http://stackoverflow.com/questions/20149685/android-notification-refresh-activity –

答えて

10

これは実際にはアンドロイド環境のバグ/機能です。一意のrequestCodeでpendingIntent()が渡されない限り、最初にその番号で渡された古いインテントを取得するだけです。

詳細はここで見つけることができます:彼らが思いついた http://groups.google.com/group/android-developers/browse_thread/thread/ad855bb57042c2bd/e84c8d6fececf6e4?lnk=gst&q=notification#e84c8d6fececf6e4

ソリューションは、単に私が

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
で、もともとそれを行っていた方法を毎回 pendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags)が呼び出されるrequestCodeをインクリメントし、フラグを設定することでした

これは完璧なソリューションのようには見えませんが、機能します。皆さん、助けてくれてありがとう!

+3

また、PendingIntent.getActivity()でPendingIntent.FLAG_CANCEL_CURRENTフラグを使用することをお勧めします。 – OferR

+1

PendingIntent.getActivity()でのPendingIntent.FLAG_CANCEL_CURRENTフラグが私のために働きます – varghesekutty

0

私はまず、FLAG_ACTIVITY_NEW_TASKを忘れてしまいます。これは、以前に開いたものをクリアせずに新しいタスク(アクティビティグループ)を開くためです。 FLAG_ACTIVITY_CLEAR_TOPは、あなたのシナリオを正しく理解していれば、タクには2つのアクティビティしかなく、ターゲットアクティビティはセカンダリであることがわかります。

これは私の質問です... 2番目のコードがアクティビティコンテキスト内で実行されている場合は、startActivityに新しいエキストラを呼び出すとどうでしょうか?これにより、セカンダリアクティビティのonStartメソッドの新しいエキストラを処理することができます。

よろしくお願いいたします。

+0

startActivityについての私の理解は、すぐに新しいアクティビティを開始するということでした。私がしたいことは、通知ドロップダウンからアクティビティを起動させるだけですが、その時点で更新されたバージョンにすることです。 私はそれを試してみましたが、すぐに新しいアクティビティを起動しますが、アンドロイド・アプリケーションをスローします。SuperNotCalled例外です。 – Lark

0

onNewIntent()を上書きして新しいインテントをキャッチするか、getIntent()を呼び出すだけですか? onNewIntent()からsetIntent()を呼び出さない限り、onNewIntent()のドキュメントによると、getIntent()はアクティビティの起動に使用された元のインテントを引き続き返します。

+0

私は実際にgetIntentを呼び出していました。私はちょうど今シンプルに追加しようとしました: 'public void onNewIntent(Intent intent){ this.setIntent(intent); } ' しかし、何もしていないようです。また、onCreateメソッドをコピーして、onNewIntentメソッドに変更を書式設定しようとしました。どちらも多かった。それ以上の考え? – Lark