13

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

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 评估

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

4

5 回答 5

4

使用 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();
}
于 2017-06-02T22:20:24.270 回答
1

您可以简单地使用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");
}
于 2015-11-29T23:04:20.927 回答
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

于 2015-11-28T05:39:22.633 回答
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

于 2015-11-27T19:54:09.493 回答
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();
}

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

于 2015-11-25T12:10:11.663 回答