我有两个我无法解决的活动的问题:
我有一个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) 我对Fragments API有点新意.我正在构建一个应用程序,允许用户在信息树中向上/向下导航.为了便于导航,我希望允许用户从左向右滑动以导航回页面.
我最初的想法是尝试使用ViewPager并在每次我想要钻取时附加一个新片段,并在每次用户从左向右滑动或按下时自动删除最后一个片段.然而,我无法理解它如何与后台堆叠相互作用.这种行为是否会与FragmentManager完全分离,或者是否有一种方法可以将Fragment作为使用FragmentManager的一部分附加到FragmentPagerAdapter?
鉴于应用程序流程在图形和文本中描述如下所示.

disallowAddToBackStack.fragmentTransaction.addToBackStack().这是我用来处理片段的通用方法:
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返回这个时间点片段null上getActivity().
请问这种方法的实际行为是什么?我认为当绑定此方法调用我的操作栏后退按钮并在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) 我有一个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?
我的申请流程:
登录 - >简介 - > 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->简介 - >登录
为什么我的后台堆栈没有清除?
注意:
我在我的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应用也表现得像这样.当您从详细信息导航到顶级时,后端堆栈将被清除.但他们如何在不重播片段交易的情况下清除后台堆叠?
谢谢你的回答.
我想删除片段堆栈的中间片段.即我已经与片段A,B,C,D堆叠,在这种情况下我想删除B或C而不删除D.
有没有办法做到这一点?因为如果我删除D并在删除B或C后重新添加它,则需要时间来创建视图并再次添加所有细节.
我有四个活动-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_TASK&android:taskAffinity=""在B活动中。我通过Intent上述指定方式调用所有活动。
现在首先呼叫ABCD, BackStack Task 1 : A
Task 2 : B-C-D
Run Code Online (Sandbox Code Playgroud)
现在我再次打电话给B,然后 BackStack Task …
我有一个使用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 ×10
android ×9
android-architecture-navigation ×1
clear ×1
fragment ×1
launchmode ×1
onresume ×1
transactions ×1