如何查找活动是否是堆栈中的最后一个活动

时间:2015-11-19 10:15:11

标签: android android-intent android-activity back-stack activity-manager

我在我的应用程序中打开一个链接,一旦按下后我想显示HomePage以保留用户更多时间。我一直在努力实现这一目标但却无法做到这一点。我将homeLauncher活动作为我的top和baseActivity。

DeepLink Tap>打开所需的活动>用户按下后退按钮>检查它的最后一个活动但不是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但结果是一样的。它没有给出正确的答案。请帮助

5 个答案:

答案 0 :(得分:3)

使用isTaskRoot()方法。 (来自h9kdroid评论 - here

@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();
}

答案 1 :(得分: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();
}

我把它写在了我的头顶,所以我没有机会测试它,但理论上它应该有效。

答案 2 :(得分: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

答案 3 :(得分:0)

引自 ActivityManager.RunningTaskInfo

  

您可以检索有关当前特定任务的信息   &#34;运行&#34;在系统中。请注意,正在运行的任务并不意味着   给定任务实际上有一个正在运行的进程;它很简单   表示用户已经转到它并且从未关闭它,但是当前   系统可能已经杀死了它的进程而只是坚持它的进程   最后一个状态,以便在用户返回时重新启动它。

                   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");
      }

礼貌How to check if an activity is the last one in the activity stack for an application?

请检查 How can I get the current foreground activity package name

  

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

答案 4 :(得分:0)

你可以简单地使用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");
}