startActivity无法每次都将额外的bundle传递给目标活动

时间:2015-03-04 23:51:05

标签: android

目前,我正在从我的AppWidgetProvider

启动目标活动

AppWidgetProvider的代码

Intent newIntent = new Intent(context, TargetActivity.class);
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
newIntent.putExtra(INTENT_EXTRA_CLICKED_OPTIONS_MENU, R.id.menu_search);
context.startActivity(newIntent);

每次执行启动时,TargetActivity

中都有2个可能的流量
  1. onCreate将被调用,然后是onResume
  2. 只会调用onResume
  3. 我意识到,

    只会调用onResume

    我无法在onResume

    中获得额外的捆绑
    // Code for TargetActivity
    public void onResume() {
        Intent intent = this.getIntent();
        //
        // "extras" always null, if the flow is
        // Widget launch target activity -> target activity onResume
        //
        //
        // "extras" is not null, if the flow is
        // Widget launch target activity -> target activity onCreate -> target activity onResume
        //
        Bundle extras = intent.getExtras();
    }
    

    我有什么方法可以确保,在启动TargetActivity时,我总会得到一个非空的额外包吗?

2 个答案:

答案 0 :(得分:0)

来自launchMode#singleTop

  

“standard”和“singleTop”模式在一个方面彼此不同:每次有“标准”活动的新意图时,都会创建一个新的类实例来响应该意图。每个实例处理一个intent。类似地,也可以创建“singleTop”活动的新实例来处理新意图。 但是,如果目标任务已经在其堆栈顶部具有活动的现有实例,则该实例将接收新意图(在onNewIntent()调用中);未创建新实例。

来自onNewIntent()

  

这是为在其包中将launchMode设置为“singleTop”的活动,或者在调用startActivity(Intent)时客户端使用FLAG_ACTIVITY_SINGLE_TOP标志而调用的。在任何一种情况下,当在活动堆栈的顶部而不是正在启动的活动的新实例重新启动活动时,将在现有实例上使用用于重新启动的Intent调用onNewIntent()它

     

在接收新意图之前,活动将始终暂停,因此您可以指望在此方法之后调用onResume()。

     

请注意,getIntent()仍会返回原始的Intent。您可以使用setIntent(Intent)将其更新为此新Intent。

也就是说,我相信在onNewIntent中实施TargetActivity并使用setIntent()设置当前意图将解决您的问题。

答案 1 :(得分:0)

Activity有一个名为onNewIntent()的方法:

http://developer.android.com/reference/android/app/Activity.html#onNewIntent%28android.content.Intent%29

如果已经创建了Activity并且稍后发送了Intent,则会调用它。看起来这就是你要找的东西。