如何在onNewIntent()中捕获新的Intent?

44

我想将一个新的但不同的Intent传递给Activity。如何区分新的Intent和以前的Intent?onNewIntent()应该放什么样的代码?一个例子会非常有帮助。

我想要向一个Activity传递一个新的Intent,这个Intent与之前的Intent有所不同。如何区分新Intent和之前的Intent?在`onNewIntent()`方法中应该编写什么代码?一个示例将非常有帮助。
5个回答

93
新的意图是作为onNewIntent(Intent)的一部分而出现的。原始的Intent仍然可以通过getIntent()获得。
您需要将您需要的任何代码放入onNewIntent中,以便使用新参数更新UI;可能类似于您在onCreate中所做的操作。
此外,您可能希望在onNewIntent中调用setIntent(intent),以确保在Activity生命周期内未来对getIntent()的任何调用都能获取最新的Intent数据。

谢谢,当调用该Activity时,控制直接转到onNewIntent()函数? - user588132
如果您触发了一个意图(Intent),导致现有的活动被重复使用,那么是的。 - Christopher Orr
@ChristopherOrr 我的 onNewIntent() 从未被启动过,你能否与我分享一些想法? - Beeing Jk

24

意图如何到达您的活动取决于启动模式(请参阅启动模式文档,网址为http://developer.android.com/guide/topics/manifest/activity-element.html#lmode)。

  • 对于“ standard”(默认值)的启动模式,使用新意图的startActivity将导致在新实例的活动中创建onCreate和该意图。

  • 对于“ singleTop”和“ singleTask”启动模式,使用新意图的startActivity将导致以下结果之一

a)如果该活动未运行,则使用该意图创建一个新实例的活动,并在其中创建onCreate [与上述“ standard”相同];或者 b)如果该活动已经在运行,则在现有活动中使用该意图创建onNewIntent。

对于b),第二个意图在onNewIntent参数中可用。您对其的处理取决于您的应用程序。某些应用程序只会忽略它,而其他应用程序将执行setIntent()并开始重新初始化/更新新意图的处理。


2
目前我正在使用singleTask,但是根据日志,我的代码中两种方法都没有被触发... :( - user170317

13

你所调用的活动-主活动

public class MainActivity extends Activity
{
    public void onCreate(Bundle SavedInstanceState)
    {
    }

    @Override
    protected void onNewIntent(Intent intent) 
    {
        super.onNewIntent(intent);
        if(intent.getStringExtra("methodName").equals("myMethod"))
        {
            myMethod();
        }
    }

    public void myMethod()
    {
    }
}

您的调用活动

代码返回到上一个意图

public class CallingActivity extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        Intent i=new Intent(this,MainActivity.class);
        i.putExtra("methodName","myMethod");//goes to previous INtent
        startActivity(i);//will trigger only myMethod in MainActivity
    }
}

您的调用活动

代码使用此类意图启动新活动

public class CallingActivity extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        Intent i=new Intent(this,MainActivity.class);
        startActivity(i);//will trigger New Activity i.e. MainActivity
    }
}

根据您的解释,MainActivity中的protected void onNewIntent(Intent intent)未被触发。您能否根据我的代码给出一些示例?感谢您的帮助。 - user170317
1
@Vikalp Patel,你的代码非常有趣和有用,但是你在代码中使用了3个不同版本的“mymethod”字符串。你能否纠正一下这个问题呢?或者这些不同大小写的字符串是有意为之的?你使用了“Mymethod”,“mymethod”和“myMethod”。 - user280109


0

如果您不希望在每个后续的onResume()中重复使用新的意图,我建议您将意图存储在实例字段中,而不是通过setIntent(intent)

这样,一旦您使用了该意图,就可以将该实例字段重置为null,而不会丢弃原始启动意图。

更多详细信息请参见我的答案: https://dev59.com/NGsz5IYBdhLWcg3wpZry#21261404

setIntent(Intent)已被Android框架工程师描述为一个错误: https://groups.google.com/forum/#!topic/android-developers/vrLdM5mKeoY


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接