閱讀780 返回首頁    go 阿裏雲 go 技術社區[雲棲]


onNewIntent調用時機 (ANDROID)

在IntentActivity中重寫下列方法:onCreate onStart onRestart  onResume  onPause onStop onDestroy  onNewIntent
一、其他應用發Intent,執行下列方法:
I/@@@philn(12410): onCreate
I/@@@philn(12410): onStart
I/@@@philn(12410): onResume

發Intent的方法:
Uri uri = Uri.parse("philn://blog.163.com");
Intent it = new Intent(Intent.ACTION_VIEW, uri);   
startActivity(it);

二、接收Intent聲明:
 <activity android:name=".IntentActivity" android:launchMode="singleTask"
                  android:label="@string/testname">
             <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="philn"/>
            </intent-filter>
  </activity>

三、如果IntentActivity處於任務棧的頂端,也就是說之前打開過的Activity,現在處於
I/@@@philn(12410): onPause
I/@@@philn(12410): onStop 狀態的話
其他應用再發送Intent的話,執行順序為:
I/@@@philn(12410): onNewIntent
I/@@@philn(12410): onRestart
I/@@@philn(12410): onStart
I/@@@philn(12410): onResume

 

在Android應用程序開發的時候,從一個Activity啟動另一個Activity並傳遞一些數據到新的Activity上非常簡單,但是當您需要讓後台運行的Activity回到前台並傳遞一些數據可能就會存在一點點小問題。

首先,在默認情況下,當您通過Intent啟到一個Activity的時候,就算已經存在一個相同的正在運行的Activity,係統都會創建一個新的Activity實例並顯示出來。為了不讓Activity實例化多次,我們需要通過在AndroidManifest.xml配置activity的加載方式(launchMode)以實現單任務模式,如下所示:


1 <activity android:label="@string/app_name" android:launchmode="singleTask"android:name="Activity1">

2 </activity>


launchMode為singleTask的時候,通過Intent啟到一個Activity,如果係統已經存在一個實例,係統就會將請求發送到這個實例上,但這個時候,係統就不會再調用通常情況下我們處理請求數據的onCreate方法,而是調用onNewIntent方法,如下所示:


1 protected void onNewIntent(Intent intent) {

2   super.onNewIntent(intent);

3   setIntent(intent);//must store the new intent unless getIntent() will return the old one

4   processExtraData();

5 }


不要忘記,係統可能會隨時殺掉後台運行的Activity,如果這一切發生,那麼係統就會調用onCreate方法,而不調用onNewIntent方法,一個好的解決方法就是在onCreate和onNewIntent方法中調用同一個處理數據的方法,如下所示:


01 public void onCreate(Bundle savedInstanceState) {

02   super.onCreate(savedInstanceState);

03   setContentView(R.layout.main);

04   processExtraData();

05 }

06  

07 protected void onNewIntent(Intent intent) {

08   super.onNewIntent(intent);

09   setIntent(intent);//must store the new intent unless getIntent() will return the old one

10   processExtraData()

11 }

12  

13 private void processExtraData(){

14   Intent intent = getIntent();

15   //use the data received here

16 }



一、onNewIntent(Intent intent)方法

該方法是activity的一個保護類型的方法,利用已有的Acivity去處理別的Intent時,你就可以利用onNewIntent來處理,通常被用在有搜索請求的activity,而其該activity有好幾個intent-filter,該方法被調用的前提
a、該activity設置如下屬性 android:launchMode="singleTop"。
b、該activity已經處在棧的頂端,通過其他的方法又重新啟動該acitvity時被調用,如搜索,這時oncreate()方法不調用。

在這個例子中onNewIntent(Intent intent) 用來處理所有的Intent,在oncreate()方法中也認為調用了onNewIntent(getIntent());

[java] view plaincopy
  1. public void onNewIntent(Intent intent) {  
  2.         final String action = intent.getAction();  
  3.         if (Intent.ACTION_SEARCH.equals(action)) {  
  4.             // Start query for incoming search request  
  5.             String query = intent.getStringExtra(SearchManager.QUERY);  
  6.             startNavigating(query, true);  
  7.   
  8.         } else if (Intent.ACTION_VIEW.equals(action)) {  
  9.             // Treat as internal link only if valid Uri and host matches  
  10.             Uri data = intent.getData();  
  11.             if (data != null && ExtendedWikiHelper.WIKI_LOOKUP_HOST  
  12.                     .equals(data.getHost())) {  
  13.                 String query = data.getPathSegments().get(0);  
  14.                 startNavigating(query, true);  
  15.             }  
  16.         } else {  
  17.             // If not recognized, then start showing random word  
  18.             startNavigating(nulltrue);  
  19.         }  
  20.     }  

 

二、URI數據匹配

一個 Intent 可以通過 URI 攜帶外部數據給目標組件。在 <intent-filter >節點中,通過 <data/>節點匹配外部數據。

mimeType 屬性指定攜帶外部數據的數據類型,scheme 指定協議,host、port、path 指定數據的位置、端口、和路徑。如下:

[java] view plaincopy
  1. <data android:mimeType="mimeType" android:scheme="scheme"  
  2. android:host="host" android:port="port" android:path="path"/>  

如果在 Intent Filter 中指定了這些屬性,那麼隻有所有的屬性都匹配成功時 URI 數據匹配才會成功。

該例子中通過String.format("<a href=/"%s://%s/$1/">$1</a>", WIKI_AUTHORITY, WIKI_LOOKUP_HOST)));把鏈接格式化成<a href="wiktionary://lookup/ah">ah</a>形式的,這樣就可以和配置文件中的data相匹配。


最後更新:2017-04-03 12:55:18

  上一篇:go Object reference not set to an instance of an object.
  下一篇:go android仿ios開關按鈕