【问题标题】:onStart invoked twice with no onStop in between?onStart 调用了两次,中间没有 onStop?
【发布时间】:2015-01-25 07:40:05
【问题描述】:

我有一个已经可见的活动(所以 onStart 已经运行),我拉下通知栏,单击与所述活动的待处理意图相关联的通知。 1) onPause 被调用。请注意,不调用 onStop 2) 为新的活动实例调用 onCreate,然后调用 onStart 等...

正如建议的那样,我尝试了 singleTask 和 singleInstance,但它们不会阻止在调用 onPause 后创建新实例。有趣的是,这只发生在活动可见并且我单击其通知时。如果它已经停止,Android 将使用旧实例。也许我需要调整 PendingIntent 的生成方式...

【问题讨论】:

  • 好的,仔细调查,让我们知道最后会发生什么。祝你好运。
  • 别人也有类似的问题stackoverflow.com/questions/10104110/…
  • 这毫无意义。您最初是从安装程序屏幕启动应用程序,还是直接从 IDE(Eclipse、IntelliJ、Android Studio)启动应用程序?如果是这样,您可能会看到这个讨厌的 Android 错误:stackoverflow.com/a/16447508/769265

标签: android android-activity android-lifecycle android-pendingintent


【解决方案1】:

我认为当您运行 Pending Intent 时,可能会在堆栈中创建一个新的 Activity。配置您的 Activity,使其不会通过设置为 singleTask 或 singleInstance 的 launchMode 创建新的 Activity。

这是我用于活动的设置示例:

<activity
            android:name="com.zakimak.HomeScreenActivity"
            android:screenOrientation="portrait"
            android:label="@string/app_name"
            android:launchMode="singleTask" />

那么构建待处理的intent如下:

    Intent resultIntent = new Intent(context, HomeScreenActivity.class);
    // The request code 24601  uniquely identifies the notification generated 
    // by the application. As an application may generate several having        
    //different codes to identify each. CAUTION: It's value should be greater than 0 
    //.i.e. RESULT_FIRST_USER+

    PendingIntent resultPendingIntent = PendingIntent.getActivity(context,
            24601, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    Notification notification = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.ic_launcher).setContentTitle("Title")
            .setContentText("Bla bla").setOngoing(true)
            .setTicker("Bla bla is running").setAutoCancel(false)
            .setContentIntent(resultPendingIntent).build();

Step1:我启动应用程序并显示 HomeScreenActivity。然后我拖动通知栏并单击通知。它打开 Activity 并调用以下回调方法:onPause 和 onResume。调用 onPause 是因为活动在抽屉下仍然可见。

Step2:我启动应用程序并显示 HomeScreenActivity 并按 Home 或启动另一个活动,然后调用 onStop。然后我拖动通知栏并单击通知。它打开 Activity 并调用以下回调方法:onStart 和 onResume。

在这两种情况下,onCreate 仅在第一次迭代启动 Activity 时调用一次。在模拟器中测试过。

在某些情况下,当您的设备负载过重或试图省电时,Android 可能会终止该进程。

【讨论】:

  • 非常感谢,我已经更新了问题,似乎没有帮助。也许我在做一些愚蠢的事情,不确定......
  • 我为您提供了更新。请检查更新的答案。
  • 代码 24601 是什么,你是怎么得出这个数字的?那应该是你用来交流的一些私有代码,而不是 API 常量的一部分,只是好奇,谢谢。
  • 我将您的解决方案与我的解决方案进行了比较,唯一的区别是我在您通过 24601 的地方通过了 0。我现在尝试了 1,它也可以工作。我不知道为什么这会有所不同,但确实如此。
  • 回答,我自己的问题,我相信答案在于Activity.java中定义的常量。 PendingIntent 是调用 startActivity(及其所有变体)的标记,因此代码的含义必须相同。我会接受你的回答,但能否请你添加一条评论,传递的代码必须是 Activity.RESULT_USER 及更高版本[续]
猜你喜欢
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 2013-06-17
相关资源
最近更新 更多