【问题标题】:New Intent() starts new instance with Android: launchMode="singleTop"New Intent() 使用 Android 启动新实例:launchMode="singleTop"
【发布时间】:2010-03-11 11:28:22
【问题描述】:

我在清单中有 Activity Aandroid:launchMode="singleTop"

如果我转到 Activity BCD,我有菜单快捷方式可以返回到我的应用程序根 Activity (A)。

代码如下:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);

但是,它不会返回到我的MainActivity.class 的现有实例A,而是创建一个新实例-> 它转到onCreate() 而不是onNewIntent()

这不是预期的行为,对吧?

【问题讨论】:

    标签: android android-activity android-intent


    【解决方案1】:

    这应该可以解决问题。

    <activity ... android:launchMode="singleTop" />
    

    当您创建启动应用程序的意图时:

    Intent intent= new Intent(context, YourActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    

    这是应该需要的。

    【讨论】:

    • 这对我不起作用。:(下面的代码行工作正常。 Intent myIntent = new Intent(getBaseContext(), MainActivity.类); myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(myIntent);
    【解决方案2】:

    最终对我有用的是:

    Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
    myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(myIntent);
    

    【讨论】:

    【解决方案3】:

    引用自documentation

    “标准”和“单顶”模式 仅在一个方面彼此不同 尊重:每次都有新的意图 对于“标准”活动,新的 类的实例被创建为 回应这个意图。每个实例 处理单一意图。同样,一个 “singleTop”活动的新实例 也可以创建来处理一个新的 意图。但是,如果目标任务 已经有一个现有的实例 顶部的活动 堆栈,该实例将收到 新意图(在 onNewIntent() 称呼);未创建新实例。

    我不能 100% 确定“在其堆栈顶部已经有一个 Activity 的现有实例”是什么意思,但也许您的 Activity 不满足此条件。

    singleTasksingleInstance 适合你吗?或者,也许您可​​以尝试在您创建的意图上设置 FLAG_ACTIVITY_SINGLE_TOP,看看这是否会有所不同,尽管我认为不会。

    【讨论】:

    • 这意味着当前处于活动状态的任务堆栈(应用程序堆栈)在顶部有一个该活动的实例(例如,一个活动在获得焦点时正在启动同一活动的另一个副本)。同一活动的其他实例可能存在于其他任务(应用程序)中。
    • 所以如果我的意愿是在同一个进程中启动一个新的活动实例,但我已经专注于该活动的前一个实例,我该怎么做?
    • @rayman 我想使用标准模式?它在文档中说“每次有一个“标准”活动的新意图时,都会创建一个新的类实例来响应该意图。”
    【解决方案4】:

    您可以返回到同一个现有的 Activity 实例 android:launchMode="singleInstance"

    在清单中。 当你从B返回A时,可能需要finish()来销毁B

    【讨论】:

      【解决方案5】:

      首先,可以检查堆栈结构。对于启动模式:singleTop
      如果相同活动的实例已经在任务堆栈的顶部,则该实例将被重用以响应意图。

      所有活动都保存在堆栈中(“先进后出”),因此如果您当前的活动位于堆栈顶部并且您在 manifest.file 中将其定义为 singleTop

      android:name=".ActivityA"
      android:launchMode="singleTop"
      

      如果你在 ActivityA 中重新创建它不会进入的活动 onCreate 将恢复 onNewIntent() 并且你可以通过创建通知来查看 不是:İ如果你不实现 onNewIntent(Intent) 你不会得到新的意图。

      Intent activityMain = new Intent(ActivityA.this,
                              ActivityA.class);
      
                      activityMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                              | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                      startActivity(activityMain);
      
      
      
      
          @Override
              protected void onNewIntent(Intent intent) {
      
                  super.onNewIntent(intent);
      
                  notify("onNewIntent");
              }
      
              private void notify(String methodName) {
      
                  String name = this.getClass().getName();
                  String[] strings = name.split("\\.");
      
                  Notification noti = new Notification.Builder(this)
                          .setContentTitle(methodName + "" + strings[strings.length - 1])
                          .setAutoCancel(true).setSmallIcon(R.drawable.ic_launcher)
                          .setContentText(name).build();
                  NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                  notificationManager.notify((int) System.currentTimeMillis(), noti);
      
              }
      

      【讨论】:

        【解决方案6】:

        这是因为原来的 A 活动在你从 B、C 或 D 启动时已经被销毁了。因此,将调用 onCreate 而不是 onNewIntent()。解决这个问题的一种方法是在开始一个新的 A 之前总是销毁现有的 A(使用 FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK 连词),所以总是会调用 onCreate,并且你通过检查 getIntent() 将 onNewIntent() 的代码放入 onCreate ) 是您开始的意图。

        【讨论】:

          猜你喜欢
          • 2020-02-01
          • 2014-11-04
          • 2017-02-27
          • 1970-01-01
          • 1970-01-01
          • 2012-03-10
          • 2017-06-21
          • 2017-02-12
          • 1970-01-01
          相关资源
          最近更新 更多