1. 程式人生 > >Android 點選通知欄訊息 跳轉到指定的Fragment介面

Android 點選通知欄訊息 跳轉到指定的Fragment介面

        之前寫過一篇博文,但是實現的效果是通知來了,點選通知欄訊息之後,返回當前位於棧頂的activity或者fragment介面,現在的需求是:當用戶按了home鍵,程式進入後臺之後,這時候有通知進來,需要跳轉到指定的訊息中心fragment介面,之前一直沒有頭緒,後來在國外的網站看到了解決方案,具體需要用到的知識如下:

      1.Android newIntent方法的使用:http://blog.csdn.net/findsafety/article/details/9664061,newIntent方法的使用在於如果activity已經開啟了,並設定了啟動模式為:  android:launchMode="singleTask"的時候,當再次使用intent來啟動這個activtiy的時候就會進入這個方法裡面protected void onNewIntent(Intent intent) ,當在接受通知欄的函式裡面,就可以傳遞引數,在該activity的onnewIntent進行判斷處理,指定需要顯示的fragment介面,如下圖:

    關於onnewintent的部分解釋如下:




      2.Android Fragment 中的狀態儲存解釋:commitAllowingStateLoss()commitAllowingStateLoss(),從名字上就能看出,這種提交是允許狀態值丟失的。到此問題得到完美解決,值的傳遞是你自己控制的。;http://blog.csdn.net/kaiqiangzhang001/article/details/42241441。

       當你瞭解了以上的知識之後,就可以將fragment所繫結的activity按照如下步驟進行設定,實現點選通知欄跳轉到指定介面:

     第一步是:將fragment所繫結的activity的啟動模式設定為:  android:launchMode="singleTask",如下圖:


    第二步:在該activity中新增如下方法,監聽當點選了通知欄,intent進行跳轉時的事件,如下:


      第三步:在接收通知訊息的函式中設定如下程式碼,如下:

	@SuppressWarnings("deprecation")
	private static void generateNotification(Context context, String message)
			throws UnsupportedEncodingException {

		String messagepar = new String(message.getBytes(), "UTF-8");

		int icon = R.drawable.ic_launcher;
		long when = System.currentTimeMillis();
		NotificationManager notificationManager = (NotificationManager) context
				.getSystemService(Context.NOTIFICATION_SERVICE);

		Notification notification = new Notification(icon, messagepar, when);
		String title = context.getString(R.string.app_name);

		Intent intent = new Intent(context,
				client.verbank.mtp.allone.frame.MainActivity.class);//代表fragment所繫結的activity,這個需要寫全路徑
		intent.putExtra("message", StaticContext.MESSAGETOMESSAGE);//傳遞引數,然後根據引數進行判斷需要跳轉的fragment介面

		PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent,
				PendingIntent.FLAG_UPDATE_CURRENT);
		notification.contentIntent = pIntent;

		notification.setLatestEventInfo(context, title, messagepar, pIntent);
		notification.flags |= Notification.FLAG_AUTO_CANCEL;

		int idtify = (int) when;
		notificationManager.notify(idtify, notification);
	}

       這樣就大功告成了,我遇到一個問題是程式開著的時候,是可以跳轉到指定的fragment介面,當點選了home鍵之後,點選通知欄,跳轉時會報錯,原因是因為fragment的commit函式,在程式後臺時無法執行,通過查詢fragment還提供了另一個函式:transaction.commitAllowingStateLoss();這樣就沒有問題了。

    擴充套件知識:

Android中Activity啟動模式詳解 

  在Android中每個介面都是一個Activity,切換介面操作其實是多個不同Activity之間的例項化操作。在Android中Activity的啟動模式決定了Activity的啟動執行方式。 

  Android總Activity的啟動模式分為四種: 

Java程式碼  收藏程式碼
  1. Activity啟動模式設定:  
  2.         <activity android:name=".MainActivity" android:launchMode="standard" />  
  3. Activity的四種啟動模式:  
  4.     1. standard  
  5.         預設啟動模式,每次啟用Activity時都會建立Activity,並放入任務棧中,永遠不會呼叫onNewIntent()。  
  6.     2. singleTop  
  7.         如果在任務的棧頂正好存在該Activity的例項, 就重用該例項,並呼叫其onNewIntent(),否者就會建立新的例項並放入棧頂(即使棧中已經存在該Activity例項,只要不在棧頂,都會建立例項,而不會呼叫onNewIntent(),此時就跟standard模式一樣)。  
  8.     3. singleTask  
  9.         如果在棧中已經有該Activity的例項,就重用該例項(會呼叫例項的onNewIntent())。重用時,會讓該例項回到棧頂,因此在它上面的例項將會被移除棧。如果棧中不存在該例項,將會建立新的例項放入棧中(此時不會呼叫onNewIntent())。   
  10.     4. singleInstance  
  11.         在一個新棧中建立該Activity例項,並讓多個應用共享改棧中的該Activity例項。一旦改模式的Activity的例項存在於某個棧中,任何應用再啟用改Activity時都會重用該棧中的例項,其效果相當於多個應用程式共享一個應用,不管誰啟用該Activity都會進入同一個應用中。  


       大家遇到一個應用的Activity供多種方式呼叫啟動的情況,多個呼叫希望只有一個Activity的例項存在,這就需要Activity的onNewIntent(Intent intent)方法了。只要在Activity中加入自己的onNewIntent(intent)的實現加上Manifest中對Activity設定lanuchMode=“singleTask”就可以。 

       onNewIntent()非常好用,Activity第一啟動的時候執行onCreate()---->onStart()---->onResume()等後續生命週期函式,也就時說第一次啟動Activity並不會執行到onNewIntent(). 而後面如果再有想啟動Activity的時候,那就是執行onNewIntent()---->onResart()------>onStart()----->onResume().  如果android系統由於記憶體不足把已存在Activity釋放掉了,那麼再次呼叫的時候會重新啟動Activity即執行onCreate()---->onStart()---->onResume()等。

     當呼叫到onNewIntent(intent)的時候,需要在onNewIntent() 中使用setIntent(intent)賦值給Activity的Intent.否則,後續的getIntent()都是得到老的Intent。 

        如果還有更好的辦法,請相互交流,非常感謝!!!歡迎轉載!!!

===============================更新時間,2016年3月9日17:08:34==========================================

上述的描述的確是解決了點選了通知欄訊息跳轉到指定的fragment介面,但如果是這樣的情況,當發了一條通知之後,使用者點選退出程式,再次點選通知欄的時候,onnewintent方法進不去,跳轉到主介面activity,由於此時還沒有指定介面,所以會有很多異常,所以我們需要判斷是否已經退出程式,當點選通知欄判斷已經退出程式的時候,跳轉回登陸介面,如下程式碼:

// 當程式退出之後,點選通知欄訊息跳轉時,需要進行判斷是否已經退出,跳轉到登陸介面
		if (!ClientAPI.getInstance().isDocInited()) {
			Intent intentGCM = new Intent(FragmentManagerActivity.this,
					LoginActivity.class);
			startActivity(intentGCM);
		}



相關推薦

Android 通知欄訊息 指定Fragment介面

        之前寫過一篇博文,但是實現的效果是通知來了,點選通知欄訊息之後,返回當前位於棧頂的activity或者fragment介面,現在的需求是:當用戶按了home鍵,程式進入後臺之後,這時候有通知進來,需要跳轉到指定的訊息中心fragment介面,之前一直沒有頭緒

Android 通知欄訊息開啟activity,並判斷app是否執行

android的通知欄訊息點選事件如果是開啟一個activity時,我們要考慮兩種情況: 應用正在前臺執行。 應用已退出。 如果是第一種情況那麼就好處理了,直接為Intent設定flag為FLAG_ACTIVITY_NEW_TASK,然後呼叫context.

Android選單之後到一個新的頁面

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.example.jumpmenuitem"

Android textview數字到系統撥打電話介面

兩種方式: ①xml檔案中直接新增: xml檔案中只需要一句 android:autoLink="phone" 必須加上 android:text="17611642608" 兩個一起使用 <TextView android:id="@+id/

Android Notification 通知欄不能

關於通知欄Notification的使用,不多講,這裡說的很清楚http://www.cnblogs.com/zenfly/archive/2012/02/09/2343923.html 先說下我遇到的問題: 在應用關閉的時候,傳送通知到通知欄,點選通知欄能正常跳轉到我想

關於百度推送通知,的問題(Android

      今天在跟同事測試百度推送,之前一直困擾我的一個問題得到了有效解決,挺高興的,所以記錄一下,同時告誡自己,遇到問題,解決解決再解決,一定能夠解決的!      切入正題,百度推送的demo跟我們的app有些不一樣

外部連結App指定頁面SingleTask模式

1.上一篇講到如何點選外部連結跳轉app的方法,經過測試,當開啟App的時候,點選連結時候會重新開啟一個新的App程序,如果你想從原來的開啟APP跳進去,那麼使用SingleTask模式配合android:taskAffinity屬性一起使用.    如果單獨使用Single

Android中Kotlin的學習(事件、、for迴圈、RecyclerView、回撥)

剛剛學習Kotlin,有什麼不對的地方請見諒。 首先屬性的宣告中有兩個很重要的關鍵字: var  和  val。 例如: var a = "hello" val b = "hello"區別是什麼呢? var可多次分配; val只能一次初始化。 點選事件: xml中View定

微信中安卓手機連結強制預設瀏覽器開啟指定網頁

本文章向大家介紹微信點選網頁連結或者掃一掃二維碼強制跳轉到手機系統瀏覽器開啟指定頁面,主要包括微信點選網頁連結或者掃一掃二維碼強制跳轉到手機系統瀏覽器開啟指定頁面使用例項、應用技巧、基本知識點總結和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下。   現在微信分享的

最簡單的錨定位 a標籤到頁面指定位置

<div id="aaa"> <p>錨點定位的id和我不一樣</p> </div> <div id="bbb"> <p>錨

js實現頁面滾動切換導航欄/導航欄指定位置

最近一直在弄頁面的事情,對頁面方面的知識又鞏固了一下。這次的內容如題,大家對程式碼有疑問或者是有更好的方法歡迎留言!js部分        //標題物件      var title = document.getElementById("title");        //選

EditText 將回車的按鈕顯示為“下一個” 並且“下一個”指定的EditText

只需要設定三個屬性: 第一: android:imeOptions="actionNext"第二:必須要設定,不然還是顯示的是回車的符號android:singleLine="true"第三: and

EditText “下一個”指定的EditText

特別簡單,在xml檔案中的EditText設定兩個引數即可: 1. android:imeOptions="actionNext" 2. android:nextFocusForward="@+id/editText3"// editText3是要跳轉到的EditText

android網頁調起app並且傳參, 網頁高速下載app

我們有時候需要用到在自己的網站上點選高速下載,然後把引數傳到自己的app裡面進行下載。或者在別人的網站點選下載的時候調起我們的app作為下載器進行下載。那麼具體怎麼實現呢?我們分兩種情況: 一、自己的

如何連結直接到app store指定應用下載頁面

NSString *str = [NSString stringWithFormat:@"http://itunes.apple.com/us/app/id%d", 436957167]; [[UIApplication sharedApplication] openURL

檔案,到wps瀏覽

當檔案下載完畢之後,需要進行瀏覽,有兩種方式: 1:使用TBS,即騰訊瀏覽服務,點選開啟連結 2:使用wps,由於專案受制於網路,故使用第二種方式實現,程式碼如下 public class WpsFileUtils { private static boolean isInstall

微信小程式——商品分類到該商品的商品詳情頁面(已實現)

        首先,我不得不感慨下,慕課網上“7七月”老師的課真的很強大,此處放連結https://coding.imooc.com/learn/list/75.html。        我只是學習到了一半就開

側滑(條目進行+更換頭像(二次取樣))+ViewPager

1.Layout佈局 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk

web端 - 返回上一步,返回,上個頁面 JS

1.方法一: <script language="javascript" type="text/javascript"> window.location.href="login.jsp?backurl="+window.location.href; </script>

讓wordpress日誌標題到外部連結實現

    Wordpress實現點選文章標題跳轉到外部連結的方法,有時候出於某些目的的需要,需要在wordpress部落格中實現點選文章標題不直接跳轉轉到文章頁面,而跳轉到外部連結的效果。不過WordP