天天看点

Android实现不重复启动APP的方法

    现在市场上的应用大部分在打开时都不会打开两个实例,类似QQ,因为该种方式的体验性不好。

如:在打开QQ客户端时,进入到联系人界面,此时我们再按HOME键,此时会出现返回桌面的情况,当我们再次打开应用的时候(点击QQ客户端图标或者在最近任务中打开),都会依然显示我们当时退出的界面,即:联系人界面,而不是重新启动时出现的界面。

实现该类效果一般有3种方法可以实现:

1、在配置文件中,在根Activity加上上面配置,即根Activity就是默认启动的Activity,而不是一般的欢迎界面SplashActivity或者主界面MainActivity。

android:alwaysRetainTaskState="true"
           
Android实现不重复启动APP的方法

注:默认的情况没有做设置,默认启动原始Activity,没有上面的效果。

Android:alwaysRetainTaskState,总是保留任务栈的状态。Task指得就是任务栈,用于记录Activity的打开顺序,保留状态等。

如:打开客户端一般顺序是SplashActivity-->GuideActivity -->MainActivity,那么此时任务栈的状态就是下图所示情况:

Android实现不重复启动APP的方法

当我们在MainActivity页面按HOME键退出时,此时任务栈的状态继续保存下来,当再次打开是系统就会自动判定是否存在以设置根Activity为根的Activity的栈,如有,则使用该栈顶的Activity。

2、设置调用moveTaskToBack(boolean)

public void onBackPressed(){

    /**
     * 返回上一次停留页面
     */
    moveTaskToBack(true);
}
           

该方法的不足之处就是当用户安装了多个桌面应用的时候,可能会出现对话框提示,以选择一个应用运行。

该方法不会改变task中的Activity中的顺序,当用户按返回键是不希望程序退出(默认是finish),而是希望在后台运行,该种方法是一个不错的选择。此时的程序虽然已经退出,但进程并没有被杀死。

3、设置意图FLAG_ACTIVITY_NEW_TASK。设置此状态,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的Activity的亲和性是一样的),如有,则直接把刚刚这个栈整体移动到前台,并保持栈中的Activity的顺序不变,如果没有,则新建一个栈存放被启动的Activity。

亲和性相同:

Activity A启动开辟Task堆栈(堆栈状态为A),在Activity A中启动Activity B,启动Activity B的Intent的Flag设置为FLAG_ACTIVITY_NEW_TASK,Activity B被压入Activity A所在的堆栈,堆栈状态为AB,此时A和B的亲和性相同,并出现在同一个栈中。

public void onBackPressed(){

    /**
     * 返回系统默认页面
     */
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}

           

该方式是将整个任务栈放在后台进行,与方式2不同的是,方法2是返回默认的桌面页面,方法3是返回上次桌面停留的页面。

Good luck!

Write by Jimmy.li