Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 一个应用程序和两个独立的活动_Android_Android Intent_Android Activity - Fatal编程技术网

Android 一个应用程序和两个独立的活动

Android 一个应用程序和两个独立的活动,android,android-intent,android-activity,Android,Android Intent,Android Activity,我正在开发只包含两个活动的简单应用程序 活动C配置应用程序 当某些事件发生时与用户交互的活动 用户不可能从一个活动导航到另一个活动-这就是为什么我称它们为独立活动。此外,更多的活动A仅在表单事件中调用,用户无法手动执行 问题。让我们假设应用程序已正确配置。系统中发生了一些事件,因此正在向用户显示应用程序A。用户与之交互,活动进入后台。然后用户决定启动配置活动C。活动C显示给用户。用户使用“后退”按钮“关闭”活动,但用户看到的不是android launcher或桌面,而是活动A(取自历史记录

我正在开发只包含两个活动的简单应用程序

  • 活动C配置应用程序
  • 当某些事件发生时与用户交互的活动
用户不可能从一个活动导航到另一个活动-这就是为什么我称它们为独立活动。此外,更多的活动A仅在表单事件中调用,用户无法手动执行

问题。让我们假设应用程序已正确配置。系统中发生了一些事件,因此正在向用户显示应用程序A。用户与之交互,活动进入后台。然后用户决定启动配置活动C。活动C显示给用户。用户使用“后退”按钮“关闭”活动,但用户看到的不是android launcher或桌面,而是活动A(取自历史记录)

类似的情况可能会以另一种方式发生。C被用户使用,然后被带到后台。一些事件显示活动A,用户使用后退按钮转到C,而不是关闭活动A

我已经解决了这个问题,但解决方案相当肮脏。是否有任何干净的标准的方法来解决此类问题

我的部分解决方案包括一个答案中的建议:

AndroidManifest.xml中的代码段:

<activity
  android:name=".C"
  android:clearTaskOnLaunch="true"
  android:excludeFromRecents="false"
  android:launchMode="singleTask"
  ...
 >
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>
<activity
  android:exported="false"
  android:name=".A"
  android:excludeFromRecents="true"
  android:noHistory="true"
  android:launchMode="singleInstance"
  android:clearTaskOnLaunch="true"
  ....
>
</activity>
从事件处理程序中剪切:

public class H extends BroadcastReceiver {
...
  Intent intent = new Intent(p_context, A.class);
  intent.addFlags(Intent.FLAG_FROM_BACKGROUND);
  intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  p_context.startActivity(intent);
...
}

它适用于我的应用程序。但是,我希望应用程序(活动C)出现在最近的应用程序中。但一旦调用了活动,应用程序就会从最近的中删除。

我不知道这是否是最干净的方法,但您可以重写
void onBackPressed()
活动方法。通过这种方式,您可以手动将活动移动到后台,如下所示,并防止前一个活动突然出现:

public void onBackPressed () {
    moveTaskToBack (true);
}
编辑:发现有一种更好的方法:


打开您的
AndroidManifest.xml
,在每个声明中放入以下内容:`android:noHistory=“true”``。这样做会告诉Android您的活动不会留下历史记录,因此,当用户回击时,Android将退出应用程序,因为没有其他活动可供其返回。

所以您希望的是您以前的活动
finish()在移动到另一个活动时编辑?您不需要完成当前活动,您只能按照我的建议将其移动到后台。另外,请注意,将电源按钮包括在开关案例列表中会产生一个新问题:当用户锁定屏幕时,应用程序将关闭。我不知道这是否是建议性的,但默认的Android行为表明这是错误的。活动A应该只在某些事件发生时使用。当用户决定锁定屏幕时,与活动A交互的原因无效。目前C中没有与应用程序状态相关的代码,因此我根本不显示它。noHistory不是活动C的选项。它调用其他活动从通讯簿中选择联系人。因此,它必须保留在历史堆栈中,以便android知道在哪里交付结果。然后实现这一点的最简单方法是实现我的第一个解决方案。实际上,两者都是相同的,但第二种方法需要更少的代码,并且侵入性更小。另一方面,第一个更具可定制性。当我现在使用代码时,我开始相信您的firs解决方案确实是实现我想要的最干净的方法。我可能会使用太多不必要的android:。。。属性或调用活动A时标记太多。因此,任何其他建议都很好。谢谢你的帮助。
public void onBackPressed () {
    moveTaskToBack (true);
}