onNewIntent is not called

后端 未结 7 2094
暗喜
暗喜 2020-12-01 05:32

I have very strange situation.
Having one app, I decided to create another one from the code of first one.
I copied .xml files, copied .java files so that everythin

相关标签:
7条回答
  • 2020-12-01 05:55

    PREAMBLE:

    Allright, I'm a little late to this one, but as I stumbled over the same issue and no answer here or for any of the other four stackoverflow questions, I found for this issue, solved the problem for me, here's what I figured out.

    ANSWER:

    There are several possible reasons, why onNewIntent isn't called and I'm gonna list them all - well all of which I know.

    1. As mentioned in many answers before and in the doc for the onNewIntent function (link in Yaroslavs answer), you either need the android:launchMode="singleTop" manifest entry for the activity, where you want onNewIntent to be called, or the Intent used for starting the activity must have the flag FLAG_ACTIVITY_SINGLE_TOP. You don't need both (it's a | aka. logical or not a & aka. logical and )! onNewIntent should also be called for android:launchMode="singleTask", but before you use that, you better check out the android:launchMode documentation, because it has much more consequences, than just one function call.
    2. In older versions of Android there was a bug, which basically prevented android:launchMode="singleTop" from working as specified and thus onNewIntent from being called. The bug was never officially solved, but I couldn't reproduce it in version 4.4.2 (Samsung S4 Mini). So it seems to have been fixed at some point between 4.0.x and 4.4.2.
    3. Not every time the preconditions as mentioned before are fulfilled, onNewIntent will be called. As the documentation of the function states:

      ...when the activity is re-launched while at the top of the activity stack instead of a new instance of the activity being started, onNewIntent() will be called on the existing instance with the Intent that was used to re-launch it."

      That means, if the activity is newly created, onNewIntent won't be called, no matter what launchMode or Intent flags you did set!

      • To my understanding, either onCreate or onNewIntent is called, but never both.
      • So, if you wanna pass data to the activity through the Intent and it should always work (as in my case), no matter if the activity is relaunched or the activity is freshly created, you can do as described in this very useful blog post.
      • As a variation of the solution described in the above blog post, you could also take advantage of the fact, that no matter if onNewIntent or onCreate was called, onResume will always be called afterwards, and do something like this:

        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
        }
        
        @Override
        protected void onResume() {
            super.onResume();
            Intent intent = getIntent();
            // ... do what you wanna do with the intent
        }
        

        For this example getIntent will always get you the Intent you used for the startActivity call or the Notification, as the new Intent will also be set for the Activity, if the Activity is freshly created (and thus onCreate was called).

    POSTAMBLE:

    Sorry for the long post. I hope you found something useful in it.

    0 讨论(0)
提交回复
热议问题