标签: launchmode

一个 Activity 的两个实例,launchMode 为 singleTask

我有一个launchMode 作为singleTask 的活动。但是出于某种原因,当我尝试在 "adb shell dumpsys activity activites" 中查找日志时,存在两个实例。第一个实例
intent={act= flg=0x10000000 cmp=}以以下方式启动,第二个实例以以下意图启动
intent= { act= flg=0x10200000 cmp= (has extras)}。它是什么旗帜?

实际上,第二个意图是由不同的应用程序启动的。如何防止该应用启动我的活动的新实例。

android android-intent launchmode

6
推荐指数
1
解决办法
164
查看次数

Android:launchMode = SingleTask问题

我有一个围绕主要活动(主菜单)的应用程序.在每个其他应用程序中,有一个选项菜单项,指向此活动.

首先,我总是在选择此项目时启动一个新的主要活动.使用intent bundle,我确实告诉了主要的活动,我在一个新的开始时做的一些初始化是没有必要的.

但是,我不太喜欢整体行为.我偶然发现android:launchMode="SingleTask"这似乎有所帮助:现在我不会一直重建我的主菜单活动; 另外,如果我按下"后退"按钮,我会直接回到主屏幕.这感觉非常像一个适当的"主菜单".

我现在的问题是:如果我运行我的应用程序的另一个活动,按主页按钮,然后重新打开我的应用程序(例如使用"最后的应用程序"),然后我不会回到上一个活动,而是回到主要活动.其他活动被销毁.

任何想法如何实现行为,SingleTask而不仅仅能够返回到一个活动?

java android launchmode android-activity

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

以编程方式设置活动启动模式

我需要launchMode根据我的应用状态用不同的方式调用活动。在一种情况下应该是singleInstance,在另一种情况下singleTask。我知道如何launchModeAndroidManifest中进行设置,但是由于它应该是动态属性,因此我必须从代​​码中进行设置。我以为可以在开始活动之前向意图添加一些特定的标志,但是我发现只有singleTop标志。那么有什么办法可以解决这个问题?谢谢

android android-intent launchmode android-activity

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

Android活动启动模式和深层链接问题

我的应用有2项活动.应用程序的根活动是MainActivity.如果凭据丢失或无效,则用户将在完成MainActivity时重定向到LoginActivity.

如果我将主活动的启动模式设置为singleTask并且我在LoginActivity的内部片段中=>最小化应用程序 - >从启动器图标启动应用程序=> MainActivity启动(因为它是singleTask活动)并且重定向到LoginActivity,但当然是重定向到堆栈中的第一个片段.

所需行为(从重新启动时发生)是它将保留当前活动的实例并在LoginActivity的堆栈中显示正确的片段.

这当然可以通过将启动模式设置为singleTop轻松解决,但随后会出现另一个问题!DeepLink麻烦!

如果我的应用程序在后台打开,我在单一模式下点击浏览器或电子邮件中的链接 - 该应用程序将作为转发应用程序的子任务打开(如果您点击最近,您将看到您的应用程序打开两次 - 一次作为之前的常规实例和浏览器/电子邮件中的一个实例.这当然非常不方便,可以通过 - 你知道 - 将启动模式设置为singleTask来解决!

对此问题的任何帮助将非常感谢.

   <!-- Main Activity -->
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:launchMode="singleTask"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data
                android:host="somehost"
                android:scheme="myscheme" />
        </intent-filter>
    </activity>

    <!-- Login Activity -->
    <activity
        android:name="LoginActivity"
        android:launchMode="singleTask"
        android:screenOrientation="portrait" />
Run Code Online (Sandbox Code Playgroud)

android deep-linking launchmode

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

在整个应用中只保留每个活动的一个实例

我想在我的应用程序中保留每个启动的单个实例Activity.launchMode singleTask是一个选项,但它只适用于一个Activity.

我想要

  • Activity如果没有实例则启动一个并调用它.
  • 如果Activity已经存在任何其他实例,那么该实例将在不创建新实例的情况下被带到前面Activity.
  • 此属性将应用于多个Activity.
  • No Activity确保它始终位于历史堆栈的顶部.

我的工作到现在为止:

我得到了许多对我的案件无效的建议,所以我想指出这些建议,以便没有其他人会给出同样的建议.

  • 我设置了launchModeto singleTop,只有当Activity它位于历史堆栈的顶部时才有用.仅当onNewIntent()Activity位于历史堆栈的顶部时才会被调用.在我的情况下,Activity可能在堆栈中的任何位置.所以这不起作用.

android launchmode android-activity

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

为什么行为不同?-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
查看次数

即使另一个活动在顶部,为什么带有 launchMode="singleTask" 的启动器活动总是被推到后台堆栈的顶部?

由于某些要求,我的启动器活动的 launchMode 属性设置为 singleTask。

<activity
    android:name=".map.MapsActivity"
    android:launchMode="singleTask"
    android:screenOrientation="portrait"
    android:theme="@style/MapScreenTheme"
    android:windowSoftInputMode="adjustPan">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,如果我打开另一个活动 -> 按主页 -> 单击启动器应用程序中的应用程序图标 -> 它会打开 MapActivity 而不是之前打开的活动。

但是,如果我通过最近菜单导航到该应用程序,则不会发生这种情况。然后新打开的活动保持在顶部。

有人可以解释一下这里发生的关于 backstack 的事情,为什么 ActivityManagerService 没有考虑到应用程序进程已经存在,但决定启动启动器应用程序并清除 backstack 而不是简单地将应用程序向前推进?

可以在此处创建的一个小示例应用程序中观察到此问题 - https://github.com/abhiank/SingleTaskActivity

android launchmode android-launcher activity-manager

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

使用PendingIntent时不遵守singleTask和singleInstance?

我将launchMode设置为singleTask的活动:

<activity
    android:name="com.blah.blah.MyActivity"
    android:launchMode="singleTask">
</activity>
Run Code Online (Sandbox Code Playgroud)

我有一个PendingIntent持续通知,启动该活动:

Intent activityIntent = new Intent( this,
                                    MyActivity.class );
TaskStackBuilder stackBuilder = TaskStackBuilder.create( this );
stackBuilder.addParentStack( MyActivity.class );
stackBuilder.addNextIntent( activityIntent );
PendingIntent resultingActivityPendingIntent = stackBuilder.getPendingIntent( REQUEST_CODE,
                                                                              PendingIntent.FLAG_UPDATE_CURRENT );
...
m_notificationBuilder.setContentIntent( resultingActivityPendingIntent );
startForeground( ONGOING_NOTIFICATION_ID,
                 m_notificationBuilder.build() );
Run Code Online (Sandbox Code Playgroud)

当我与现有的MyActivity交互时,我点击Home并通过启动器重新启动MyActivity,MyActivity onNewIntent()会按预期调用.

问题是当我与现有的MyActivity交互时,我点击正在进行的通知时,会创建一个新的MyActivity onCreate(),现有的MyActivity将被销毁onDestroy().我预计onNewIntent()会调用MyActivity .为什么不这样呢?

我试过这些答案没有成功:

android launchmode android-pendingintent

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

android singleTask活动不作为root?

我一直在阅读有关发射模式的文档,有一点我没有理解.该文档说singleTask活动始终是堆栈的根:

相比之下,"singleTask"和"singleInstance"活动只能开始一项任务.它们始终位于活动堆栈的根部.此外,设备一次只能保存一个活动实例 - 只有一个这样的任务.

但是:如果你看一下图4中的部分文档,你会看到当Activity 2启动Activity Y(将该任务置于前台)时,Activity Y已经位于任务的顶部并且将位于当前的顶部任务,而不是根.

我在这个模拟应用程序中尝试了这个场景,当我创建singleTask活动时,它总是创建一个新任务.但是,如果唯一的实例已经存在,则它将完成高于此实例的所有活动,因此唯一的实例可以是根(也是任务中的唯一活动).

活动Y如何成为活动X上方任务的首位?

我还有其他原因吗?

PS:我也不太了解Task和后台堆栈之间的区别.

android launchmode android-task

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

双击自定义视图将打开2个活动

我的片段中没有几个自定义的六边形视图,双击六边形视图可打开2个活动。我尝试了几种方法来避免这种行为,但似乎都没有用。不知道为什么以下事情不起作用。

我已经尝试了这篇文章《Android防止双击按钮》中的所有内容,但在我的情况下,这些都不起作用。我不确定在这种情况下到底有什么奇怪的。

我尝试过的第一件事是通过将“活动”启动模式设置为“ singleTop”。那没用。所以我尝试了其他方法,例如singleInstance,singleTask。

然后我尝试禁用单击六角形视图并在onResume中启用它。即使那没有用。尝试保存单击时的最终单击时间。即使那没有用。

这是我的代码片段。

public class MenuFragment extends BaseFragment implements 
OnHexagonClickListener{
....
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_land_menu, container, false);
    ScrollView scroll_hexagon = view.findViewById(R.id.scroll_hexagon);
    isFirst = true;
    loadMenuData();
    scroll_hexagon.post(new Runnable() {
        @Override
        public void run() {
            int design_hexagon_width = getResources().getDimensionPixelSize(R.dimen.dimen_190dp);
            int design_hexagon_height = getResources().getDimensionPixelSize(R.dimen.dimen_160dp);
            int design_padding_horizontal = getResources().getDimensionPixelSize(R.dimen.dimen_5dp);
            int design_margin_horizontal = getResources().getDimensionPixelSize(R.dimen.dimen_3dp);
            int design_margin_vertical = getResources().getDimensionPixelSize(R.dimen.dimen_5dp);
            int design_margin_top = 0; //getResources().getDimensionPixelSize(R.dimen.dimen_5dp);

            int scroll_width = scroll_hexagon.getWidth();
            int hexagon_width …
Run Code Online (Sandbox Code Playgroud)

android view launchmode android-activity

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