安卓中使用AliasActivity解决应用重复打开

之前遇到一个问题 微信支付完成后要跳转到一个指定的activity 虽然可以给这个activity设置dialog的样式 让它看起来好像是个弹框一样 但是毕竟还是另外的activity 支付后的回调数据无法直接传到调起支付的那个activity 和支付宝支付的逻辑有点不一样 于是我就想 有没有方法可以 给activity起别名 类似linux的硬链接 然后找到了 果然有AliasActivity这个类 但是和想象的不一样额。。。。。。

从源码可以看出来 AliasActivity是继承自Activity的 所谓的别名其实也是很简单的在它的onCreate里面调用startActivity跳转到目标Activity 并吧相关intent里面的data传过去 然后再把自己finish掉 做成一种直接跳转过去的假象 其实这过程中间是有个中间Activity的

AndroidManifest.xml 里面使用如下:

1
<activity-alias android:name=".TestAliasActivity" android:targetActivity=".MainActivity"/>

这样的话 Intent intent=new Intent(this,TestAliasActivity.class); 每次都会跳转到 mainactivity去了 不过首先要新建一个继承自AliasActivity的 TestAliasActivity的类 里面为空也好或者加一些动作反正都没关系 因为继承自Activity 所以大部分Activity的属性都可以用

虽然这个类没有解决前面那个微信支付回调的问题 但是它解决了我另外一个问题

问题回放:

  1. 将应用安装包放到手机里面
  2. 用文件管理器找到然后点击安装,等待安装
  3. 安装完毕,然后这里一般会有两个操作 完成或者打开 , 这里选择点击打开
  4. 打开之后进入应用,不需要其他操作 ,直接按Home键返回桌面,不要清理后台应用
  5. 从桌面或者launcher点击应用图标,

好了, 于是问题出现了
应用会再次重新打开,而不是从后台直接将之前的调出来。如果应用有splash的话效果会比较明显 如果这里再按Home键返回桌面,再次点击图标进入,结果还是重新打开,仔细研究会发现,应用不是重新启动了,而是在原本已经启动的状态下又新启动一次应用,后来去查了这个问题,发现好多都遇到这个问题,原理都很清楚,和安卓应用的task栈相关。 但是好像没有好的解决办法, 修改activyt的launchMode什么的如果应用没有spalsh的话是可以解决的 但是如果有splash 这个方案完全不行 他们说很多应用都有这个问题 我试了一下 果然qq也存在这个问题

但是后来遇到AliasActivity后 发现了一个新的解决方案, 我真机智

1
2
3
4
5
6
7
8
9
10
11
<activity android:name=".SplashActivity" android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"/>
<activity android:name=".HomeActivity" />
<activity-alias   android:name=".SplashAliasActivity"
android:targetActivity=".SplashActivity"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>

这个的话是直接吧AliasActivity作为启动的activity

这个算是一个小技巧吧反正 没什么技术含量