我有一个launchMode 作为singleTask 的活动。但是出于某种原因,当我尝试在 "adb shell dumpsys activity activites" 中查找日志时,存在两个实例。第一个实例
intent={act= flg=0x10000000 cmp=}以以下方式启动,第二个实例以以下意图启动
intent= { act= flg=0x10200000 cmp= (has extras)}。它是什么旗帜?
实际上,第二个意图是由不同的应用程序启动的。如何防止该应用启动我的活动的新实例。
我有一个围绕主要活动(主菜单)的应用程序.在每个其他应用程序中,有一个选项菜单项,指向此活动.
首先,我总是在选择此项目时启动一个新的主要活动.使用intent bundle,我确实告诉了主要的活动,我在一个新的开始时做的一些初始化是没有必要的.
但是,我不太喜欢整体行为.我偶然发现android:launchMode="SingleTask"这似乎有所帮助:现在我不会一直重建我的主菜单活动; 另外,如果我按下"后退"按钮,我会直接回到主屏幕.这感觉非常像一个适当的"主菜单".
我现在的问题是:如果我运行我的应用程序的另一个活动,按主页按钮,然后重新打开我的应用程序(例如使用"最后的应用程序"),然后我不会回到上一个活动,而是回到主要活动.其他活动被销毁.
任何想法如何实现行为,SingleTask而不仅仅能够返回到一个活动?
我需要launchMode根据我的应用状态用不同的方式调用活动。在一种情况下应该是singleInstance,在另一种情况下singleTask。我知道如何launchMode在AndroidManifest中进行设置,但是由于它应该是动态属性,因此我必须从代码中进行设置。我以为可以在开始活动之前向意图添加一些特定的标志,但是我发现只有singleTop标志。那么有什么办法可以解决这个问题?谢谢
我的应用有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) 我想在我的应用程序中保留每个启动的单个实例Activity.launchMode singleTask是一个选项,但它只适用于一个Activity.
我想要
Activity如果没有实例则启动一个并调用它.Activity已经存在任何其他实例,那么该实例将在不创建新实例的情况下被带到前面Activity.Activity.Activity确保它始终位于历史堆栈的顶部.我的工作到现在为止:
我得到了许多对我的案件无效的建议,所以我想指出这些建议,以便没有其他人会给出同样的建议.
launchModeto singleTop,只有当Activity它位于历史堆栈的顶部时才有用.仅当onNewIntent()Activity位于历史堆栈的顶部时才会被调用.在我的情况下,Activity可能在堆栈中的任何位置.所以这不起作用.我有四个活动-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 …
由于某些要求,我的启动器活动的 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
我将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 .为什么不这样呢?
我试过这些答案没有成功:
我一直在阅读有关发射模式的文档,有一点我没有理解.该文档说singleTask活动始终是堆栈的根:
相比之下,"singleTask"和"singleInstance"活动只能开始一项任务.它们始终位于活动堆栈的根部.此外,设备一次只能保存一个活动实例 - 只有一个这样的任务.
但是:如果你看一下图4中的这部分文档,你会看到当Activity 2启动Activity Y(将该任务置于前台)时,Activity Y已经位于任务的顶部并且将位于当前的顶部任务,而不是根.
我在这个模拟应用程序中尝试了这个场景,当我创建singleTask活动时,它总是创建一个新任务.但是,如果唯一的实例已经存在,则它将完成高于此实例的所有活动,因此唯一的实例可以是根(也是任务中的唯一活动).
活动Y如何成为活动X上方任务的首位?
我还有其他原因吗?
PS:我也不太了解Task和后台堆栈之间的区别.
我的片段中没有几个自定义的六边形视图,双击六边形视图可打开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)