【问题标题】:How to find whether activity is last activity in stack如何查找活动是否是堆栈中的最后一个活动
【发布时间】:2015-11-19 10:15:10
【问题描述】:

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

DeepLink Tap > 打开所需的 Activity > 用户按下返回按钮 > 检查其最后一个 Activity 但不是 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();
}

我也试过 isTaskRoot 但结果是一样的。它没有给出正确的答案。请帮助

【问题讨论】:

  • @NoumanGhaffar :看看我的 topActivity 的图像名称与上次活动不同。它将启动器活动显示为 topActivity。这只发生在我来自深度链接时。这个问题是深度链接特有的。所以我已经尝试过同样的方法,但对我来说并没有成功。
  • 您从任务列表中的第一个任务中获取活动计数(如果在新任务中开始,可能不是您的活动的任务)
  • 可以(如果一切都失败了),自己做一些工作来维护这个堆栈。在您的 Application 类中添加一个堆栈(假设您确实有自己的 Application 类),并且每次在您的活动(全部)的 onCreate 上,将活动放入应用程序中的该堆栈和onDestroy(),弹出它们。这样您就可以检查实时活动的状态。

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


【解决方案1】:

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

【讨论】:

【解决方案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");
}

【讨论】:

    【解决方案3】:

    引用自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{
    
                        }
    

    给予许可 &lt;uses-permission android:name="android.permission.GET_TASKS" /&gt;

    ActivityManager 会记录 runnings 任务topmost 任务。

           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】:

    请注意,以下解决方案仅适用于 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();
    }
    

    我在脑海中写下了这个,所以我没有机会测试它,但理论上它应该可以工作。

    【讨论】:

      【解决方案5】:

      为想要的Activity指定父Activity,比如:

      <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

      【讨论】:

        猜你喜欢
        • 2011-08-23
        • 2019-03-12
        • 1970-01-01
        • 2014-01-30
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多