我想创建一个能够设置计时器并处理隐式意图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>
MainActivity.kt
这里一切都按预期工作。
使用启动器启动应用程序,外观与预期的一样:
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
我在这里看到的问题:
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
finsh
记录具有动作onCreate
的意图,而onStart
记录(预期)MAIN
我想我可能对Android意图/生命周期机制缺乏了解。在此问题上的任何帮助,我将不胜感激。
您正在处理onCreate
的两个不同实例:
SET_TIMER
的实例,并在其上调用MainActivity
/ MainActivity
onCreate()
隐式onStart()
SET_ALARM
的第二个实例,并将该任务置于前台Intent
的第二个实例被MainActivity
调用,然后您MainActivity
该实例onCreate()
的第一个实例,所以该活动被带回到前台,并在其上调用了finish()
我无法完全与助理交谈,因为我完全避免了。但是,如果您希望“助理”启动的活动位于单独的任务中,而不希望将任何现有任务置于前台,则您需要为此在清单中做一些事情。我的出发点是针对不同的场景进行单独的活动,然后在MainActivity
活动上使用onStart()
将其路由到单独的任务。