为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Android

在阅读该篇日志前,先熟悉一下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)以实现单任务模式,如下所示:

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()的时候就不会有问题了。

原文链接:http://www.apkbus.com/blog-673745-59437.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消