长话短说:我目前正在开发一款小型安卓游戏。一项功能是能够更改应用程序主题。当用户更改主题时,会在整个应用程序中广播一个事件,并且所有活动活动都会调用 recreate() 来应用新主题。
问题: 假设有一堆活动:A、B、C。所有活动都将按照打开的顺序接收事件并调用 recreate()。这些是将被调用的生命周期事件(按顺序):
请注意,活动 A 或 B 都没有调用 onStop()。当这些活动返回时(例如按下后退按钮),它们变得可见时不会调用 onStart(),但会调用 onResume() 。这与活动生命周期文档中的规定相反。
问题:我在这里做错了什么吗?是否有另一种方法可以重新启动应用程序中的所有活动而不扰乱活动生命周期?
当我查看应用程序的示例代码时,我onsaveInstanceState多次遇到方法。为什么我们普遍使用它?
我为我的 Activity 和 Fragment、Presenter、ViewHolder 和 ViewModel 定义了几个基类,并定义了一个接口和 Presenter,继承这些基类的所有其他活动,在我的 BaseActivity 类和 BaseFragmentClass 中,我正在创建对象lifecycleRegistry和正在初始化它,但是当应用程序启动时,它会因错误而崩溃getLifecycle() returned null in ComponentActivity's constructor. Please make sure you are lazily constructing your Lifecycle in the first call to getLifecycle() rather than relying on field initialization.
文件:BaseFragment.java
package com.example.myapp.data.helper.base;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.CallSuper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.ViewModelProviders;
public abstract class BaseFragment<V extends MvpView, …Run Code Online (Sandbox Code Playgroud) 这是我第一次遇到这个问题。
我已经仔细研究了 SO 上的几个答案,尤其是这个和这个,但它没有解决我的问题,并且大多数答案不能用作解决我的案例的安全可靠的方法。
我已经尝试过:
onSaveInstanceState并且不调用 super但 commitAllowingStateLoss 不能用于第一种情况。
我正在寻找有关如何避免引发此异常以及如何实现引发异常的操作的解释(在第一种情况下,显示dialogFragment)。我已经知道如何引发此异常,但是,我不知道在我的情况下引发了什么。它在我的应用程序中出现两次:
第一个发生在一个非常简单的活动中,我有一个简单的动画,在该动画的末尾我显示了一个 DialogFragment (SplashActivity):
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val potentialLanguage = storage.getString(Constants.LANGUAGE)
val lang = if (potentialLanguage.isNotEmpty()) {
potentialLanguage
} else {
Locale.getDefault().language
}
val language = Language.getFromName(lang)!!
val dm = res.displayMetrics
val conf = res.configuration
conf.setLocale(Locale(language))
saveLanguage(context, lang)
// Use conf.locale = new Locale(...) if targeting lower versions
res.updateConfiguration(conf, dm)
initWarningDialog()
RevelyGradient
.radial()
.colors(
intArrayOf(
getColor(R.color.backgroundOnBoardingStart),
getColor(R.color.backgroundOnBoardingEnd)
)
)
.onBackgroundOf(root)
ivCap.animate() …Run Code Online (Sandbox Code Playgroud) 我的应用程序中有一个名为 HomeFragment 的片段。以下是它的代码:
\nimport android.Manifest\nimport android.app.Activity\nimport android.app.AlertDialog\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport androidx.lifecycle.ViewModelProvider\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.content.ContextCompat\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Observer\nimport com.example.weatherapp.R\nimport com.example.weatherapp.WeatherApplication\nimport com.example.weatherapp.utils.GPS_REQUEST_CHECK_SETTINGS\nimport com.example.weatherapp.utils.GpsUtil\nimport com.example.weatherapp.utils.SharedPreferenceHelper\nimport com.example.weatherapp.utils.observeOnce\nimport com.google.android.material.snackbar.Snackbar\nimport kotlinx.android.synthetic.main.home_fragment.view.*\n\nclass HomeFragment : Fragment() {\n\n private lateinit var homeView: View\n private var isGPSEnabled = false\n private lateinit var prefs: SharedPreferenceHelper\n\n private val viewModel by viewModels<HomeViewModel> {\n HomeViewModel.HomeFragmentViewModelFactory(\n (requireContext().applicationContext as WeatherApplication).weatherRepository,\n requireActivity().application\n )\n }\n\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n prefs = SharedPreferenceHelper.getInstance(requireContext())\n GpsUtil(requireContext()).turnGPSOn(object : GpsUtil.OnGpsListener {\n override fun gpsStatus(isGPSEnabled: Boolean) {\n this@HomeFragment.isGPSEnabled = isGPSEnabled\n …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-fragments kotlin lifecycleowner
我正在尝试在 中显示用户信息DetailActivity。因此,我请求数据并从服务器获取用户的数据。但在本例中,返回类型是Flow<User>. 让我向您展示以下代码。
ServiceApi.kt
@GET("endpoint")
suspend fun getUser(@Query("id") id: Int): Response<User>
Run Code Online (Sandbox Code Playgroud)
存储库.kt
fun getUser(id: Int): Flow<User> = flow<User> {
val userResponse = api.getUser(id = id)
if (userResponse.isSuccessful) {
val user = userResponse.body()
emit(user)
}
}
.flowOn(Dispatchers.IO)
.catch { // send error }
Run Code Online (Sandbox Code Playgroud)
详细视图模型.kt
class DetailViewModel(
private val repository : Repository
) {
val uiState: StateFlow<User> = repository.getUser(id = 369).stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = User() // empty user
)
}
Run Code Online (Sandbox Code Playgroud)
详细活动.kt
class DetailActivity: …Run Code Online (Sandbox Code Playgroud) 我一直在努力解决这个问题.
虽然我已经在Orientation Change上阅读了很多内容,但Android会杀死一个活动并将其作为一个新活动启动,而处理此活动的唯一方法是将所有内容保存在内部onSaveInstanceState()并尝试将其恢复onCreate().
但是我的活动在不同时间做了很多不同类型的网络活动,如果在执行网络活动时改变方向,我将不得不处理许多不同的复杂场景.
是否有任何简单的方法可以指向Android,当方向发生变化时,根本不需要重新绘制此活动,以便自动保存所有数据并重新使用它?
我想知道是否有类似的东西.
我一直想知道onStart()函数在android生命周期中的确切作用.网上的大多数资源只是说 - 它是在您的活动在屏幕上显示之前调用的.
但到目前为止我所做的应用程序我从未使用过onStart().我在onCreate()本身做了所有的初始化.
android生命周期中的所有其他状态都具有一些或其他意义,但onStart()的作用并不十分清楚.
在onStart()中是否有任何特定的事情要做?onStart()在生命周期中确实是必需的,因为所有初始化都可以在onCreate()中完成,并且在活动变得可见之前也会调用它.
任何人都可以帮助我清楚地了解onStart().提前致谢 :)
假设我有一个有数据对象的活动.它根据该对象更新其gui组件.现在让我们说它被暂停(OnPause被调用)但没有停止或破坏
同时,接收到推送通知(启动了intentservice),我需要使用推送通知对象更新该对象,以便在恢复应用程序时更新gui.
我考虑过向活动发送一个广播,以便它可以更新其数据对象但我在某处读到,当活动暂停时,则不会收到广播.
在这种情况下我该怎么办?
android android-contentprovider android-lifecycle android-sqlite
您能否解释一下当应用程序出现对话框时调用哪个活动生命周期方法?我很困惑它是调用onResume()还是onPause()方法.
谢谢