1. 程式人生 > >Android 建立通知Notification,並返回到主頁面的那些事

Android 建立通知Notification,並返回到主頁面的那些事

自Android  6.0以後,Google對通知的使用進行了一些改變,它移除了之前 Notification.setLatestEventInfo()  方法。改用 Notification.Builder 類來構建通知,並且要重複更新通知,只需要重複使用 Notification.Builder 例項,呼叫build()方法,獲取Notification例項,因此就參照官方的文件(https://developer.android.com/guide/topics/ui/notifiers/notifications.html)來開始構建通知,並且顯示,點選什麼的都沒有問題。

看到這裡是不是感覺這也太簡單了,完全沒有難度麼,誰曾想樂極生悲,出問題了,整了半天,也沒有解決。(如果看到這的同學有類似問題,且已經解決了,就請拉兄弟我一把,共有一下你的解決方案,鄙人將不勝感激!)下面就將發生的問題列舉一二,以做記錄,便於以後溫故知新。


情景:在首頁啟動一條通知然後點選通知跳轉以後再返回到首頁:

按照官方給的方法是這個樣子實現:

        // Create an Intent for the activity you want to start
        Intent intent = new Intent(this, RetrunStackDetails.class);
        // Create the TaskStackBuilder and add the intent, which inflates the back stack
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addNextIntentWithParentStack(intent);
        // Get the PendingIntent containing the entire back stack
        PendingIntent pendingIntent =
                stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, "home")
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("進入App堆疊的通知")
                .setStyle(new NotificationCompat.BigTextStyle()
                        .bigText("請注意,這是一個在返回的時候會返回到指定頁面上去的通知。"))
                .setContentIntent(pendingIntent)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setAutoCancel(true);

        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
        notificationManager.notify(2, mBuilder.build());

並且在AndroidManifest.xml裡面宣告ReturnStackDetails的屬性包含:android:parentActivityName=".MainActivity",一執行,妥妥的實現了該需求,so easy麼。但是,等返回到MainActivity以後,問題來了,因為我是用handle.postDelayed來模擬通知的建立,所以在狀態列裡面剛才的通知又被建立了一次。這不成啊,我都點過了,你在給我建立一次,是什麼鬼,MainActivity可還是設定了android:launchMode="singleTask"的啟動模式呢,我就懷疑可能MainActivity是不是被銷燬然後又建立了一次。於是乎,我就在把Log資訊列印了出來,一看,懷疑的沒錯,在使用這種方式建立的通知,點選跳轉的時候,是會執行MainActivity

的onDestroy方法,即使設定了啟動模式也沒有什麼用,下面是Log的輸出資訊:


這下好了,你這隻要點開通知,在返回MainActivity,你給我建立一個新的,如果我的MainActivity裡面載入的東西比較多,這不是直接被搞壞了。

於是為了繼續完善這個需求,我就折騰出了另一種方法,通知的跳轉,依然使用常規方式實現,只是在通知跳轉的RetrunStackDetails頁面裡面重寫了onBackPressed方法,想著這樣子,你總該能繼續回到MainActivity了吧,也應該不會再重新建立MainActivity了吧,一陣猛改:

	Intent intent = new Intent(this, RetrunStackDetails.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, "home")
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("進入App堆疊的通知")
                .setStyle(new NotificationCompat.BigTextStyle()
                        .bigText("請注意,這是一個在返回的時候會返回到指定頁面上去的通知。"))
                .setContentIntent(pendingIntent)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setAutoCancel(true);
        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
        notificationManager.notify(2, mBuilder.build());

然後一執行,你妹的,這啥啊,怎麼還是不行,依然跟上面的執行方式一模一樣的,我就醉了,難道這樣子的需求是不合理的,沒有辦法實現的。。。然後我就有各種猛改和查資料(過程不足以向外人道也,苦逼的很),還是沒有解決掉。

怎麼辦呢,我就再想,是不是機子的問題呢(很明顯我這已經開始摔鍋了,嘿嘿),我就換了一個機子,一執行,MMP,竟然好了,能愉快的返回到MainActivity,也不會在重新建立MainActivity了。下面是Log的輸出資訊:


然後,我就又仔細檢查程式碼,我靠,簡直一樣樣的程式碼行不行,為啥剛才的機子就是不行呢,一怒之下,怒卸App,然後再執行,奇蹟出現了,它就這麼好了,就這麼好了,就這麼好了。但是至於為啥會這樣,完全是一點想法都沒,猜不透

於是,記錄下該情景,以做記錄,在以後回顧的時候能溫故知新,搞明白這個問題,亦或者偶然之間遇到有同學看到這個問題且解決了,希望同學您能分享一下,讓我也學習學習,多謝。

同時記錄兩個連結:

1.可以解決先啟動A品牌,在進入通知頁面的連結:https://www.cnblogs.com/woaixingxing/p/7239727.html

2.從Notification啟動intent導致Activity無法複用的問題:http://blog.csdn.net/nzfxx/article/details/52293181