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());
- public void onNewIntent(Intent intent) {
- final String action = intent.getAction();
- if (Intent.ACTION_SEARCH.equals(action)) {
- // Start query for incoming search request
- String query = intent.getStringExtra(SearchManager.QUERY);
- startNavigating(query, true);
- } else if (Intent.ACTION_VIEW.equals(action)) {
- // Treat as internal link only if valid Uri and host matches
- Uri data = intent.getData();
- if (data != null && ExtendedWikiHelper.WIKI_LOOKUP_HOST
- .equals(data.getHost())) {
- String query = data.getPathSegments().get(0);
- startNavigating(query, true);
- }
- } else {
- // If not recognized, then start showing random word
- startNavigating(null, true);
- }
- }
二、URI數據匹配
一個 Intent 可以通過 URI 攜帶外部數據給目標組件。在 <intent-filter >節點中,通過 <data/>節點匹配外部數據。
mimeType 屬性指定攜帶外部數據的數據類型,scheme 指定協議,host、port、path 指定數據的位置、端口、和路徑。如下:
- <data android:mimeType="mimeType" android:scheme="scheme"
- 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