Sobes.tech
Junior

Чаро фаъолият ҳангоми гардондани экран дубора сохта мешавад?

sobes.tech AI

Ҷавоб аз AI

Ҳангоми гардондани экран, конфигуратсияи дастгоҳ тағйир меёбад, масалан, самт. Android ба ин таваҷҷӯҳ мекунад, ки фаъолиятро нобуд мекунад ва дубора месозад, то тағйиротҳои заруриро дар захираҳо, мисоли файлҳои layout, ки барои самт портрет ё манзилӣ махсусанд, татбиқ кунад.

Вақти ҳаёти фаъолият ҳангоми гардондан:

  1. onPause()
  2. onStop()
  3. onDestroy()
  4. Системаи нав намунаи фаъолиятро месозад.
  5. onCreate()
  6. onStart()
  7. onResume()

Барои нигоҳ доштани маълумоти ҳолат пеш аз нобуд кардани фаъолият истифода мешаванд:

  • onSaveInstanceState(): маълумоти хурдро дар Bundle нигоҳ медорад.

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putString("myKey", "myValue") // нигоҳдории маълумот
    }
    

    Бозгашт дар onCreate() ё onRestoreInstanceState():

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
        if (savedInstanceState != null) {
            val myValue = savedInstanceState.getString("myKey") // барқарорсозии маълумот
        }
        // ...
    }
    
  • ViewModel: Маълумотро дар давоми тамоми давраи ҳаёти UI-ҳоким (Activity/Fragment) нигоҳ медорад, ҳатто дар ҳолати тағйирёбии конфигуратсия. ViewModel нобудшавии фаъолиятро паси сар мекунад ва ҳолати худро намебозад.

    class MyViewModel : ViewModel() {
        var counter = 0
    }
    

    Истифода дар фаъолият/фрагмент:

    class MyActivity : AppCompatActivity() {
        private lateinit var viewModel: MyViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
            // Акнун viewModel.counter ҳангоми гардондан нигоҳ дошта мешавад
        }
    }
    
  • Ҳифз кардани маълумот дар SharedPreferences ё базаи додаҳо барои маълумоти бештар устувор.

Барои пешгирӣ кардани навсозии фаъолият ҳангоми гардондани экран, метавонед эълон кунед, ки фаъолият худи тағйиротҳои конфигурацияро идора мекунад. Ин дар манифест бо илова кардани configChanges="orientation|screenSize|screenLayout" ба теги <activity> анҷом дода мешавад:

<activity android:name=".MyActivity"
          android:configChanges="orientation|screenSize|screenLayout">
</activity>

Дар ин ҳолат, ба ҷои навсозии фаъолият, методи onConfigurationChanged() даъват мешавад:

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    // Ҳолати тағйирёбии конфигуратсияро дастӣ идора кунед
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // Логика барои манзилӣ
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        // Логика барои портрет
    }
}

Истифодаи configChanges мутобиқ нест дар аксари ҳолатҳо, зеро метавонад ба мушкилот дар идоракунии ҳолат ва захираҳо дар тағйиротҳои гуногуни конфигурация оварда расонад. Роҳи беҳтар истифодаи ViewModel барои нигоҳ доштани маълумоти ҳолат мебошад.