详解Activity之singletast启动模式及如何使用intent传值

 更新时间:2015年11月04日 11:13:58   投稿:mrr  
在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中

Activity的四种启动模式:

    1. standard

        模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。

    2. singleTop

        如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。

    3. singleTask

        如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

    4. singleInstance

在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。

因为项目中,有一个消息推送的功能,每次推送一个消息,就会开启FunctionActivity,那么为了避免重复开启它,在退后的时候,多次出现该Activity,就将该Activity的启动模式变为singleTask。

这样在之后的多次启动该Activity,便会调用onNewIntent(Intent intent)方法。

activity通过intent传递数据的时候,如果activity未启动,那么 在这个刚启动的activity里通过getIntent()会获取到这个intent的数据.如果要启动的activity是已经存在的,这时候通过 getInten()方法获取到的intent是已启动的activity的原始intent.换句话说intent的数据没有更新.这样在已启动的 activity里拿到的intent的数据是旧数据.如果要每次获取intent传来的新数据就需要在onNewIntent(Intent intent)方法里调用setIntent(intent)设置这个传来的最新的intent.如下所示:

 @Override
 protected void onNewIntent(Intent intent) {
 super.onNewIntent(intent);
 Log.e("tag", "onNewINtent执行了");
 setIntent(intent);
 String ringName = intent.getStringExtra("ringName");
 Log.e("tag", ringName+"传过来的值");
 if (ringName != null) {
 pager.setCurrentItem(1);
 }
 }

当然,如果activity的启动模式是standard,那么每次都重新创建一个新的activity.这样intent也是最新的.就不用通过setIntent来更新这个intent.

我这个项目中,FunctionActivity中里面是四个Fragment,这样 我从其他Activity跳转到FunctionActivity是不会实例化,通过getIntent()方法也不能获得最新的intent,为了解决 这个办法。还是在onNewIntent方法中,将更新的intent通过getIntent().putExtras(intent);共享出去,如下 所示:

@Override
 protected void onNewIntent(Intent intent) {
 super.onNewIntent(intent);
 Log.e("tag", "onNewINtent执行了");
 setIntent(intent);
 getIntent().putExtras(intent);
 }

这样在与它关联的Fragment中,就可以调用

@Override
 public void onResume() {
 super.onResume();
 // 第一次进入这个页面,下面的方法是不会执行的,因为ringName是null
 String ringName = getActivity().getIntent().getStringExtra("ringName");
 if (ringName != null) {
 newSound.setText(ringName);
 Log.e("tag", ringName + "要保存的值");
 SharedPreferenceUtil.setString(getActivity(),
  SharedPreferenceUtil.RINGTONE_NAME, ringName);
 }
}

注意,这里Fragment调用的时候,一定要在onResume方法中。

相关文章

  • Kotlin基本数据类型详解

    Kotlin基本数据类型详解

    大家好,本篇文章主要讲的是Kotlin基本数据类型详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Android APP性能优化分析

    Android APP性能优化分析

    这篇文章主要给大家讲了Android APP性能优化相关的思考以及优化重点分析,需要的朋友参考下吧。
    2017-12-12
  • Android动画系列之属性动画的基本使用教程

    Android动画系列之属性动画的基本使用教程

    这篇文章主要给大家介绍了关于Android动画系列教程之属性动画的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Android实现边录边播应用

    Android实现边录边播应用

    这篇文章主要为大家详细介绍了Android实现边录边播应用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Android自定义View实现扫描效果

    Android自定义View实现扫描效果

    这篇文章主要为大家详细介绍了Android自定义View实现扫描效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Android仿微信滑动退出Activity

    Android仿微信滑动退出Activity

    这篇文章主要介绍了Android仿微信滑动退出Activity的相关资料,非常不错,具有参考借鉴价值,需要的朋友参考下
    2016-12-12
  • android 检查网络连接状态实现步骤

    android 检查网络连接状态实现步骤

    android 如何检查网络连接状态,是android开发中一个常见的问题,本文将介绍如何实现,需要的朋友可以参考下
    2012-12-12
  • Android编程实现播放MP3功能示例

    Android编程实现播放MP3功能示例

    这篇文章主要介绍了Android编程实现播放MP3功能,结合实例形式分析了Android播放MP3功能的界面布局与功能实现相关操作技巧,需要的朋友可以参考下
    2017-02-02
  • Android使用okHttp(get方式)下载图片

    Android使用okHttp(get方式)下载图片

    这篇文章主要为大家详细介绍了Android使用okHttp(get方式)下载图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android按时间先后顺序获取目录下文件列表

    Android按时间先后顺序获取目录下文件列表

    这篇文章主要为大家详细介绍了Android按时间先后顺序获取目录下文件列表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09

最新评论