关于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