标签: back-stack

返回堆栈和历史堆栈有什么区别?

我正在检查如何使用空的返回堆栈启动活动,并遇到了该android:noHistory属性。它做了我想要的,但我仍然对文档中使用的术语“历史堆栈”感到好奇android:noHistory。我在 API 指南中没有注意到该术语的任何用法(例如任务 和 Back Stack),那么返回堆栈和历史堆栈之间是否有任何区别,或者它们只是同一件事?

更新

到目前为止,参考文献中使用了三个术语:

历史堆栈

返回堆栈

活动堆栈

这个问题可能会开始变得挑剔,因为它们似乎都可以互换使用,但我仍然有兴趣知道它们之间的差异(如果有的话)。

android back-stack android-navigation

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

如何处理片段和viewpagers之间的backstack?

我正在使用具有 2 页的 ViewPager。ViewPager 的第一页是 MainFragment。MainFragment 有 ViewPager 作为bottomNavigationView。每个页面都有一个FragmentContainerView,默认情况下它们分别包含 HomeFragment、CommunityFragment 和 NotificationFragment。

这是源代码,这是项目的APK。因此,您可以轻松地对其进行测试和改进。

现在,如果我在 HomeFragment 中并单击一个配置文件按钮,那么它会处理到 ProfileFragment 并从那里进行设置等等。单击后退按钮,它会一一完美地返回。但它不会与其他FragmentContainerView. 即使他们直接回到父片段。总的来说,我无法处理不同 ViewPagers 和片段之间的 backstack。

为了避免混淆,FragmentContainers我像这样进行交易

val containerId = (view?.parent as ViewGroup).id
activity?.supportFragmentManager?.beginTransaction()?.add(containerId, profileFragment)?.addToBackStack(null)?.commit()
Run Code Online (Sandbox Code Playgroud)

现在 MainActivity 中 BackPressed() 的处理就在这里

if (view_pager_main_activity?.currentItem == 0)
{
    if (view_pager_main_fragment?.currentItem == 0)
    {
        val recyclerView = findViewById<RecyclerView>(R.id.recycler_view_home)
        val appbarHome = findViewById<AppBarLayout>(R.id.appbar_home)
        val layoutManager = recyclerView?.layoutManager as LinearLayoutManager
        when {
            layoutManager.findFirstCompletelyVisibleItemPosition() == 0 -> {
                super.onBackPressed() …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager back-stack onbackpressed

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

Android &lt;10 上是否有针对任务劫持的修复?

我正在阅读这篇关于 Android 上任务劫持的文章:https ://blog.dixitaditya.com/android-task-hijacking/

我尝试了建议的修复,但仍然可以重现该问题。我还尝试在恶意应用程序的 Android Manifest 中将 Instagram、Gmail 应用程序的包名称指定为android:taskAffinity值,并在单击 Instagram、Gmail 后将我重定向到恶意应用程序。那么,为什么 Gmail 和 Instagram 容易受到此影响,还是我在某个地方弄错了?

Android 上是否有针对此问题的正确解决方案?

android android-activity back-stack android-task android-security

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

Android:如何在onStop之后返回带有"noHistory"属性的Activity?

我正在寻找一种从历史堆栈中删除某个活动的方法,并在这里找到了解决方案(Wakkas的anwer).但是,如果我在打开此活动的情况下关闭应用程序,例如通过按主页按钮,然后返回到该活动,则不会恢复活动.

如果我删除"noHistory"属性,它将返回并在kill后恢复.

有没有办法让它不出现在历史堆栈上(=不想通过在下一个活动中按后退按钮回到它)没有这种行为?

亲切的问候,水母

android activity-stack android-activity back-stack

4
推荐指数
1
解决办法
4807
查看次数

使用AppCompatActivity或FragmentActivity时,Fragment Transaction无法正常工作

我有一个典型的应用程序.一个具有FrameLayout的活动,在此布局中我想在片段之间切换.这通常可以通过以下方式轻松完成:

getFragmentManager().beginTransaction()
                .replace(R.id.ac_container, new FrOverview())
                .addToBackStack(null)
                .commit();
Run Code Online (Sandbox Code Playgroud)

问题是,即使我使用.addToBackStack(null)(而且我知道它已被添加'导致堆栈数量增加)当我按下时我退出应用程序.我一直在尝试很多不同的代码,并在Stackoverflow上检查了大多数线程,但我无法使用代码(方法调用等).

但!我可以通过更改活动类的扩展类来使其工作.如果我的课程延伸Activity,它工作正常.但是,如果我使用AppCompatActivity(反过来扩展FragmentActivity),那么它具有如前所述的不良行为.

像这样的感觉必须是Androids部分的错误,我对我的知识没有做任何错误.

有没有人对如何解决这个问题有任何建议?即获取后退功能并保留ActionBar!

android android-appcompat android-fragments back-stack android-fragmentactivity

4
推荐指数
1
解决办法
8524
查看次数

PendingIntent中的TaskStackBuilder无法正常工作

我正在尝试使用此代码为按下的通知重新创建一个后台堆栈:

Intent firstIntent = new Intent(this, First.class);  
Intent secondIntent = new Intent(this, Second.class);    
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);

 stackBuilder.addNextIntent(firstIntent);
 stackBuilder.addNextIntent(secondIntent);
 PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
 Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

 NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                                    .setSmallIcon(R.mipmap.ic_launcher)
                                    .setContentTitle(fromName)
                                    .setContentText(message)
                                    .setAutoCancel(true)
                                    .setSound(defaultSoundUri)
                                    .setContentIntent(pendingIntent);

  NotificationManager notificationManager =
                                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

  notificationManager.notify(0 ,notificationBuilder.build());
Run Code Online (Sandbox Code Playgroud)

但它不起作用.当我按下通知时,第二个活动被打开但按下后退按钮,活动结束,而我想回到第一个活动.

在AndroidManifest中设置parentActivityName不起作用.

怎么了?

谢谢

android android-notifications android-activity back-stack

4
推荐指数
1
解决办法
1001
查看次数

使用backstack启动Activity

我正在尝试启动一个活动,同时正确维护一个后台堆栈以允许用户使用后退按钮.为此,我正在按照谷歌的指示行事,但我无处可去.当我单击我的按钮时,没有任何反应(除了日志输出).我需要做些什么才能使此次发布成为下一个活动?

        mBtnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Log.d(TAG, "click");

                Intent intent = new Intent(ProfileSelectActivity.this, PermissionsRequestActivity.class);

                PendingIntent pendingIntent =
                        TaskStackBuilder.create(ProfileSelectActivity.this)
                                // add all of DetailsActivity's parents to the stack,
                                // followed by DetailsActivity itself
                                .addNextIntentWithParentStack(intent)
                                .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

                NotificationCompat.Builder builder = new NotificationCompat.Builder(ProfileSelectActivity.this);
                builder.setContentIntent(pendingIntent);
            }
        });
Run Code Online (Sandbox Code Playgroud)

在我看来,最后有一条缺失的线.除了其他事情,我已经尝试过了startActivities();,startActivity();但是我的所有尝试都没有成功.

谢谢你的帮助.

编辑

试图从njzk2实施下面的建议,但我仍然感到困惑.为了添加startActivities()到TaskStackBuilder行的末尾,我必须删除对PendingIntent的任何赋值.这可能还可以.但是,在下一个活动开始后,如果我点击后退按钮,我只会看到一个白色屏幕.

TaskStackBuilder.create(ProfileSelectActivity.this)
    .addNextIntentWithParentStack(intent)
    .startActivities();
Run Code Online (Sandbox Code Playgroud)

我还注意到,onResume通过后退按钮返回时,我的父活动中的方法没有被调用,所以这可能只是恢复状态的问题???

android android-intent android-pendingintent back-stack

4
推荐指数
1
解决办法
5724
查看次数

如何完成几个SingleInstance活动?

我在launchMode SingleInstance中有几个活动.注销时我想完成所有活动并打开launchScreen.

val intent = Intent(context, LauncherActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
(context as AppCompatActivity).finishAffinity()
context.startActivity(intent)
Run Code Online (Sandbox Code Playgroud)

但是,如果我按回Launcher活动,我会转发到以前启动的具有singleInstance模式的活动

android kotlin back-stack

4
推荐指数
1
解决办法
532
查看次数

Android 导航 - 弹出后退堆栈时删除操作栏后退按钮

我正在尝试做什么

我正在使用 Android 导航组件来处理我的应用程序中的导航。在此示例中,我有两个屏幕,屏幕 A 和屏幕 B。我希望用户能够单击屏幕 A 中的按钮并能够导航到屏幕 B;然后无法返回到上一屏幕(屏幕 A)。

问题

当用户从屏幕 A 导航到屏幕 B 时,操作栏上的后退按钮仍然允许用户返回上一屏幕,但是当单击底部栏中的后退按钮时,它会退出应用程序,因此这部分工作正常。

我需要做什么才能删除操作栏中的后退按钮?

在此输入图像描述

到目前为止我读过的内容

我已遵循这三篇文章中的指导,但我认为他们可能忽略了ActionBar后退按钮:

我的代码

导航图 - nav_graph.xml

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_graph"
    app:startDestination="@id/screen_a">
    <fragment
        android:id="@+id/screen_a"
        android:name="com.example.conditionalnavigation.AFragment"
        android:label="screen A">
        <action
            android:id="@+id/action_AFragment_to_BFragment"
            app:destination="@id/screen_b"
            app:launchSingleTop="true"
            app:popUpTo="@id/screen_a"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/screen_b"
        android:name="com.example.conditionalnavigation.BFragment"
        android:label="screen B" />
</navigation>
Run Code Online (Sandbox Code Playgroud)

MainActivity - 这充当我的单一活动导航主机。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) { …
Run Code Online (Sandbox Code Playgroud)

android kotlin back-stack android-navigation android-jetpack-navigation

4
推荐指数
1
解决办法
4139
查看次数

使用片段和后台堆栈时管理操作栏标题

我的应用程序有一个活动,它使用FragmentManager将片段推送到后台堆栈.但是,当backstack有2个片段并且弹出最后一个片段时,我不知道如何检测它以适当地设置Action Bar的标题.我希望在我可以覆盖的片段上有一些方法来确定它何时变得可见,但是没有一个方法被调用,例如uservisiblehint,onHiddenChanged等.我怎么能:

•确定片段何时可​​见; 要么

•在backstack上使用片段时有效管理操作栏标题?

android android-fragments android-actionbar back-stack

3
推荐指数
1
解决办法
2123
查看次数