标签: back-stack

从广播接收器发起的活动,尽管已经完成,仍保留在最近的任务中

我有两个我无法解决的活动的问题:

我有一个A活动,它使用警报管理器编程警报,警报接收器在3秒钟内启动一个只有完成按钮的B活动.

如果我从A编程报警管理器并按下后退按钮完成此活动,则会在3秒内显示B活动.一切正常.问题如下:如果我通过启动器重新打开应用程序,系统将启动A活动,但如果我通过长按主页按钮(最近使用的任务)启动应用程序,我总是打开B活动.我需要在完成B活动时,如果我从任何地方重新打开应用程序,A活动应该打开.

我试图将noHistory添加到活动B,但问题仍在继续.

以下是A活动的代码:

public class ActivityA extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);

    Button b=(Button) findViewById(R.id.initTimer);
    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            programTimer();
        }
    });
}

private void programTimer() {
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, AlarmReciver.class);
    PendingIntent pIntent = PendingIntent.getBroadcast(this, 1, intent,  PendingIntent.FLAG_CANCEL_CURRENT);
    manager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+3000 , pIntent);
}
Run Code Online (Sandbox Code Playgroud)

}

B活动:

public class ActivityB extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);

    Button button= …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-activity back-stack

5
推荐指数
1
解决办法
820
查看次数

Android - 使用从左向右滑动返回

我对Fragments API有点新意.我正在构建一个应用程序,允许用户在信息树中向上/向下导航.为了便于导航,我希望允许用户从左向右滑动以导航回页面.

我最初的想法是尝试使用ViewPager并在每次我想要钻取时附加一个新片段,并在每次用户从左向右滑动或按下时自动删除最后一个片段.然而,我无法理解它如何与后台堆叠相互作用.这种行为是否会与FragmentManager完全分离,或者是否有一种方法可以将Fragment作为使用FragmentManager的一部分附加到FragmentPagerAdapter?

android android-viewpager back-stack

5
推荐指数
0
解决办法
752
查看次数

在后台堆栈中不是最顶层的片段将恢复

鉴于应用程序流程在图形和文本中描述如下所示.

申请流程

  1. 片段1是最低片段,但不是通过设置在backstack中disallowAddToBackStack.
  2. 使用片段2将片段2推入堆栈fragmentTransaction.addToBackStack().
  3. 片段1的新实例被压入堆栈.
  4. 最顶层的片段(片段1)从堆栈中弹出.
  5. 活动2成为前景.
  6. 活动1成为前景.

这是我用来处理片段的通用方法:

private void changeContainerViewTo(int containerViewId,  Fragment fragment, 
                                   Activity activity, String backStackTag) {

    if (fragmentIsAlreadyPresent(containerViewId, fragment, activity)) { return; }
    final FragmentTransaction fragmentTransaction = 
                 activity.getFragmentManager().beginTransaction();
    fragmentTransaction.replace(containerViewId, fragment);
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    if (backStackTag == null) {
        fragmentTransaction.disallowAddToBackStack();
    } else {
        fragmentTransaction.addToBackStack(backStackTag);
    }
    fragmentTransaction.commit();
}
Run Code Online (Sandbox Code Playgroud)

问题

当活动1在最后一步中恢复时,片段1的最低实例也将恢复.在1返回这个时间点片段nullgetActivity().

  • 为什么堆栈中不是最重要的片段会重新开始?
  • 如果恢复片段是正确的 - 我应该如何处理分离的片段?

android onresume android-fragments back-stack

5
推荐指数
1
解决办法
2836
查看次数

NavUtils.navigateUpFromSameTask如何工作?

请问这种方法的实际行为是什么?我认为当绑定此方法调用我的操作栏后退按钮并在Manifest.xml中设置homepageactivity名称时,应该在按钮中单击后打开它 - 无论当前任务堆栈如何...例如,当我打开时我的Activity来自widget,父Activity不在BackStack中 - 这就是我要解决的问题..我知道我可以以某种方式构建我自己的任务堆栈,但我只是想,这应该是预先解决的,不应该是?现在它将我送回主屏幕..这就是我称之为的地方..代码位于onOptionsItemSelected

 case android.R.id.home: 
            NavUtils.navigateUpFromSameTask(this);
            //finish();
            return true;
Run Code Online (Sandbox Code Playgroud)

android back-stack android-navigation

5
推荐指数
0
解决办法
3317
查看次数

从片段输入新活动并返回时,片段活动会被破坏

我有一个FragmentActivity类型的活动.在里面我有一些使用view pager的内容,其中每个可滚动的标签是一个片段:

<android.support.v4.view.ViewPager      
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".OpenStack" >

    <!--
    This title strip will display the currently visible page title, as well as the page
    titles for adjacent pages.
    -->

    <android.support.v4.view.PagerTitleStrip
        android:id="@+id/pager_title_strip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="#33b5e5"
        android:paddingBottom="4dp"
        android:paddingTop="4dp"
        android:textColor="#fff" />

</android.support.v4.view.ViewPager>
Run Code Online (Sandbox Code Playgroud)

在片段内部,当用户点击列表中的项目时,我正在打开一个新活动,如下所示:

Intent myIntent = new Intent(getActivity(), InstanceActivity.class);
getActivity().startActivity(myIntent);
Run Code Online (Sandbox Code Playgroud)

但是当我在InstaceActivity中单击返回到具有片段的那个时,它将被销毁并再次创建.我不知道为什么会这样.我应该做一些特别的事情来保持FragmentActivity在Backstack中吗?

它甚至没有帮助保存状态:

public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("CONNTOKEN", isConnToken);
    outState.putString("NOVAURL", isNovaURL);
}   
Run Code Online (Sandbox Code Playgroud)

因为在FragmentActivity的oncreate事件中,当我按下后,savedInstanceState为NULL?

android back-stack android-fragmentactivity

5
推荐指数
1
解决办法
882
查看次数

Intent.FLAG_ACTIVITY_CLEAR_TOP无效

我的申请流程:

登录 - >简介 - > UpdateProfile-> ChangePass

我的所有活动都扩展了FragmentActivity

当我在ChangePass活动中按下按钮时,我调用此代码:

Intent intent=new Intent(getApplicationContext(),LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

所以它应该启动LoginActivity,当我从LoginActivity按回来然后应该关闭...但是当我按下Login Activity中的后退按钮时,流程是:

ChangePass-> UpdateProfile->简介 - >登录

为什么我的后台堆栈没有清除?

注意:

我已经应用了所有这些解决方案但没有工作: 1.link 2.link

android back-stack

5
推荐指数
1
解决办法
6212
查看次数

清除backstack并用顶级片段替换当前片段

我在我的Android应用程序中有一个活动,它处理多个视图/片段的替换.此活动还有一个导航抽屉,可导航到顶级片段.从顶级片段,您可以导航到详细级别的片段.
可以通过从左侧滑入导航抽屉来访问导航抽屉.如果当前片段是顶级片段,则操作栏也可以访问导航抽屉.如果当前片段是详细级别片段,则可以返回操作栏(或按后退按钮).

假设我有3个顶级片段,可以通过导航抽屉访问.
fragment[1],fragment[2],fragment[3]

fragment[1],您可以导航到详细级别fragment[1.1].

现在,用户想要fragment[3]从当前直接导航到顶级fragment[1.1].用户只需在导航抽屉中滑动并单击该项即可fragment[3].
现在,如果用户点击后退按钮,应用程序应该关闭(因为它导航到顶级片段).因此,每次用户导航到顶级片段时,都应清除堆栈.要检查是否应显示抽屉指示器,我正在读取getBackStackEntryCount() - 值并将其与0进行比较.

作为总结.我想从细节级别的片段导航到任何顶级片段并清除后台堆栈.

问题:
当我通过执行清除backstack时
getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);,
片段事务被反向重放(例如替换fragment[1]by fragment[1.1]).我不希望他们被重播.我在onCreateView,onViewCreated,onStart,..上有很多初始化,也开始获取数据的任务.我想跳过这一切.只需用一个尚未在Backstack中的新顶级视图替换详细级别视图.

在没有弹出事务的情况下,我找不到任何清除backstack的解决方案.
有没有一个干净的解决方案来处理这个问题?我是否必须实施自己的后台行为?

编辑: YouTube应用也表现得像这样.当您从详细信息导航到顶级时,后端堆栈将被清除.但他们如何在不重播片段交易的情况下清除后台堆叠?

谢谢你的回答.

android transactions fragment clear back-stack

5
推荐指数
1
解决办法
672
查看次数

从FragmentStack中删除Middle片段

我想删除片段堆栈的中间片段.即我已经与片段A,B,C,D堆叠,在这种情况下我想删除B或C而不删除D.

有没有办法做到这一点?因为如果我删除D并在删除B或C后重新添加它,则需要时间来创建视图并再次添加所有细节.

android android-fragments back-stack

5
推荐指数
1
解决办法
827
查看次数

为什么行为不同?-android:launchMode =“ singleTask”,android:taskAffinity =“”和Intent.FLAG_ACTIVITY_NEW_TASK

我有四个活动-A,B,C,D

我以-> ABCDB的方式称呼这四个活动。(指定方式)

我有三种情况。

第一:-android:launchMode="singleTask"仅在B活动中定义。我通过Intent上述指定方式调用所有活动。

现在首先呼叫ABCD, BackStack Task 1 : A-B-C-D,

现在,我再次呼叫B,然后 BackStack Task 1 : A-B。这里的C和D活动被销毁。

第二:-我正在定义android:launchMode="singleTask"android:taskAffinity=""在B活动中。我通过Intent上述指定方式调用所有活动。

现在首先呼叫ABCD, BackStack Task 1 : A

                                  Task 2 : B-C-D
Run Code Online (Sandbox Code Playgroud)

现在我再次打电话给B,然后 BackStack Task 1 : A

                                Task 2 : B ,Here C and D Activities are destroyed.
Run Code Online (Sandbox Code Playgroud)

第三:-我正在定义Intent.FLAG_ACTIVITY_NEW_TASKandroid:taskAffinity=""在B活动中。我通过Intent上述指定方式调用所有活动。

现在首先呼叫ABCD, BackStack Task 1 : A

                                  Task 2 : B-C-D
Run Code Online (Sandbox Code Playgroud)

现在我再次打电话给B,然后 BackStack Task …

android launchmode back-stack

5
推荐指数
1
解决办法
352
查看次数

Android Architecture Navigation-如何导航至Nav Graph建筑物后堆栈中的特定位置

我有一个使用Android Arch Navigation创建的线性向导,我想像自然用户导航一样,在特定位置构建后退堆栈时启动它。所以我尝试了这种深层链接构建:

Bundle args = new Bundle();
args.putString("myarg", "From Widget");
 new NavDeepLinkBuilder(context)
    .setGraph(R.navigation.mobile_navigation)
    .setDestination(R.id.step_fragment)
    .setArguments(args)
    .createPendingIntent().send(); 
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于,由于用户将要进行构建导航,因此无法正确地构建回栈。步骤1->步骤2-> ...->步骤N仅保留步骤1->步骤N,即启动目标位置和导航图的目标位置。这不是我想要的。

第二个简单的办法是只调用多次navigate()navController。但是看起来很简单,却行不通

 protected fun navigateTo(step: Int) {
        val navController = findNavController(R.id.nav_host_fragment)

        if(step >= 0 && step < stepFragments.count()) {
            // go to step-th fragment
            if(navController.currentDestination.id != stepFragments.first()) return

            for(i in 0 until step) {
                navController.navigate(stepFragments[i])
            }
            navController.navigate(stepFragments[step])
        } else if(step == stepFragments.count()) {
            // go to confirm fragment
            navController.navigate(confirmFragment)
        } else {
            throw IndexOutOfBoundsException("Step index is out of …
Run Code Online (Sandbox Code Playgroud)

back-stack android-architecture-navigation

5
推荐指数
1
解决办法
1781
查看次数