我正在观看Intent.FLAG_ACTIVITY_CLEAR_TOP的行为.
例如,我有三个活动A,B和C现在Flow是A - > B - > C.
现在当我从C开始使用此标志时使用以下代码.
Intent intent_to_a=new Intent(C.this,A.class);
intent_to_home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent_to_a);
Run Code Online (Sandbox Code Playgroud)
AFAIK,Intent.FLAG_ACTIVITY_CLEAR_TOP应该删除B并且应该恢复A.它也会以相同但奇怪的方式执行.它删除B,而不是删除A而不是创建A.还调用A的方法onDestroy.任何人都可以告诉我它是否合适?如果我不想让它破坏我该怎么办?
想象一下,您有以下一系列活动:
Activity A -> Activity B -> Activity C
Run Code Online (Sandbox Code Playgroud)
当您使用活动C时,按下本机后退按钮,将转到活动B.现在活动C的状态是什么?它还在内存中还是已经完成了?
如果它仍然在内存中,有没有办法恢复活动?除了启动此活动的另一个实例...
我应该补充一点,这是你不使用任何标志的标准情况,包括: FLAG_ACTIVITY_CLEAR_TOP
当我的Android设备上的电池死在活动和片段类(如果有的话)用什么方法在设备的"关闭"阶段被称为?
此外,如果用户当前正在查看我的应用程序中的屏幕,并且他们按住电源按钮并选择关闭,那么当电池电量耗尽并自动关闭时,调用/未调用的事件是否一致?
在onPause?
调用OnStop?
的OnDestroy?
OnDetach?
额外奖励:我是否有足够的时间将少量数据保存到Web服务器?
为了澄清当设备的电池"完全"死亡时"死亡",不再接受输入,屏幕上会弹出一个消息框/加载屏幕,显示"电源关闭".设备关闭后不久就会出现.
我只是需要足够的时间来保存手机关机之前的状态,我有一个策略来清理保存的数据,如果手机没有关闭,但我想尽可能接近手机关闭(任何超过一分钟真是无意义).
java android activity-lifecycle android-lifecycle android-activity
当试图从ViewModel返回的片段中观察实时数据时,我得到了以下异常,在此之前我在这篇文章中详细阐述了错误,交换
android.arch.lifecycle:common-java8:1.0.0-beta2了android.arch.lifecycle:compiler:1.0.0-beta2解决该问题,但现在我得到了以下异常
你可以在这里找到整个代码
E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1
Process: com.nrs.nsnik.architecturecomponents, PID: 4114
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/arch/core/executor/AppToolkitTaskExecutor;
at android.arch.persistence.room.InvalidationTracker.addObserver(InvalidationTracker.java:241)
at android.arch.persistence.room.InvalidationTracker.addWeakObserver(InvalidationTracker.java:257)
at com.nrs.nsnik.architecturecomponents.data.NoteDao_Impl$4.compute(NoteDao_Impl.java:146)
at com.nrs.nsnik.architecturecomponents.data.NoteDao_Impl$4.compute(NoteDao_Impl.java:134)
at android.arch.lifecycle.ComputableLiveData$2.run(ComputableLiveData.java:87)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.arch.core.executor.AppToolkitTaskExecutor" on path: DexPathList[[zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/base.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_dependencies_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_0_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_1_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_2_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_3_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_4_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_5_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_6_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_7_apk.apk", zip file …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-livedata android-architecture-components
每当您调用.observe()LiveData 时,观察者都会收到该 LiveData 的最后一个值。这在某些情况下可能有用,但对我来说没有用。
每当我调用 时.observe(),我希望观察者只接收未来的 LiveData 更改,而不是.observe()调用时它所持有的值。
对于一个 LiveData 实例,我可能有多个观察者。我希望他们都能在发生 LiveData 更新时收到更新。
我希望每个 LiveData 更新仅被每个观察者使用一次。我认为这只是对第一个要求的重新表述,但我的头已经开始旋转,我对此不确定。
在谷歌搜索这个问题时,我发现了两种常见的方法:
将数据包装在 an 中LiveData<SingleEvent<Data>>并检查该类SingleEvent是否已被消耗。
如果观察者已经获得事件,则扩展MediatorLiveData并使用查找映射
这些方法的示例可以在这里找到: https://gist.github.com/JoseAlcerreca/5b661f1800e1e654f07cc54fe87441af#gistcomment-2783677 https://gist.github.com/hadilq/f095120348a6a14251a02aca329f1845#file-liveevent-kt https://gist .github.com/JoseAlcerreca/5b661f1800e1e654f07cc54fe87441af#file-event-kt
不幸的是,这些例子都不能满足我的所有要求。大多数时候,问题是任何新的观察者在订阅时仍然收到最后的 LiveData 值。这意味着每当用户在屏幕之间导航时,已经显示的 Snackbar 就会一次又一次地显示。
为了让您了解我正在谈论的内容/我正在编码的内容:
我遵循Android架构组件的LiveData MVVM设计:
Repository.delete()RepositoryEvents。因此,当删除完成后,Repository 会通知 ViewModel,ViewModel 也会通知 ListFragment。
现在,当用户切换到第二个 ListFragment 时,会发生以下情况:
android android-lifecycle android-mvvm android-livedata android-architecture-components
我目前正在使用 Room 存储单词翻译列表,并将查询作为 LiveData 返回以监视插入和更新。然而,当我需要重新获取不同源语言的翻译时,我遇到了问题(我当前的策略是将实时数据重新分配给房间查询的结果)。
我使用以下 SQL 查询获取要翻译的语言以及特定语言的翻译
@Dao
interface TranslationDatabaseDao {
...
//Returns all pairs of languages to translate to/from
@Query("SELECT * FROM language_pairs")
fun getAllLanguagePairs(): LiveData<List<LanguagePair>>
//Returns translations with the specified source language
@Query("SELECT * FROM translations WHERE sourceLanguage = :language")
fun getTranslations(language: String): LiveData<List<TranslationResult>>
...
}
Run Code Online (Sandbox Code Playgroud)
我在实例化视图模型时调用它,并在用户更改语言时再次调用它(见changeLanguage(...)下文)。
class translationViewmodel(private val database: TranslationDatabaseDao, initLanguage: String): ViewModel() {
...
val languages: LiveData<List<LanguagePair>> = database.getAllLanguagePairs()
val currentLanguages = Transformations.map(languages) { allLanguages ->
allLanguages?.let {
it[0] //Get the first …Run Code Online (Sandbox Code Playgroud) android-lifecycle android-fragments kotlin android-room kotlin-coroutines
我的视图模型工厂:
class ViewModelFactory @Inject constructor(
private val viewModelMap: MutableMap<Class<out ViewModel>, ViewModelAssistedFactory<out ViewModel>>,
owner: SavedStateRegistryOwner,
defaultArgs: Bundle?
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
@Throws(IllegalStateException::class)
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(key: String, modelClass: Class<T>, handle: SavedStateHandle): T {
return viewModelMap[modelClass]?.create(handle) as? T ?: throw IllegalStateException("Unknown ViewModel class")
}
}
Run Code Online (Sandbox Code Playgroud)
活动:
@Inject
lateinit var viewModelFactory: ViewModelFactory
protected val viewModel: ViewModel by lazy { ViewModelProvider(this, viewModelFactory).get(getViewModelClass()) }
Run Code Online (Sandbox Code Playgroud)
视图模型:
@AssistedInject.Factory
interface Factory : ViewModelAssistedFactory<SplashViewModel>
Run Code Online (Sandbox Code Playgroud)
我想知道如何动态提供 defaultArgs 而不是:
活动模块
@Module
companion object …Run Code Online (Sandbox Code Playgroud) android android-lifecycle dagger-2 android-viewmodel viewmodel-savedstate
Given the following situation (partially pseudo-code):
A which in turn executes this code: progressBar.setVisibility(VISIBLE) // by default is set as INVISIBLE in the layout
startActivityForResult(ActivityB)
Is it possible that step 2 (rotating device) causes a configuration change which leads to the recreation of Activity A and therefore the progressBar to be hidden before Activity B is shown?
I know that startActivityForResult is an asynchronous call, but I am not sure …
android android-lifecycle android-configchanges android-activity
我最近更新了我的Android 应用程序项目(Android Gradle Plugin 7.0.3、targetSdk 30、JVM 11)的Travis CI 配置以使用新的命令行工具。我选择启动模拟器来运行仪器测试。我在用。system-images;android-19;google_apis;armeabi-v7aandroidx.test.espresso:espresso-core:3.4.0
模拟器启动并执行仪器测试,connectedDebugAndroidTest但全部失败并出现以下错误:
AboutActivityTest > renderBuildInformation[test(AVD) - 4.4.2] FAILED
java.lang.AssertionError: Activity never becomes requested state
"[DESTROYED, STARTED, RESUMED, CREATED]" (last lifecycle transition = "PRE_ON_CREATE")
at androidx.test.core.app.ActivityScenario.waitForActivityToBecomeAnyOf(ActivityScenario.java:338)
...
Run Code Online (Sandbox Code Playgroud)
Gradle 然后输出:
Caused by: org.gradle.api.GradleException: There were failing tests. See the report
at: file:///home/travis/build/Umweltzone/Umweltzone/Umweltzone/build/reports/androidTests/connected/index.html
at com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask.doTaskAction(DeviceProviderInstrumentTestTask.java:388)
at com.android.build.gradle.internal.tasks.NonIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(BaseTask.kt:63)
at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:51)
...
Run Code Online (Sandbox Code Playgroud)
完整构建日志:
如果我在 Pixel 2 设备、Android 11 (SDK 30) 上本地运行相同的测试,则会成功执行。
如何修复 Travis CI / Android 模拟器配置? …
android android-emulator android-lifecycle travis-ci android-espresso
最近,自 android 生命周期库版本 2.6.0-alpha01 以来,我们有了一个新的 API,即
\ncollectAsStateWithLifecycle(...)\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n如果您\xe2\x80\x99 使用 Jetpack Compose 构建 Android 应用程序,请使用\n
\ncollectAsStateWithLifecycle可组合函数(而不是\ncollectAsState)
我尝试一下,对于流动(冷流)例如
\n val counter = flow {\n var value = 0\n while (true) {\n emit(value++)\n delay(1000)\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n拥有它是有用的
\nflow.collectAsStateWithLifecycle(0)\nRun Code Online (Sandbox Code Playgroud)\n但是如果我们有一个像 mutableStateFlow 这样的热流
\nval stateFlow = MutableStateFlow(0)\nRun Code Online (Sandbox Code Playgroud)\n拥有似乎没什么用
\nstateFlow.collectAsStateWithLifecycle(0)\nRun Code Online (Sandbox Code Playgroud)\n鉴于它不会阻止任何排放。
\n我说collectAsStateWithLifecycle只对冷流有用,对热流无效,这样说对吗?
如果我错了,你能给我举一个collectAsStateWithLifecycle对热流也有用的例子吗?
android android-lifecycle kotlin kotlin-flow kotlin-stateflow
android ×9
android-architecture-components ×2
kotlin ×2
android-mvvm ×1
android-room ×1
dagger-2 ×1
java ×1
kotlin-flow ×1
travis-ci ×1