欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android onNewIntent()触发机制及注意事项

程序员文章站 2024-03-05 17:05:55
一、onnewintent() 在intentactivity中重写下列方法:oncreate onstart onrestart  onresume ...

一、onnewintent()

在intentactivity中重写下列方法:oncreate onstart onrestart  onresume  onpause onstop ondestroy  onnewintent

1、其他应用发intent,执行下列方法:

oncreate
onstart
onresume

发intent的方法:

uri uri = uri.parse("philn://blog.163.com");
intent it = new intent(intent.action_view, uri);  
startactivity(it);

2、接收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>

3、如果intentactivity处于任务栈的顶端,也就是说之前打开过的activity,现在处于onpause、onstop 状态的话,其他应用再发送intent的话,执行顺序为:

onnewintent,onrestart,onstart,onresume。

在android应用程序开发的时候,从一个activity启动另一个activity并传递一些数据到新的activity上非常简单,但是当您需要让后台运行的activity回到前台并传递一些数据可能就会存在一点点小问题。

首先,在默认情况下,当您通过intent启到一个activity的时候,就算已经存在一个相同的正在运行的activity,系统都会创建一个新的activity实例并显示出来。为了不让activity实例化多次,我们需要通过在androidmanifest.xml配置activity的加载方式(launchmode)以实现单任务模式,如下所示:

<activity android:label="@string/app_name" android:launchmode="singletask"android:name="activity1"></activity>

launchmode为singletask的时候,通过intent启到一个activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统就不会再调用通常情况下我们处理请求数据的oncreate方法,而是调用onnewintent方法,如下所示:

protected void onnewintent(intent intent) {

 super.onnewintent(intent);

 setintent(intent);//must store the new intent unless getintent() will return the old one

 processextradata();

}

不要忘记,系统可能会随时杀掉后台运行的 activity ,如果这一切发生,那么系统就会调用 oncreate 方法,而不调用 onnewintent 方法,一个好的解决方法就是在 oncreate 和 onnewintent 方法中调用同一个处理数据的方法,如下所示:

public void oncreate(bundle savedinstancestate) {

 super.oncreate(savedinstancestate);

 setcontentview(r.layout.main);

 processextradata();

}
protected void onnewintent(intent intent) {

 super.onnewintent(intent);

  setintent(intent);//must store the new intent unless getintent() will return the old one

 processextradata()

}
private void processextradata(){

 intent intent = getintent();

 //use the data received here

}
 

二、onnewintent()的setintent()和getintent()

@override
protected void onnewintent(intent intent) {
 super.onnewintent(intent);

 // setintent(intent);

 int data = getintent().getintextra("haha", 0);
 // int data = intent.getintextra("haha", 0);
}

如果没有调用setintent(intent),则getintent()获取的数据将不是你所期望的。但是使用intent.getinxxx,貌似可以获得正确的结果。

注意这句话:

note that getintent() still returns the original intent. you can use setintent(intent) to update it to this new intent.

所以最好是调用setintent(intent),这样在使用getintent()的时候就不会有问题了。

以上就是对android onnewintent()触发机制及注意事项 的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!