最近项目有一个需求,就是在自动登录过程中(启动页-->广告页-->首页),需要在广告页添加一个点击图片的事件,然后跳转到到一个二级的广告页,开始要求的的是点击跳转到浏览器,当时没多想就愉快的答应了。后来在实际操作中才发现有个问题,就是点击图片跳转到浏览器之后,二级广告页目前可见,但马上首页就覆盖住这个二级广告页变为可见(ps:此项目之前的逻辑是,在广告页处下载图片并展示,并且在2s后执行自动登录的方法,此方法为框架里的方法,网络请求成功后跳转到首页),但是实际要的效果是,点击广告之后,首页在后台跳转,最终二级广告页可见。想了半天,最终决定二级广告页跳转到一个带WebView的Activity里,并将Activity设置成singleInstance的启动模式。
先复习一下,Activity的四种启动模式
- standard:标准启动模式(默认启动模式),每次都会启动一个新的activity实例。
- singleTop:单独使用使用这种模式时,如果Activity实例位于当前任务栈顶,就重用栈顶实例,而不新建,并回调该实例onNewIntent()方法,否则走新建流程。
- singleTask:这种模式启动的Activity只会存在相应的Activity的taskAffinit任务栈中,同一时刻系统中只会存在一个实例,已存在的实例被再次启动时,会重新唤起该实例,并清理当前Task任务栈该实例之上的所有Activity,同时回调onNewIntent()方法。
- singleInstance:这种模式启动的Activity独自占用一个Task任务栈,同一时刻系统中只会存在一个实例,已存在的实例被再次启动时,只会唤起原实例,并回调onNewIntent()方法。
通过对比这四种启动模式,很容易看出用singleInstance这种启动模式可以满足需求。我们可以这样做,将此WebView的Activity的启动模式设置为singleInstance,然后在首页onCreate()方法中再次调起此Activity,就可以使其在二级页面时处于可见。可是还有一个问题,如果在首页每次都调起WebView的Activity,显然也不是我们都想要的,于是我们可以在调起时添加一个判断,即在任务栈中是否存在WebView的Activity的实例,存在则调起(只有在点击广告页之后才会跳转二级页面,即生成此实例)。
部分代码如下:
二级广告页
public class ADWebActivity extends WebBaseHttpActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
}
复制代码
自动登录页
public class AutoLoginActivity_JL extends AutoLoginActivity{
...
@Override
public void onClick(View view) {
super.onClick(view);
if (view.getId() == R.id.ad_image) {
if (!TextUtils.isEmpty(adWebUrl)) {
stopCountDown();
AutoLogin();
goToWeb(adWebUrl);
}
}
}
/**
* 跳转H5
* @param webUrl
*/
public void goToWeb(String webUrl) {
Intent intent = new Intent(context, ADWebActivity.class);
intent.putExtra(WebValues.isBackShow, true);
intent.putExtra(WebValues.navigationBarDefaultBgColor, context.getResources().getColor(R.color.navigation_background_color));
intent.putExtra(WebValues.loadWebUrl, webUrl);
startActivity(intent);
}
}
复制代码
首页
public class MainActivityxJL extends MainActivityx {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (isADWebFront()) {
Intent intent = new Intent(context, ADWebActivity.class);
startActivity(intent);
}
}
private boolean isADWebFront() {
for (Activity activity : App.listActivitys) {
if (activity.getClass().equals(ADWebActivity.class)) {
return true;
}
}
return false;
}
}
//每次新建一个Activity,都将其实例添加到App.listActivitys
public class App extends Application {
public static List<Activity> listActivitys = new ArrayList();
}
复制代码