(转)Activity以singleTask模式启动,intent传值的解决办法

在默认情况下,当通过Intent启动一个activity的时候,就算已经存在一个相同的正在运行的activity,系统都会创建一个新的activity实例并显示出来,新的activity会正常的执行 onCreate( )->onStart( )->onResume( )。

为了不让activity实例化多次,我们一般都会使用单例模式(singleTask),即:在AndroidManifest.xml中配置activity的加载方式(launchMode)以实现单例模式。然后在相应的activity中会用到onNewIntent( )这个函数。

当launchMode为singleTask的时候,通过intent启动一个activity的时候,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate( )方法,而是调用onNewIntent( )方法。

但是不要忘记,系统可能会随时杀掉后台运行的activity(栈上层活动一定会被清空),这个时候系统就会调用onCreate( )方法,而不会调用onNewIntent( )方法,所以,最好在onCreate( )方法也处理相应的方法。

@Override
protected void onCreate(Bundle saveInstanceState){
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  dealWithIntents();
}

//需要注意的是,我们必须按照下边的方式写函数
@Override
protected void onNewIntent(Intent intent) {
   super.onNewIntent(intent);
   setIntent(intent);// 必须要调用这句,这样可以及时的更新intent
   dealWithIntents();
 }

 

以下原文出处:http://blog.csdn.net/harryweasley/article/details/46557827

因为项目中,有一个消息推送的功能,每次推送一个消息,就会开启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方法中。
--------------------- 
作者:HarryWeasley 
来源:CSDN 
原文:https://blog.csdn.net/harryweasley/article/details/46557827 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值