簡體   English   中英

請求權限后重新創建活動

[英]Activity recreated after asking permissions

這是流程:Activity -> Fragment1 -> Fragment2 -> Fragment3

我有這個帶有開關視圖的 Fragment3 -->單擊此開關時,我調用一個 viewModel 方法,該方法要求啟用此開關所需的權限。

問題是每次我請求許可並允許或拒絕時,都會重新創建活動並且 Fragment3 死掉,再次顯示第一個片段(Fragment1)

我試過使用 onSaveInstance state 但我不清楚在詢問權限而不是重新創建所有內容后如何檢索片段實例。

知道如何解決這個問題嗎?

活動:

class Activity : DaggerActivity<DaggerComponent>() {

private val viewModel: ActivityViewModel by injectionViewModels {
    activityComponent.activityViewModel
}

override fun onSafeCreate(savedInstanceState: Bundle?) {
    super.onSafeCreate(savedInstanceState)
    setContentView(R.layout.single_fragment_activity)

    if (savedInstanceState != null) {
        onRestoreInstanceState(savedInstanceState)
    } else
        observeViewModel()
}

override fun onSafeResume() {
    super.onSafeResume()
    viewModel.onCheckFeatureState()
}

private fun observeViewModel() {
    observe(viewModel.areAllPermissionsGiven) { areGiven ->
        if (areGiven) {
            replaceFragment(SettingsFragment(), R.id.fragment_container, false)
        } else {
            replaceFragment(PermissionsFragment(), R.id.fragment_container, false)
        }
    }
}}

我的片段:

class MyFragment : DaggerFragment<DaggerComponent>() {

private val viewModel: FragmentViewModel by injectionActivityViewModels {
    activityComponent.fragmentViewModel
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return inflater.inflate(R.layout.fragment, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    initialize()
}

private fun initialize() {
    viewModel.onViewCreated()
    toolbar.setNavigationOnClickListener { activity?.onBackPressed() }
    initViews()
    initObservables()
}

private fun initViews() {
    switch.onClick {
        viewModel.onToggleMonitoringSecurityClick()
    }
}

private fun initObservables() {
    observe(viewModel.state) { state ->
        switch.isChecked = state.isEnabled
        switchText.isGone = state.hasPermission
    }
}}

我用來請求許可並使用共享首選項啟用該功能的代碼:

class Option @AssistedInject constructor(
@Assisted private val permission: Permission,
@Assisted private val dataSource: DataSource,
private val permissionStatus: GetPermissionStatusUseCase,
private val permissionRequest: RequestPermissionUseCase) {
fun isEnabled() = dataSource.isEnabled && hasPermission

suspend fun enable() = withContext(Dispatchers.IO) {
    val enable = hasPermission || (permissionRequest(permission) is Response.Success)

    if (enable) {
        dataSource.isEnabled = true
    }

    enable
}

fun disable() {
    dataSource.isEnabled = false
}

suspend fun toggle() {
    if (isEnabled()) {
        disable()
    } else {
        enable()
    }
}

val hasPermission
    get() = permissionStatus.invoke(permission) == PermissionStatus.ENABLED

@AssistedInject.Factory
interface Factory {
    fun create(permission: Permission, dataSource: DataSource): Option
}}

我在一個 useCase 上使用上面的域 object 代碼,它向 viewModel 提供是否有權限的返回值。

這就是我解決問題的方法:

在清單中為活動添加此行

android:launchMode="singleTop"

例如:

<activity
    android:name=".Activity"
    android:label="@string/my_activity"
    android:launchMode="singleTop"
</activity>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM