我们今天来说的Configuration是什么呢?它就是在Android中获取系统信息的一个东西,一个APP通过Configuration可以获取一些系统信息,比如语言,键盘,横竖屏。。等等当我们每次将系统设置修改后应用都要重启以重新加载配置文件,那么我们怎么办才能防止这种情况呢?
我们首先可以修改Manifest.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.bjcaoxing.myapplication">
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我们在activity标签中加入了:
android:configChanges="keyboardHidden|orientation|screenSize"
这样我们就可以在MainActivity文件中重写onConfigurationChanged方法,这样当系统的配置改变时,就不会去重启Activity了,而是调用这个onConfigurationChanged方法:
package com.example.bjcaoxing.myapplication;
import android.app.Activity;
import android.content.res.Configuration;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import static android.R.attr.button;
public class MainActivity extends Activity {
private TextView textView1, textView2;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("onCreate", "MainActivity onCreate: 被调用");
setContentView(R.layout.activity_main);
textView1 = (TextView) findViewById(R.id.text1);
textView2 = (TextView) findViewById(R.id.text2);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Configuration cfg = getResources().getConfiguration();
String orientation = cfg.orientation == Configuration.ORIENTATION_LANDSCAPE ? "横屏" : "竖屏";
textView1.setText(orientation);
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.d("onStart", "MainActivity onStart被调用");
}
@Override
protected void onStop() {
super.onStop();
Log.d("onStop", "MainActivity onStop被调用");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("onDestroy", "MainActivity onDestroy被调用");
}
@Override
protected void onResume() {
super.onResume();
Log.d("onResume", "MainActivity onResume被调用");
}
@Override
protected void onPause() {
super.onPause();
Log.d("onPause", "MainActivity onPause被调用");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("onRestart", "MainActivity onRestart被调用");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d("onSaveInstanceState", "MainActivity onSaveInstanceState被调用");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d("onRestoreInstanceState", "MainActivity onRestoreInstanceState被调用");
}
/**
* 监听Configuration改变的事件
*
* @param newConfig
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d("onConfigurationChanged", "MainActivity onConfigurationChanged被调用");
// 用户配置修改的时候
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
//在横屏的情况下
Log.d("onConfigurationChanged", "MainActivity ORIENTATION_LANDSCAPE " + System.currentTimeMillis());
newConfig.orientation = Configuration.ORIENTATION_PORTRAIT;
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
//在竖直情况下
Log.d("onConfigurationChanged", "MainActivity ORIENTATION_PORTRAIT" + System.currentTimeMillis());
newConfig.orientation = Configuration.ORIENTATION_LANDSCAPE;
}
}
}
这是我们的MainActivity代码,我们为了检测到底是Activity重启还是应用重启我们还写了一个Application文件:
package com.example.bjcaoxing.myapplication;
import android.app.Application;
import android.content.res.Configuration;
import android.util.Log;
import android.widget.Toast;
/**
* Created by bjcaoxing on 2017/1/17.
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
//程序创建的时候执行
super.onCreate();
Log.d("onCreate", "MyApplication onCreate被调用,应用启动了");
Toast.makeText(getApplicationContext(), "MyApplication.onCreate", Toast.LENGTH_LONG).show();
}
@Override
public void onTerminate() {
// 程序终止的时候执行
Log.d("onTerminate", "MyApplication onTerminate被调用");
super.onTerminate();
}
@Override
public void onLowMemory() {
// 低内存的时候执行
Log.d("onLowMemory", "MyApplication onLowMemory被调用");
super.onLowMemory();
}
@Override
public void onTrimMemory(int level) {
// 程序在内存清理的时候执行
Log.d("onTrimMemory", "MyApplication onTrimMemory被调用");
super.onTrimMemory(level);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d("onConfigurationChanged", "MyApplication onConfigurationChanged被调用");
// 用户配置修改的时候
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
//在横屏的情况下
Log.d("onConfigurationChanged", "MyApplication ORIENTATION_LANDSCAPE " + System.currentTimeMillis());
newConfig.orientation = Configuration.ORIENTATION_PORTRAIT;
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
//在竖直情况下
Log.d("onConfigurationChanged", "MyApplication ORIENTATION_PORTRAIT" + System.currentTimeMillis());
newConfig.orientation = Configuration.ORIENTATION_LANDSCAPE;
}
}
}
最后经我们检测MyApplication的onCreate方法没有被调用,但是MyApplication的onConfigurationChanged方法却被调用了,这个我就不会了,我猜测它是Activity重启了,应用没有重启,下来我再研究一下。。。。
注:当系统的Configuration改变时,这时传感器会把这个事件向上传,——>FW——>传到应用这里时,Application在Application注册了应用的所有的组件,然后在Application里面的onConfigurationChanged其实就是一个遍历所有组件的onConfigurationChanged方法的/当然如果你没有重写onConfigurationChanged方法那么就要重启组件了。~还没有总结完,稍微记一下。