标签: android-lifecycle

从相机应用程序返回时重新创建活动

此问题仅出现在两款较旧的三星 Galaxy 机型上,但仍然非常容易重现。

我有一个简单的应用程序,可以显示通过设备的相机应用程序拍摄的照片。它有一个按钮来启动该应用程序,并在 AsyncTask 中处理结果以将其下采样到 ImageView 中。

从相机应用程序返回时的活动流程会出现问题:由于某种原因,活动被创建,处理导致 AsyncTask 中的结果onActivityResult()被销毁,然后立即重新创建。一旦 AsyncTask 完成,它就会保存对不正确/旧活动的引用。

将一些调试语句放入各种生命周期回调中会发现这种奇怪的行为:

06-02 16:01:53.509: I/myapp(4437): onCreate com.myapp.PhotoActivity_@488cbef8
06-02 16:01:53.509: I/myapp(4437): onResume com.myapp.PhotoActivity_@488cbef8
06-02 16:01:58.298: I/myapp(4437): onPause com.myapp.PhotoActivity_@488cbef8
06-02 16:01:59.470: I/myapp(4437): onStop com.myapp.PhotoActivity_@488cbef8
[a photo is taken in the camera app]
06-02 16:02:10.196: I/myapp(4437): onCreate com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.251: I/myapp(4437): onActivityResult com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.259: I/myapp(4437): onResume com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.712: I/myapp(4437): onPause com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.720: I/myapp(4437): onStop com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.923: I/myapp(4437): onCreate com.myapp.PhotoActivity_@48817118
06-02 16:02:10.931: I/myapp(4437): onResume com.myapp.PhotoActivity_@48817118
06-02 …
Run Code Online (Sandbox Code Playgroud)

android activity-lifecycle android-camera-intent android-lifecycle

5
推荐指数
1
解决办法
3774
查看次数

Android 区分应用程序在后台和旋转事件

我的基本问题是弄清楚如何确定我的应用程序何时进入后台以及何时进行轮换。

我有一个用于音乐识别的录音服务。我想智能地管理该服务的生命周期以完成以下任务:

  1. 在最终导致设备轮换的生命周期事件期间保持服务运行。
  2. 当应用程序进入后台时停止服务(以释放麦克风)。

我无法覆盖,onConfigurationChanged因为我的应用程序使用带有以编程方式添加片段的操作栏选项卡,并且无法重新扩展片段布局。

克服这些挑战的好方法是什么?到目前为止,我最好的解决方案是更新服务中的计时器,但我想考虑替代方案。我不喜欢计时器,因为在使用语音搜索时,麦克风争用是很常见的。

android audio-recording android-service android-lifecycle

5
推荐指数
1
解决办法
1210
查看次数

CountDownTimer :在 Activity、ViewModel 或单独的类中?

我想创建一个CountdownTimer将触发更新 UI 的事件(触发弹出窗口、启动动画等)。

我想知道如何做到这一点,这是我的假设以及原因:

  1. 一个单独的组件EventCountdownTimer。然后我可以受益于使用LifecycleObserver,但我想知道如何将信息传达回活动(我尝试在活动中扩展CountdownTimer和使用它,但出现错误并且无法编译)
  2. 就其Activity本身而言,它是最简单的,但我不确定它属于那里,因为它不是 UI 组件,我无法从中受益LifecycleObserver
  3. ViewModel. 我认为因为它与活动相关并且CountdownTimer有点逻辑数据,所以它应该放在这里,但这也意味着要观察活动的生命周期,并在其中保留任何Activity相关领域ViewModel是不好的做法。

你认为最好的选择是什么?为什么?

android android-lifecycle countdowntimer android-viewmodel

5
推荐指数
2
解决办法
2316
查看次数

当活动调用 onStop() 时,转换共享元素中断

我从带有共享元素转换的 ActivityA ActivityB 打开。它工作正常。当我按下“返回”按钮时,共享元素同样可以正常工作,并且我看到了近距离动画。

但是,如果我按下“主页”按钮,然后返回应用程序 (ActivityB),然后单击“返回”转到 ActivityA,则转换不起作用。

三个活动的情况相同。

活动A -(工作)->活动B -(工作)->活动C

之后我开始按“返回”按钮

活动C -(工作)->活动B -(不工作)->活动A

工作 - 这意味着共享元素过渡工作,我看到动画

对于开始活动,我使用

ActivityOptionsCompat options = ActivityOptionsCompat
                        .makeSceneTransitionAnimation(getActivity(), itemView, transitionName);
startActivity(intent, options.toBundle());
Run Code Online (Sandbox Code Playgroud)

尝试更改清单(不要工作)

android:name=".ActivityB"
android:launchMode="singleTask"
android:parentActivityName=".ActivityA"
Run Code Online (Sandbox Code Playgroud)

尝试保存共享元素(不要工作)

android:name=".ActivityB"
android:launchMode="singleTask"
android:parentActivityName=".ActivityA"
Run Code Online (Sandbox Code Playgroud)

我注意到在最小化应用程序后,按“返回”时不会调用 onMapSharedElements()。否则呼叫正在发生。

我猜 onStop() 调用会中断共享元素转换。但我无法避免这一点。任何帮助或想法,请

animation android android-lifecycle android-activity shared-element-transition

5
推荐指数
1
解决办法
321
查看次数

viewModelScope 未取消

在观看了Sean 在 Android (Google I/O'19) 上的解释后,我尝试了同样的方法:

init{
    viewModelScope.launch {
        Timber.i("coroutine awake")
        while (true){
            delay(2_000)
            Timber.i("another round trip")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,onCleared它在活动被终止时被调用,而不是在它被置于后台时调用(“当我们离开活动时......”,背景正在“移开”恕我直言^^)。
我得到以下输出:

> ---- Activity in Foreground
> 12:41:10.195  TEST: coroutine awake
> 12:41:12.215  TEST: another round trip
> 12:41:14.231  TEST: another round trip
> 12:41:16.245  TEST: another round trip
> 12:41:18.259  TEST: another round trip
> 12:41:20.270  TEST: another round trip
> ----- Activity in Background (on onCleared not fired)
> 12:41:22.283  TEST: another round …
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle kotlin android-viewmodel kotlin-coroutines

5
推荐指数
1
解决办法
2584
查看次数

当代码被 R8 缩小时,Android 生命周期观察者不会触发

当我使用minifyEnabled=true生命周期观察者构建代码时,不会触发任何事件。

lifecycle.addObserver(object : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    @Keep
    fun anyEvent(source: LifecycleOwner, event: Lifecycle.Event) {
        // Never triggers
        Timber.i("Source=%s, event=%s", source, event)
    }
})
Run Code Online (Sandbox Code Playgroud)

androidx.lifecycle:lifecycle版本2.2.0-rc01(以前的版本也可能会受到影响)。

compileSdkVersion28,我正在 Android 10 (API29) 模拟器上进行测试。

android proguard android-lifecycle android-r8 androidx

5
推荐指数
1
解决办法
576
查看次数

MutableLiveData setValue:Activity 的 onCreate 中的意外行为

我在玩弄 MutableLiveData 的方法来找出什么触发了观察者,什么没有。

现在,我有这个活动:

class ActivityA : AppCompatActivity() {
    private val liveData = MutableLiveData<Int>().apply { this.value = 10 }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        liveData.observe(this, Observer {
            Log.v("ActivityA", "liveData = $it")
        })
        Log.v("ActivityA", "liveData = ${liveData.value}")
        liveData.value = 11
        liveData.postValue(12)
        liveData.value = 13
    }
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

liveData = 10
liveData = 13
liveData = 12
Run Code Online (Sandbox Code Playgroud)

不应该是这个吗?

liveData = 10
liveData = 11
liveData = 13
liveData = 12
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle kotlin

5
推荐指数
1
解决办法
358
查看次数

用户交互能否在 OnResume 完成之前触发事件?

在我Fragment的一个s 中,我正在注册OnFocusChangeListener一个EditTextin onResume()

override fun onResume() {
    super.onResume()
    editText.setOnFocusChangeListener { 
        // do something here
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在注册侦听器,onResume()因为如果我将它设置在较早的生命周期方法中,它将在每次配置更改时触发。将其设置为onResume()确保在注册侦听器之前已经恢复配置更改之前存在的焦点,因此在配置更改/焦点恢复后侦听器不会自动触发。

现在我担心我注册这个监听器可能太晚了。所以我的问题是:在onResume()执行之前或执行时,用户交互是否已经导致对元素的关注?(这意味着,我会失去这个焦点事件,因为我在 期间设置了监听器onResume())。或者更一般的:onResume()在执行时是否已经可以进行用户交互?Fragment文档onResume()

当片段对用户可见并正在运行时调用。

“对用户可见”是什么意思很清楚,但“主动运行”究竟是什么意思?这是否已经意味着接受用户输入?还是在onResume()完成后首先接受用户输入?

android focus onresume android-lifecycle

5
推荐指数
1
解决办法
330
查看次数

当 Android 上的 Java 8 可用时,为什么 DefaultLifecycleObserver 优于 Lifecycle 注释?

根据Lifecycle 上Android 开发人员文档

如果您使用 Java 7 语言,则使用注释观察生命周期事件。一旦 Java 8 Language 在 Android 上成为主流,注解将被弃用,因此在DefaultLifecycleObserver注解之间,您必须始终首选DefaultLifecycleObserver.

class TestObserver implements DefaultLifecycleObserver {
     @Override
     public void onCreate(LifecycleOwner owner) {
         // your code
     }
 }
Run Code Online (Sandbox Code Playgroud)

哪些特定的 Java 8 语言/jvm 功能正在推动 Lifecycle 注释的弃用?例如,使用DefaultLifecycleObserver?时我们是否获得了更好的性能(构建或运行时)?

java android android-lifecycle java-8 android-support-library

5
推荐指数
1
解决办法
593
查看次数

onActivityCreated 弃用:如何使用 NavigationComponent 添加片段作为 MainActivity 的观察者

我刚刚看到 onActivityCreated() 将来会被弃用。我尝试实现 LifecycleOwner 和 LifecycleObserver 模式,但我不太确定我在这里做什么。

我正在使用 NavigationComponent,这意味着:

  • 我有一个主活动
  • 我有一个 MainFragment,作为主片段实例化
  • 我有多个片段可以从这个主片段访问

由于某些原因,我需要知道何时从所有这些片段(MainFragment 和子片段)创建活动

从我所看到的到现在,我需要:

  • 在主活动中,getLifecycle().addObserver(new MainFragment()). 并对所有子片段执行此操作(这是冗长的)
  • 在片段中,实现 LifecycleObserver 和
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void onCreateEvent() {
    Timber.i("%s MainActivity created", TAG);
}
Run Code Online (Sandbox Code Playgroud)

这似乎运作良好,但我有一些问题:

  1. 语法addObserver(new MainFragment()让我感到不安。看起来我们正在创建一个新的片段实例,而片段通常使用 navGraph 中定义的导航进行实例化。
  2. 正如我之前所说,如果我的 MainFragment 有 10 个子片段,我将不得不声明 11 个观察者?奇怪的
  3. 我是否必须在活动生命周期的某个时刻清除这些观察者?

实现它的正确方法是什么?

编辑 1: 回答为什么我需要知道活动何时创建的问题:我需要这个,因为我需要访问我的 MainActivity 视图模型(new ViewModelProvider(requireActivity()).get(ViewModel.class)。调用requireActivity()getActivity()我需要知道活动何时创建(使用 onActivityCreated() 很容易) )。数据绑定是用我的 MainActivity 和这个视图模型实现的。这个 Activity 的布局托管一个加载器,以显示何时执行网络请求。我可以从 MainFragment 和子片段执行请求。当我从其中一个执行请求时这些片段我需要启用这个加载器视图,当我取回数据时,我需要隐藏这个加载器。是的,所有这些片段都在图表中

android android-lifecycle android-jetpack

5
推荐指数
1
解决办法
2408
查看次数