如何确定活动是否为堆栈中的最后一个活动

16

我正在我的应用程序中打开一个链接,一旦用户按下返回按钮,我想展示主页以留住用户一段时间。我一直在尝试实现这一点,但无法做到。我得到了homeLauncher活动作为我的顶部和基础活动。

DeepLink 点击 > 打开所需的活动 > 用户按下返回按钮 > 检查是否是最后一个活动但不是homeActivity > 如果是,则将用户导航到 homeActivity。

尝试如下代码:

@Override
public void onBackPressed() {
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);

if(taskList.get(0).numActivities == 1 && taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())){
  //// This is last activity
}
else{
    //// There are more activities in stack
}

super.onBackPressed();
}

Android Studio Evalation

我也尝试了 isTaskRoot,但结果相同。它没有给出正确的答案。请帮忙。


https://dev59.com/2G025IYBdhLWcg3wfmDw - Nouman Ghaffar
@NoumanGhaffar:看一下我的topActivity的图像名称与上一个活动不同。它显示启动器活动作为topActivity。只有当我从deeplinks进入时才会出现这种情况。这个问题特别针对deeplinks。所以我已经尝试了相同的方法,但对我来说没有用。 - user1288005
您正在从任务列表中的第一个任务获取活动计数(如果在新任务中启动,则可能不是您活动的任务)。 - Harish Sharma
请参考此链接:https://dev59.com/M5Dea4cB1Zd3GeqPhdxZ#33828821 - Kishan Soni
如果其他方法都失败了,你可以自己维护这个堆栈,只需要一点点的工作。在你的Application类中添加一个堆栈(假设你有自己的Application类),并且每次在你的活动的onCreate中将该活动放入应用程序的堆栈中,在onDestroy()中弹出它们。这样,你就可以检查活动的状态。 - kha
5个回答

5
使用isTaskRoot()方法。(来自h9kdroid评论-这里
@Override
public void onBackPressed() {
   ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
   List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);

   if(isTaskRoot()){
     //// This is last activity
   } else{
     //// There are more activities in stack
   }

   super.onBackPressed();
}

isTaskRoot方法返回堆栈中的第一个活动的值为true:https://developer.android.com/reference/android/app/Activity#isTaskRoot%28%29 - Adam Johns

2
您可以简单地使用ActivityManager,它会跟踪哪个活动存在和不存在。这是我偶然发现并一直在使用的代码片段:
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );

List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);

if(taskList.get(0).numActivities == 1 &&
 taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
Log.i(TAG, "This is last activity in the stack");
}

1

引用自ActivityManager.RunningTaskInfo

您可以检索有关当前在系统中“运行”的特定任务的信息。请注意,正在运行的任务并不意味着给定任务实际上具有正在积极运行的进程;它仅仅意味着用户已经打开了它但从未关闭它,但是当前系统可能已经杀死了它的进程,并且只保留其最后状态以便在用户返回时重新启动它。

                   String getLastOpenClass ;// Global 

                    ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
                    List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);
                    ComponentName componentInfo = taskInfo.get(0).topActivity;
                    componentInfo.getPackageName();
                    getLastOpenClass=taskInfo.get(0).topActivity.getClassName();
                    if(getLastOpenClass.equals("Your_Class_Name"))
                    {

                    }else{

                    }

给予权限

<uses-permission android:name="android.permission.GET_TASKS" />

ActivityManager会记录正在运行的任务和最上面的任务。

       ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
       List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);

      if(taskList.get(0).numActivities == 1 && taskList.get(0).topActivity.getClassName().equals(this.getClass().getName()))
      {
        Log.i(TAG, "This is Last activity in the stack");
      }

请参考 如何检查应用程序中的活动是否是最后一个活动堆栈?

请检查 如何获取当前前台活动包名称

http://developer.android.com/intl/es/reference/android/app/ActivityManager.html#getRunningTasks%28int%29


https://dev59.com/1VXTa4cB1Zd3GeqPyiCw - IntelliJ Amiya

0
请注意,以下解决方案仅适用于API14+。
创建自定义应用程序类;
public class App extends Application {

    private int created;

    @Override
    public void onCreate() {
        registerActivityLifecycleCallbacks(new Callbacks());
    }

    public int getCreated() {
        return created;
    }

    private class Callbacks implements ActivityLifecycleCallbacks {

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            created++;
        }

        @Override
        public void onActivityDestroyed(Activity activity) {
            created--;
        }
    }
}

在应用元素的AndroidManifest.xml中注册它;

<application name=".App"/>

在通过深度链接打开的活动中,请使用以下代码片段:
@Override
public void onBackPressed() {
    if (((App) getApplicationContext()).getCreated() == 1) {
        // start your home activity
    }

    super.onBackPressed();
}

我是凭空写的,所以还没有测试的机会,但理论上它应该可以工作。


0

指定所需活动的父活动,例如:

<activity
    android:name=".DesiredActivity"
    android:parentActivityName="com.packagename.HomePage" >
    <!-- The meta-data element is needed for versions lower than 4.1 -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.packagename.HomePage" />
</activity>

在声明父活动后,您可以使用NavUtils API通过识别每个活动的适当父级来合成新的返回堆栈。

将onBackPressed覆盖为:

@Override
public void onBackPressed() {
        Intent intent = NavUtils.getParentActivityIntent(this);
        startActivity(intent);
        super.onBackPressed();
}

Android开发者网站有一个非常好的资源,可以解决同样的问题。请参考链接http://developer.android.com/training/implementing-navigation/temporal.html#SynthesizeBackStack


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接