最近發現開發中的應用在home鍵關閉后,從通知欄重新打開后無法用退出按鈕關閉應用,在網上查了n久后,發現一些關鍵的原因,還沒實中踐測試,先做下筆記。
首先,其中一個原因可能是從通知欄打開應用是新開activity並且是存在一個新的task堆里的,這種情況下使用restartpackage()方法不能關閉應用的所有activity,解決的辦法可以強制從通知欄打開應用時回來原activity或者能關閉所有task里的 activity
方法二試過,不過不知如何取出所有activity,task也不知如何清除。方法一現在想想應該推薦這種方法,找到的方法資料先貼上:
如果要實現點擊通知圖標返回已經運行的程序,貼出關鍵的部分代碼。 public void shownotification(String msg) { NotificationManager barmanager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); Notification notice = new Notification(android.R.drawable.stat_notify_chat,"服務器發來信息了",System.currentTimeMillis()); notice.flags=Notification.FLAG_AUTO_CANCEL; Intent appIntent = new Intent(Intent.ACTION_MAIN); //appIntent.setAction(Intent.ACTION_MAIN); appIntent.addCategory(Intent.CATEGORY_LAUNCHER); appIntent.setComponent(new ComponentName(this.getPackageName(), this.getPackageName() + "." + this.getLocalClassName())); appIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);//關鍵的一步,設置啟動模式 PendingIntent contentIntent =PendingIntent.getActivity(this, 0,appIntent,0); notice.setLatestEventInfo(this,"通知","信息:"+msg, contentIntent); barmanager.notify(STATUS_BAR_ID,notice); } 通過上面的代碼你可以實現上面的功能了 但是另一位博主實現這個的時候有一個問題,我沒有測試過 她說 ((( 在真測試時會遇到一個問題:當你安裝包在手機上安裝時(不是連接在電腦上用Run As運行的), 安裝完成后點擊 【打開】按鈕進入程序后,再點擊通知欄上的圖標,就會導致運行一個新的Activity,而且原來運行的Activity也在運行。 這種問題只會出現在第一次安裝后立即運行時,但是覆蓋安裝並不會有這樣的情況。我也還找不到辦法解決,如果有朋友解決了 分享下。))) 不知道這個問題怎么解決 有網友說“再加一個模式吧。Intent.FLAG_ACTIVITY_CLEAR_TOP“,我沒有測試過 不知道可行否
另外這里可能也要設置一下比較好:
這里需要在配置文件中設置每個Activity以單任務運行,否則,每次返回原Activity時會新增加一個Activity,而不會返回到原Activity。 在使用FLAG_ACTIVITY_NEW_TASK控制標識時也會出現不會返回到原Activity的現象。如果該標識使一個Activity開始了一個新的Task,然后當用戶按了HOME鍵離開這個Activity,在用戶按下BACK鍵時將無法再返回到原Activity。一些應用(例如Notification)總是在一個新的Task里打開Activity,而從來不在自己的Task中打開,所以它們總是將包含FLAG_ACTIVITY_NEW_TASK的Intent傳遞給startActivity()。所以如果有一個可以被其他的東西以這個控制標志調用的Activity,請注意讓應用程序有獨立的回到原Activity的方法。 代碼如下: <activity android:name="ShowMessageActivity" android:launchMode="singleTask"></activity> 這里需要注意的是: <activity>下的launchMode屬性可以設置四種啟動方式: standard (默認模式) singleTop singleTask singleInstance
更詳細看原博文是http://www.cnblogs.com/hanyonglu/archive/2012/04/15/2450551.html
先貼上,明天實踐測試后貼上實際實現方法。
在網上找來找去,找到的文章好像說的挺難的樣子,以上的方法經測試是沒用的,然后我仔細翻了各flag標記,發現這條Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY讓我眼前一亮,不過經過測試我也不清楚管不管用,因為我的需求並不是為了顯示它,而是因為我的應用在關閉時遇到了問題:關閉后重新打開還會進入歷史activity上。
其實如果沒有特別的需要,什么flag都不加也可以,我的需求是因為程序有退出按鈕,要將應用完全退出,也是挺麻煩的,經過多種方法n次測試發現在api level8以下只能用activityManager.restartPackage(packname)關閉,在android4.x系統發現這種方法不行,官方文檔也已拋棄這個方法改成actManager.killBackgroundProcesses,不過如果你想兼容各版本,就不能用這個方法了,后來我想用home鍵功能返回主界面,方法:
Intent intent = new Intent(Intent.ACTION_MAIN); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); //這是我加的,我以為這樣可以清掉所有歷史activity ntent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); finish();
測試的結果卻是:從通知欄打開應用后這種退出方法並不能退出所有歷史activity,所以從通知欄打開應用可以說它也是新建了task的,而Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET也沒有起到我想的作用,或者說它只清了當前的task,因為當我把通知欄打開的activity設為android:launchMode="singleTask"(AndroidManifest.xml上)時,退出后它似乎清除了所有activity,就是說通知欄打開應用時它沒有新建task了?反正功能是達到了我的需求,看來貌似通知欄打開應用會默認新建task的流程是不能改的,只能改它打開的activity的特性