我正在自己更换家用发射器,并且工作正常,但有一件事困扰着我。当我按下Home键时,当前的Home活动(在清单中定义为main / defualt / launcher / home)将重新启动-当前活动实例onpause被执行,并且oncreate被再次触发,因此启动了新活动。
另一方面,ADW启动器和LauncherPRo的行为不一样-我的情况没有刷新。Launcher Pro甚至可以执行以下操作:
任何想法如何做到这一点?
我只是从头开始做了一个非常简单的原型,只有一个活动(在清单中定义为main / defualt / launcher / home),我看到的是同一件事-如果按Home键,它将重新创建。
我有一个service它开始notification用startForeground(),我希望通知上点击启动的活动。
在acitivty我要推出定义为android:launchMode="singleTask"服务开始之前,通常运行。
这是我的pending intent创建代码:
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Run Code Online (Sandbox Code Playgroud)
当我单击通知时,收到以下警告:
startActivity called from non-Activity context;
forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent........
Run Code Online (Sandbox Code Playgroud)
我也尝试过用this代替,getApplicationContext()但是得到了同样的警告。
我该怎么做呢?
service notifications android android-intent android-pendingintent
我想阻止用户离开我的应用.我试图通过家庭启动器活动/应用程序实现这一点,我不明白android的行为.首次按HOME将始终在新任务中创建新活动,而不是将现有活动移动到前台.当第二次按HOME时,没有任何反应.见例子:
我有一个登录活动(A)和设置活动(B).B从A打开.A被设置为启动器(LAUNCHER,DEFAULT,HOME类别).
当A的launchMode是singleTop,singleTask或standard时,我得到相同的行为.使用singleInstance只有一个A,但B在T1中单独使用,我不希望这样.
为什么总会创建一个新任务?所有intents标志始终设置FLAG_ACTIVITY_NEW_TASK标志.为什么android会这样做?
这与此处或此处发布的行为相同吗?我无法使用该解决方案,因为android创建了一个新任务,因此A将永远是根.(或者我如何检查这是第二个实例?)
我不能在这里发布使用singleInstance,因为我不希望B单独使用(如果A是可见的,它也是唯一的活动和任务(登录目的)).我试图通过ActivityManager删除所有其他任务,但是对于SDK> = 21,我的min是16.getAppTasks()
我甚至无法使用此解决方案,因为我从未意识到FLAG_ACTIVITY_BROUGHT_TO_FRONT标志.始终存在FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标志.
我已经尝试了很多与launchMode,clearTaskOnLaunch,noHistory的组合......但没有成功 - 总是新任务.
不知道怎么解决这个问题?在棒棒糖上运行.谢谢.
android android-intent android-launcher android-homebutton android-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
问题:
我遇到一个不寻常的问题,即我的应用程序启动器活动 (MainActivity) 的 onCreate() 方法被调用两次,但仅当我安装该应用程序后首次启动该应用程序时(从 Google Play 内部应用程序共享链接或在设备上安装签名的 apk 文件)。此行为会导致同时创建 MainActivity 的多个实例。
描述:
我已经彻底检查了我的代码,并且可以确认没有意外调用 startActivity 或任何会导致 onCreate() 被多次调用的显式代码。我检查了这个,但这些错误似乎已经过时了
观察结果:
代码:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xyz">
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<!-- Required to maintain app compatibility. -->
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<application
android:name=".framework.presentation.BaseApplication"
android:allowBackup="false"
android:fullBackupOnly="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="${enableCrashReporting}" />
<activity
android:name="xyz.framework.presentation.MainActivity"
android:windowSoftInputMode="adjustResize"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="xyz.framework.presentation.main.RecipeActivity" …Run Code Online (Sandbox Code Playgroud) android android-manifest android-activity google-play internal-app-sharing
在我的应用程序中,我有:
-SplashScreen(SSc)准备应用程序(启动服务等)-MainActivity(MA)应用程序中最相关的部分,用于处理大多数操作-以及其他一些不相关的活动
对于我的应用程序,我希望具有类似launchMode singleTask的行为,以便即使通过链接打开我的应用程序,它也总是作为一个新任务启动,请在SMS / EMail应用程序中单击。最好是只有一个我的活动实例,因为它们都是可以连续导航的。
但是,当我以singleTask身份启动SSc时,它是堆栈的根并导航到MainActivity,按Home键,再次单击Launcher图标,应用程序将完全重新启动。因此,再次显示SSc,依此类推。在这种情况下,我希望将MainActivty放在首位。
我的愿望是:launcherclick-> SSc-> MA-> HOME-> launcherclick->将MA置于最前面-> HOME->从最近的站点重新启动->将MA置于最前面
单击具有相同实例的链接-> SSc / MA(是否首次启动)
在我的应用程序中,有多个实例是没有意义的,因为后台服务一次只能处理一个MainActivity,因为它仅针对可见的“事物”轮询数据。
您对实现这个目标有什么建议吗?
我的第一个想法是带有launchMode singletask的LauncherActivity,它没有布局以将意图路由到其他活动(最有可能是singleTop!?,因为它仅在一个任务中),例如:
public class LauncherActivity extends Activity {
private boolean firstStart = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
if(firstStart){
startActivity(new Intent(this, SplashScreen.class));
firstStart = false;
} else {
Intent i = new Intent(this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);
}
}
}
Run Code Online (Sandbox Code Playgroud)
清单xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="x.startintenttest">
<application
android:allowBackup="true"
android:allowTaskReparenting="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<activity …Run Code Online (Sandbox Code Playgroud) <activity
android:name=".activity.landingpage.LandingPageActivity"
android:label="@string/app_name"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar">
<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)
所以很简单.当我从启动器图标打开我的应用程序,它opens.I去点击启动我的应用程序图标再次再次带来了我的申请前自open.However,如果我去Play商店,点击打开从那里我的应用程序有两个实例打开.如果你想要一个如何工作的例子,facebook也有同样的问题.另外一个app fotmob也有同样的问题.
我正在尝试修复代码中的错误,希望有人可以指出我正确的方向.如果我的应用程序进入后台,并且用户只需进入"应用程序"并选择我的应用程序即可恢复,一切正常.
但是,如果他们将其放入后台并通过按住主页按钮并从最近的应用列表中选择它来恢复它,我会收到一个错误.我觉得这两个动作应该完全一样吗?
有谁知道从正常的应用程序列表恢复应用程序与通过按住主页按钮然后从该列表中选择它来恢复它之间的区别是什么?