我正在检查如何使用空的返回堆栈启动活动,并遇到了该android:noHistory属性。它做了我想要的,但我仍然对文档中使用的术语“历史堆栈”感到好奇android:noHistory。我在 API 指南中没有注意到该术语的任何用法(例如任务 和 Back Stack),那么返回堆栈和历史堆栈之间是否有任何区别,或者它们只是同一件事?
更新
到目前为止,参考文献中使用了三个术语:
这个问题可能会开始变得挑剔,因为它们似乎都可以互换使用,但我仍然有兴趣知道它们之间的差异(如果有的话)。
我正在使用具有 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
我正在阅读这篇关于 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
我正在寻找一种从历史堆栈中删除某个活动的方法,并在这里找到了解决方案(Wakkas的anwer).但是,如果我在打开此活动的情况下关闭应用程序,例如通过按主页按钮,然后返回到该活动,则不会恢复活动.
如果我删除"noHistory"属性,它将返回并在kill后恢复.
有没有办法让它不出现在历史堆栈上(=不想通过在下一个活动中按后退按钮回到它)没有这种行为?
亲切的问候,水母
我有一个典型的应用程序.一个具有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
我正在尝试使用此代码为按下的通知重新创建一个后台堆栈:
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不起作用.
怎么了?
谢谢
我正在尝试启动一个活动,同时正确维护一个后台堆栈以允许用户使用后退按钮.为此,我正在按照谷歌的指示行事,但我无处可去.当我单击我的按钮时,没有任何反应(除了日志输出).我需要做些什么才能使此次发布成为下一个活动?
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通过后退按钮返回时,我的父活动中的方法没有被调用,所以这可能只是恢复状态的问题???
我在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 导航组件来处理我的应用程序中的导航。在此示例中,我有两个屏幕,屏幕 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
我的应用程序有一个活动,它使用FragmentManager将片段推送到后台堆栈.但是,当backstack有2个片段并且弹出最后一个片段时,我不知道如何检测它以适当地设置Action Bar的标题.我希望在我可以覆盖的片段上有一些方法来确定它何时变得可见,但是没有一个方法被调用,例如uservisiblehint,onHiddenChanged等.我怎么能:
•确定片段何时可见; 要么
•在backstack上使用片段时有效管理操作栏标题?