關於onNewIntent的使用


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

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

   //清單文件Manifast部分內容
       <activity
            android:name=".MainActivity"
            android:label="@string/app_name" 
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
         <activity
            android:name=".MainTwoActivity"
            android:label="@string/app_name">
        </activity>
package com.itheima.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        processExtraData();
    }
    
    public void clickText(View view){
        Intent intent = new Intent(this,MainTwoActivity.class);
        startActivity(intent);
    }
    
    @Override
    protected void onRestart() {
        Log.i("test","onRestart...");
        super.onRestart();
    }
    
    @Override
    protected void onNewIntent(Intent intent) {
        Log.i("test","onNewIntent...");
        setIntent(intent);
        processExtraData();
        super.onNewIntent(intent);
    }
    
    private void processExtraData(){
        String value = getIntent().getStringExtra("test");
        Log.i("test","value===>"+value);
    }
}
package com.itheima.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainTwoActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two_main);
    }
    
    public void clickTwoText(View view){
        Intent intent = new Intent(this,MainActivity.class);
        intent.putExtra("test","hello...");
        startActivity(intent);
    }
}

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

(1).正常流程:  第一個Activity啟動,再啟動第二個Activity,再啟動第一個Activity,結果如下:

03-29 14:39:22.888: I/test(24340): value===>null
03-29 14:39:25.763: I/test(24340): onNewIntent...
03-29 14:39:25.763: I/test(24340): value===>hello...
03-29 14:39:25.765: I/test(24340): onRestart...

(2).特殊流程: 第一個Activity啟動,再按下home房子鍵,再立即重新啟動應用(避免后台進程被殺死)

03-29 14:42:12.790: I/test(24340): value===>null
03-29 14:42:16.715: I/test(24340): onNewIntent...
03-29 14:42:16.715: I/test(24340): value===>null
03-29 14:42:16.716: I/test(24340): onRestart...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM