大家好 我是 菠萝派

目前我知道的有三种 日夜间模式的切换方式:

1.设置setTheme 主题用来切换

2.设置asl(Android Support Library)中的 UiMode来支持日间/夜间模式的切换

3.通过资源id的映射 回调自定义ThemeChangeListener接口来处理日间页间模式的切换

今天就介绍一下第一种方式:

效果

android日夜间模式的切换:_返回键

step1:

在values->color中设置两种颜色 一种day 一种night

step2:

在values->style中设置两种主题 依旧是day  right

设置一个自定义属性 在values->attrs->mainbackground

主要是用来替换的 在layout_xml中把backgroud设置成mainBackground

step3:

设置一下布局要把 属性需要设置进去 要在哪个界面显示就需要在哪个界面设置该属性

step4:

在activity中写逻辑

附上activity代码

package com.demoyoho.day_night_patternacativity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

/**
* @author yjh
* msg:日夜間模式的切換
* // FIXME: 2019/3/30
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private static final String TAG = "YJH";
private Button btn;
private int theme = R.style.DayAppTheme;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
/**
* 调用生命周期就会走该方法
* */
theme = savedInstanceState.getInt("theme");
setTheme(theme);
Log.e(TAG, "onCreate: savedInstanceState");
}
Log.e(TAG, "onCreate: ");
setContentView(R.layout.activity_main);
btn = findViewById(R.id.btn_theme);
btn.setOnClickListener(this);
}

@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "onResume: ");
}

@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "onStart: ");
}

@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "onStop: ");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy: ");
}

@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG, "onRestart: " );
}

@Override
public void onClick(View v) {
theme = (theme == R.style.DayAppTheme) ? R.style.NightAppTheme : R.style.DayAppTheme;
Log.e(TAG, "onClick: ");
MainActivity.this.recreate();
Log.e(TAG, "onClick: recreate");
}


@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
/**
* putInt( String key,int value)
* 将int值插入此Bundle的映射中,替换给定键的任何现有值。
*
* Bundle 就好比一个信封 里面有很多信件
* 而我们需要把信件存放到信封里 怎么存 就需要put进去
* 给每一个信件一个名字 这个名字就是这个信件
* key values
* */
outState.putInt("theme", theme);
Log.e(TAG, "onSaveInstanceState: ");
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
theme = savedInstanceState.getInt("theme");
Log.e(TAG, "onRestoreInstanceState: ");
}
}

onSaveInstanceState是用来保存UI状态的,你可以使用它保存你所想保存的东西,在Activity杀死之前,它一般在onStop或者onPause之前触发,举个列子就好比 看小说 看的看的手机自动关机了 等到重启后 点开小说 还是加载到了你看的位置 onRestoreInstanceState则是在onResume之前触发回复状态,至于复写这个方法后onCreate方法是否会被调用。

 

onSaveInstanceState实在活动被系统意外停止被销毁的时候调用

onRestoreInstanceState()在onStart() 和 onPostCreate(Bundle)之间调用。

onPostCreate(Bundle)实在onStart或者onRestoreInstanceState()之后调用的

通用生命周期流程如下:

 

正常启动 onCreate onStart onPost onCreate onResume onPostResume

 

转向下一个activity onPause onStop

 

从下一个activity返回当前(按机器返回键)onRestart onStart onResume onPostResume

 

转向上一个activity(按机器返回键)onPause onStop onDestory

屏幕待机(黑掉)onPause

 

屏幕变亮 onResume onPostResume

 

Home键退出 onPause onStop

 

Home键导航返回 onRestart onStart onResume onPostResume

 

旋转屏幕 onPause onStop onDestory onCreate onStart onPostCreate onResume onPostResume

 

onSaveInstanceState与onRestoreInstanceState参考

​https://www.jianshu.com/p/5dde143a143f​

附上源码

​https://github.com/Spider-007/Night_DatActivity​