Android onNewIntent()触发机制及注意事项
一、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()触发机制及注意事项 的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!
推荐阅读