当前位置:   article > 正文

Android lunchMode singleTask模式,home 键之后回到首页_android home 后自动返回了首页

android home 后自动返回了首页

背景

我们的welcome 页面是singleTask 的。启动之后,到主页面,home 键之后,是可以回到正常的主页面。

是因为:我们welcome 页面启动之后就销毁了,从堆栈消失了。然后我点击桌面,虽然启动的是welcome,但是我在onCreate 里面,判断了从哪里来的,如果是的话,就finish welcome。根本不影响原来的堆栈。
但是如果不finish 原来的activity ,那么点击桌面肯定会把之前的页面全部从堆栈清除掉。就会出现,点击回去之后,用户的状态全没有了。你在onNewIntent 里面写东西也白搭,因为已经把之前的activity 清除了。

相关的finish 的代码是:

if(getIntent() != null && (getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0 && initLauncherFlag(getIntent())){
			finish();
}
  • 1
  • 2
  • 3

后来我调研的时候,出现了一个问题,当时我没有看log,不知道进程死了,我还以为没有跳转。log 如下:

  Process: com.ireader.plug.sdk, PID: 5301
    android.util.SuperNotCalledException: Activity {com.ireader.plug.sdk/com.ireader.plug.sdk.activity.MainActivity} did not call through to super.onCreate()
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2568)
  • 1
  • 2
  • 3

原因是:

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		if(getIntent() != null && (getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0 && initLauncherFlag(getIntent())){
			finish();
			return;
		}
		super.onCreate(savedInstanceState);
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

我这里没有执行super.onCreate(savedInstanceState);需要改一下,不管怎么样,都要执行super.onCreate(savedInstanceState);,不然的话你的进程直接就挂了。

改完之后:

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		if(getIntent() != null && (getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0 && initLauncherFlag(getIntent())){
			finish();
		}
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

注意:

if(getIntent() != null && (getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0 && initLauncherFlag(getIntent())){
			finish();
		}
  • 1
  • 2
  • 3

上面这个判断在有些手机上是有问题的,比如vivoX9, 主要是他们自己的桌面有自己的修改,Intent 里面的flag 修改了。
我们看下有问题的手机的flag: Integer.toHexString(getIntent().getFlags()) 是 0x10200000
而我们在onCreate 里面的判断是这个flag:
public static final int FLAG_ACTIVITY_BROUGHT_TO_FRONT = 0x00400000;
然后0x10200000 & 0x00400000 肯定不是0.

桌面全新启动应用程序的话,flag 是0x10000000

  /**
     * If set, when sending a broadcast the recipient is allowed to run at
     * foreground priority, with a shorter timeout interval.  During normal
     * broadcasts the receivers are not automatically hoisted out of the
     * background priority class.
     */
    public static final int FLAG_RECEIVER_FOREGROUND = 0x10000000;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

总结:

1.断点调试
2.没思路了要查看logCat

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/144764
推荐阅读