AndroidプログラムクラスQQ通知NotificationバーでNotificationをクリックして、新しいインスタンスを作成するのではなく、バックグラウンドに配置されていたTaskに正しく戻る前に対応するActivityをクリックします.


注意:本文の大部分の内容は転載して:newcjのブログは他人の労働の成果を尊重してください!
今日「android Notificationの使用」を書き終えたところ、特にNotificationのIntentを設定して、QQや他のプログラムのようにバックグラウンドに置かれていたTaskの対応するActivityに正しく復帰させることができ、新しいインスタンスを作成するのではなく、いくつかの問題が発見されました.もちろんポイントはこのActivityのlaunchModeとIntentのFlagsをどのように設定するかです.ここまで言うと、今晩のデバッグの経験を言わざるを得ません.もちろん、ここで言うすべてのNotificationにはFLAGが設定されています.ONGOING_EVENT.
「(転載)Android下AffinitiesとTask」という文によると、私たちはこのような結論を出すのは難しくありません.
1.ユーザーがNotificationをトリガーしたときに発行するIntentを設定し、FLAG_を設定した場合ACTIVITY_CLEAR_TOPとFLAG_ACTIVITY_NEW_TASKは、launchModeが一定(すなわち、デフォルト:standard)のままである場合、ユーザがNotificationを手でクリックすると、バックグラウンドのTaskに一致し、スタック内で起動するActivityに対応する前のすべてのActivityをすべてクリアし、standardのデフォルトは新しいIntentに対して常に新しいActivityオブジェクトを作成するためである.したがって、Taskに存在する古いActivityも消去され、Taskに新しいActivityオブジェクトが作成されます.
2、ユーザーがNotificationをトリガーしたときに発行するIntentを設定し、FLAG_を設定した場合ACTIVITY_CLEAR_TOPとFLAG_ACTIVITY_NEW_TASK,launchModeがsingleTopに設定されている場合,ユーザがNotificationを手でクリックしたときと同様に,そのTaskに存在する古いActivityだけがクリアされず,その時点で既に存在するActivityにIntentが渡されても新しいActivityは作成されない.
以上の結論は,リターンテストを経て,1は正しいが,2は奇妙な問題を抱えている.
現在、プログラムXがある、2つのActivityがある、それぞれA,Bであり、そのうちAはandroidが設定されていると仮定する.intent.action.MAINのActivity(エントリActivity)は、両方のlaunchModeがデフォルトのstandardであり、このIntentを作成するコードは以下の通りです.
Intent intent = new Intent(this, A.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);

明らかに我々が設定したのはユーザーがNotificationをクリックする時、現れるべきのはA Activityだが、どうしてもhomeキーを押して現在のTaskを脱退し、バックグラウンドTaskにし、プログラムリストからこのプログラムを起動すると常にTaskの先端に回復するActivityがユーザーに与えられ、現在のBのようにhomeキーを押して、プログラムリストからXを起動し、この時現れるActivityはいずれもBである.しかし、以下の方法で操作すると、プログラムリストからXが起動し、新しく作成されたA Activityが現れ、ログ印刷で次のすべてのActivityが同じTaskにあることがわかります.
1、プログラムを開くA、A startActivityからB、Homeキー、点NotificationでA、A startActivityからB、Homeキー、プログラムリストからプログラムを開く新しく作成したインスタンスA
2、プログラムを開くA、A startActivityからB、点NotificationからA、A startActivityからB、Homeキーを押すと、プログラムリストからプログラムを開く新しいインスタンスAが現れる
ここでいう「新しく作成されたインスタンスA」は、いずれも同じTaskに作成された新しいA Activityインスタンスである.つまり、以上の2つの方法で、戻りキーを押すとB、戻りキーを押すとAとなる.ここでは、プログラムリストからプログラムを開いたIntentがFLAG_を使用しても、同じTaskで新しいActivityを作成した理由が思い浮かばない.ACTIVITY_NEW_TASKマーク、私もなぜか分かりませんが、友達が知っていたら、ぜひ教えてください.
ここまで来て、私はプログラムリストから起動する優越性を発見し始めました.いつホームを押しても、再びプログラムリストから起動すると、TaskのスタックトップActivityに戻ることができるからです.最初は、Activityをリロードしてクラス実装を書く方法を考えました.onResumeのときにNotificationを更新し、その後、私のすべてのActivityクラスが直接このクラスから継承され、Homeを押すと常にNotificationにTaskのスタックトップActivityを覚えさせることができます.QQのように、この方法はもちろん少し無理です.そこで、SDKのHomeに関するSimpleを見始めました.対応するActivityを呼び出すのではなく、TaskのスタックトップActivityを呼び出す
 NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
 Notification notification = new Notification(R.drawable.logo_icon_16,"    ", System.currentTimeMillis());
 Intent intent = new Intent(Intent.ACTION_MAIN); 
 intent.addCategory(Intent.CATEGORY_LAUNCHER); 
 intent.setClass(this, BeforeLogoActivity.class); 
 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
 notification.flags = Notification.FLAG_ONGOING_EVENT; //      Flag
 PendingIntent contextIntent = PendingIntent.getActivity(this, 0, intent, 0);
 notification.setLatestEventInfo(getApplicationContext(),"    ", "", contextIntent);
 notificationManager.notify(R.drawable.logo_icon_16, notification);

setClass以外はsetClassNameバインド、FLAG_ACTIVITY_RESET_TASK_IF_NEEDEDは設定しなくてもいいですが、他の選択肢は一つも欠けていません.ACTION_の設定MAINとCATEGORY_LAUNCHERは,このIntentをシステム対応作成プログラムに送ったモジュールであり,そのモジュールは設定されたパケットとクラス情報,そしてflagsに従って処理される.もちろんすべてのIntentの動作原理はこのようにして、ただACTION_に対してMAIN - CATEGORY_LAUNCHARの処理は、setClassで設定されたActivityクラスではなく、TaskスタックトップのActivityクラスが常に表示されるように特別である.
何日かやりました...まだ高い人の指摘に損をしている...ははは!