Android-onCreate中的finish()行为不一致

问题描述 投票:0回答:1

我想创建一个能够设置计时器并处理隐式意图AlarmClock.ACTION_SET_TIMER的Android应用。这也将使其响应Google助手的“设置计时器为”命令。

收到此特殊意图后,我希望该应用设置计时器而不显示活动(尊重AlarmClock.ACTION_SET_TIMER)。

如果我在使用Google Assistant设置计时器时未启动该应用程序,则该应用程序将按预期方式工作:未显示活动,但是设置了计时器的代码已执行。

但是,如果我使用启动器启动活动,然后使用主屏幕按钮返回主屏幕(即仍可以在最近的活动中找到该活动),则此行为是错误的。显示活动,调用AlarmClock.EXTRA_SKIP_UI方法(即使我从AlarmClock.EXTRA_SKIP_UI调用onStart())。

据我对finish()的了解,如果我从onCreate调用the documentation,则不应调用其他生命周期回调,并且不应显示活动。

更令人困惑的是,显然finish()onCreate参见不同的意图

来自onCreate

onStart

AndroidManifest.xml

<activity android:name="com.example.testlifecycle.MainActivity">
  <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.SET_TIMER" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

方案1

未启动应用程序,请使用Google Assistant设置计时器。

MainActivity.kt

这里一切都按预期工作。

方案2

由启动器启动应用程序,按“主页”按钮,然后使用Google助手设置计时器。

使用启动器启动应用程序,外观与预期的一样:

class MainActivity : AppCompatActivity() {
    companion object {
        const val TAG = "MainActivity"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        Log.d(TAG, "onCreate called")
        super.onCreate(savedInstanceState)
        logIntent()

        if (intent.action == AlarmClock.ACTION_SET_TIMER) {
            Log.d(TAG, "Timer intent received, closing")
            // Do something useful here
            setResult(Activity.RESULT_OK)
            finish()
            return
        }

        setContentView(R.layout.activity_main)
    }

    override fun onStart() {
        Log.d(TAG,"onStart called")
        super.onStart()
        logIntent()
    }

    private fun logIntent() {
        Log.d(TAG, "Intent action ${intent.action}")
        Log.d(TAG, "Intent flags ${intent.flags.toString(16)}")

        intent.extras?.keySet()?.forEach {
            Log.d(TAG, "Intent extra $it = ${intent.extras?.get(it)}")
        }
    }
}

按主页按钮,然后使用Google助手:

2020-02-02 18:21:28.376 22269-22269/com.example.testlifycycle D/MainActivity: onCreate called
2020-02-02 18:21:28.408 22269-22269/com.example.testlifycycle D/MainActivity: Intent action android.intent.action.SET_TIMER
2020-02-02 18:21:28.409 22269-22269/com.example.testlifycycle D/MainActivity: Intent flags 10000000
2020-02-02 18:21:28.409 22269-22269/com.example.testlifycycle D/MainActivity: Intent extra android.intent.extra.alarm.SKIP_UI = true
2020-02-02 18:21:28.409 22269-22269/com.example.testlifycycle D/MainActivity: Intent extra com.google.android.apps.gsa.shared.util.starter.IntentStarter.ERROR_TOAST_ID = 2131951799
2020-02-02 18:21:28.410 22269-22269/com.example.testlifycycle D/MainActivity: Intent extra android.intent.extra.REFERRER_NAME = android-app://com.google.android.googlequicksearchbox/https/www.google.com
2020-02-02 18:21:28.410 22269-22269/com.example.testlifycycle D/MainActivity: Intent extra android.intent.extra.alarm.LENGTH = 3600
2020-02-02 18:21:28.410 22269-22269/com.example.testlifycycle D/MainActivity: Intent extra KEY_HANDOVER_THROUGH_VELVET = true
2020-02-02 18:21:28.410 22269-22269/com.example.testlifycycle D/MainActivity: Timer intent received, closing

我在这里看到的问题:

  1. 即使从2020-02-02 18:24:30.052 22269-22269/com.example.testlifycycle D/MainActivity: onCreate called 2020-02-02 18:24:30.055 22269-22269/com.example.testlifycycle D/MainActivity: Intent action android.intent.action.MAIN 2020-02-02 18:24:30.055 22269-22269/com.example.testlifycycle D/MainActivity: Intent flags 10200000 2020-02-02 18:24:30.055 22269-22269/com.example.testlifycycle D/MainActivity: Intent extra profile = 0 2020-02-02 18:24:30.158 22269-22269/com.example.testlifycycle D/MainActivity: onStart called 2020-02-02 18:24:30.158 22269-22269/com.example.testlifycycle D/MainActivity: Intent action android.intent.action.MAIN 2020-02-02 18:24:30.158 22269-22269/com.example.testlifycycle D/MainActivity: Intent flags 10200000 2020-02-02 18:24:30.158 22269-22269/com.example.testlifycycle D/MainActivity: Intent extra profile = 0 中调用了2020-02-02 18:26:21.398 23158-23158/com.example.testlifycycle D/MainActivity: onCreate called 2020-02-02 18:26:21.402 23158-23158/com.example.testlifycycle D/MainActivity: Intent action android.intent.action.SET_TIMER 2020-02-02 18:26:21.402 23158-23158/com.example.testlifycycle D/MainActivity: Intent flags 10400000 2020-02-02 18:26:21.402 23158-23158/com.example.testlifycycle D/MainActivity: Intent extra android.intent.extra.alarm.SKIP_UI = true 2020-02-02 18:26:21.402 23158-23158/com.example.testlifycycle D/MainActivity: Intent extra com.google.android.apps.gsa.shared.util.starter.IntentStarter.ERROR_TOAST_ID = 2131951799 2020-02-02 18:26:21.403 23158-23158/com.example.testlifycycle D/MainActivity: Intent extra android.intent.extra.REFERRER_NAME = android-app://com.google.android.googlequicksearchbox/https/www.google.com 2020-02-02 18:26:21.403 23158-23158/com.example.testlifycycle D/MainActivity: Intent extra android.intent.extra.alarm.LENGTH = 60 2020-02-02 18:26:21.403 23158-23158/com.example.testlifycycle D/MainActivity: Intent extra KEY_HANDOVER_THROUGH_VELVET = true 2020-02-02 18:26:21.403 23158-23158/com.example.testlifycycle D/MainActivity: Timer intent received, closing 2020-02-02 18:26:21.446 23158-23158/com.example.testlifycycle D/MainActivity: onStart called 2020-02-02 18:26:21.446 23158-23158/com.example.testlifycycle D/MainActivity: Intent action android.intent.action.MAIN 2020-02-02 18:26:21.446 23158-23158/com.example.testlifycycle D/MainActivity: Intent flags 10200000 2020-02-02 18:26:21.447 23158-23158/com.example.testlifycycle D/MainActivity: Intent extra profile = 0 ,也会调用[onStart
  2. [finsh记录具有动作onCreate的意图,而onStart记录(预期)MAIN

我想我可能对Android意图/生命周期机制缺乏了解。在此问题上的任何帮助,我将不胜感激。

android kotlin android-intent android-lifecycle
1个回答
1
投票

您正在处理onCreate的两个不同实例:

  • 您点击启动器图标
  • Android创建SET_TIMER的实例,并在其上调用MainActivity / MainActivity
  • 您按主页
  • 您执行了一些助手Y动作,触发了onCreate()隐式onStart()
  • Android在现有任务中创建了SET_ALARM的第二个实例,并将该任务置于前台
  • Intent的第二个实例被MainActivity调用,然后您MainActivity该实例
  • 由于您的任务在前台,并且该任务中还有另一个活动(onCreate()的第一个实例,所以该活动被带回到前台,并在其上调用了finish()

我无法完全与助理交谈,因为我完全避免了。但是,如果您希望“助理”启动的活动位于单独的任务中,而不希望将任何现有任务置于前台,则您需要为此在清单中做一些事情。我的出发点是针对不同的场景进行单独的活动,然后在MainActivity活动上使用onStart()将其路由到单独的任务。

© www.soinside.com 2019 - 2024. All rights reserved.