标签: android-lifecycle

Flag Activity Clear Top会破坏目标活动而不是创建目标活动

我正在观看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.任何人都可以告诉我它是否合适?如果我不想让它破坏我该怎么办?

android android-intent android-lifecycle android-activity

7
推荐指数
1
解决办法
1万
查看次数

ANDROID:按下后退按钮后的活动状态

想象一下,您有以下一系列活动:

Activity A -> Activity B -> Activity C
Run Code Online (Sandbox Code Playgroud)

当您使用活动C时,按下本机后退按钮,将转到活动B.现在活动C的状态是什么?它还在内存中还是已经完成了?

如果它仍然在内存中,有没有办法恢复活动?除了启动此活动的另一个实例...

我应该补充一点,这是你不使用任何标志的标准情况,包括: FLAG_ACTIVITY_CLEAR_TOP

android android-intent android-lifecycle android-activity

7
推荐指数
2
解决办法
1万
查看次数

电池耗尽时会调用哪些Android方法?

当我的Android设备上的电池在活动和片段类(如果有的话)用什么方法在设备的"关闭"阶段被称为?

此外,如果用户当前正在查看我的应用程序中的屏幕,并且他们按住电源按钮并选择关闭,那么当电池电量耗尽并自动关闭时,调用/未调用的事件是否一致?

在onPause?

调用OnStop?

的OnDestroy?

OnDetach?

额外奖励:我是否有足够的时间将少量数据保存到Web服务器?

为了澄清当设备的电池"完全"死亡时"死亡",不再接受输入,屏幕上会弹出一个消息框/加载屏幕,显示"电源关闭".设备关闭后不久就会出现.

我只是需要足够的时间来保存手机关机之前的状态,我有一个策略来清理保存的数据,如果手机没有关闭,但我想尽可能接近手机关闭(任何超过一分钟真是无意义).

java android activity-lifecycle android-lifecycle android-activity

7
推荐指数
1
解决办法
1020
查看次数

使用observable时的实时数据异常

当试图从ViewModel返回的片段中观察实时数据时,我得到了以下异常,在此之前我在这篇文章中详细阐述了错误,交换 android.arch.lifecycle:common-java8:1.0.0-beta2android.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

7
推荐指数
1
解决办法
1858
查看次数

让每个观察者仅在订阅/观察时接收*新的LiveData

每当您调用.observe()LiveData 时,观察者都会收到该 LiveData 的最后一个值。这在某些情况下可能有用,但对我来说没有用。

  1. 每当我调用 时.observe(),我希望观察者只接收未来的 LiveData 更改,而不是.observe()调用时它所持有的值。

  2. 对于一个 LiveData 实例,我可能有多个观察者。我希望他们都能在发生 LiveData 更新时收到更新。

  3. 我希望每个 LiveData 更新仅被每个观察者使用一次。我认为这只是对第一个要求的重新表述,但我的头已经开始旋转,我对此不确定。


在谷歌搜索这个问题时,我发现了两种常见的方法:

  1. 将数据包装在 an 中LiveData<SingleEvent<Data>>并检查该类SingleEvent是否已被消耗。

  2. 如果观察者已经获得事件,则扩展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设计:

  • 2 ListFragment 显示条目列表。
  • 他们使用同一 ViewModel 类的 2 个实例来观察与 UI 相关的 LiveData。
  • 用户可以删除此类 ListFragment 中的条目。删除是通过 ViewModel 调用完成的Repository.delete()
  • ViewModel 观察 的存储库RepositoryEvents

因此,当删除完成后,Repository 会通知 ViewModel,ViewModel 也会通知 ListFragment。

现在,当用户切换到第二个 ListFragment 时,会发生以下情况:

  • 创建第二个 …

android android-lifecycle android-mvvm android-livedata android-architecture-components

7
推荐指数
1
解决办法
3135
查看次数

“刷新”房间数据库提供的 LiveData 的最佳方式

我目前正在使用 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

7
推荐指数
1
解决办法
3534
查看次数

如何从 AbstractSavedStateViewModelFactory 动态设置包

我的视图模型工厂

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

7
推荐指数
1
解决办法
2196
查看次数

Can a configuration change occur after startActivityForResult was called?

Given the following situation (partially pseudo-code):

  1. User presses a button in Activity A which in turn executes this code:
    progressBar.setVisibility(VISIBLE) // by default is set as INVISIBLE in the layout
    startActivityForResult(ActivityB)
  1. User rotates his device

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

7
推荐指数
0
解决办法
66
查看次数

AssertionError:活动永远不会变成请求的状态“[DESTROYED、STARTED、RESUMED、CREATED]”(最后一个生命周期转换=“PRE_ON_CREATE”)

我最近更新了我的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

7
推荐指数
0
解决办法
1374
查看次数

难道collectAsStateWithLifecycle只适用于冷流,对热流没有帮助(例如stateFlow)?

最近,自 android 生命周期库版本 2.6.0-alpha01 以来,我们有了一个新的 API,即

\n
collectAsStateWithLifecycle(...)\n
Run Code Online (Sandbox Code Playgroud)\n

这是 Google Developer 在这篇文章中提倡的

\n
\n

如果您\xe2\x80\x99 使用 Jetpack Compose 构建 Android 应用程序,请使用\ncollectAsStateWithLifecycle可组合函数(而不是\n collectAsState

\n
\n

我尝试一下,对于流动(冷流)例如

\n
    val counter = flow {\n        var value = 0\n        while (true) {\n           emit(value++)\n           delay(1000)\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

拥有它是有用的

\n
flow.collectAsStateWithLifecycle(0)\n
Run Code Online (Sandbox Code Playgroud)\n

但是如果我们有一个像 mutableStateFlow 这样的热流

\n
val stateFlow = MutableStateFlow(0)\n
Run Code Online (Sandbox Code Playgroud)\n

拥有似乎没什么用

\n
stateFlow.collectAsStateWithLifecycle(0)\n
Run Code Online (Sandbox Code Playgroud)\n

鉴于它不会阻止任何排放。

\n

我说collectAsStateWithLifecycle只对冷流有用,对热流无效,这样说对吗?

\n

如果我错了,你能给我举一个collectAsStateWithLifecycle对热流也有用的例子吗?

\n

android android-lifecycle kotlin kotlin-flow kotlin-stateflow

7
推荐指数
1
解决办法
5739
查看次数